📄 colorbar.cpp
字号:
// MainDialogBar.cpp : implementation file
//
#include "stdafx.h"
#include "geditor.h"
#include "ColorBar.h"
#include "geditordoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainDialogBar dialog
CColorBar::CColorBar(CWnd* pParent /*=NULL*/)
: CDialogBar()
{
//{{AFX_DATA_INIT(CColorBar)
//}}AFX_DATA_INIT
m_curColor = RGB(0,0,0);
//Initially, the foreground color is 0(black)
/* The initial 20 colors in the color bar are defined as the Windows
20 static colors.
*/
m_colorArr[0].peRed=0, m_colorArr[0].peGreen=0, m_colorArr[0].peBlue=0;
m_colorArr[1].peRed=0x80, m_colorArr[1].peGreen=0, m_colorArr[1].peBlue=0;
m_colorArr[2].peRed=0, m_colorArr[2].peGreen=0x80, m_colorArr[2].peBlue=0;
m_colorArr[3].peRed=0x80, m_colorArr[3].peGreen=0x80, m_colorArr[3].peBlue=0;
m_colorArr[4].peRed=0, m_colorArr[4].peGreen=0, m_colorArr[4].peBlue=0x80;
m_colorArr[5].peRed=0x80, m_colorArr[5].peGreen=0, m_colorArr[5].peBlue=0x80;
m_colorArr[6].peRed=0, m_colorArr[6].peGreen=0x80, m_colorArr[6].peBlue=0x80;
m_colorArr[7].peRed=0xC0, m_colorArr[7].peGreen=0xC0, m_colorArr[7].peBlue=0xC0;
m_colorArr[8].peRed=0xC0, m_colorArr[8].peGreen=0xDC, m_colorArr[8].peBlue=0xC0;
m_colorArr[9].peRed=0xA6, m_colorArr[9].peGreen=0xCA, m_colorArr[9].peBlue=0xF0;
m_colorArr[10].peRed=0xFF, m_colorArr[10].peGreen=0xFB, m_colorArr[10].peBlue=0xF0;
m_colorArr[11].peRed=0xA0, m_colorArr[11].peGreen=0xA0, m_colorArr[11].peBlue=0xA4;
m_colorArr[12].peRed=0x80, m_colorArr[12].peGreen=0x80, m_colorArr[12].peBlue=0x80;
m_colorArr[13].peRed=0xFF, m_colorArr[13].peGreen=0, m_colorArr[13].peBlue=0;
m_colorArr[14].peRed=0, m_colorArr[14].peGreen=0xFF, m_colorArr[14].peBlue=0;
m_colorArr[15].peRed=0xFF, m_colorArr[15].peGreen=0xFF, m_colorArr[15].peBlue=0;
m_colorArr[16].peRed=0, m_colorArr[16].peGreen=0, m_colorArr[16].peBlue=0xFF;
m_colorArr[17].peRed=0xFF, m_colorArr[17].peGreen=0, m_colorArr[17].peBlue=0xFF;
m_colorArr[18].peRed=0, m_colorArr[18].peGreen=0xFF, m_colorArr[18].peBlue=0xFF;
m_colorArr[19].peRed=0xFF, m_colorArr[19].peGreen=0xFF, m_colorArr[19].peBlue=0xFF;
}
void CColorBar::DoDataExchange(CDataExchange* pDX)
{
CDialogBar::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMainDialogBar)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CColorBar, CDialogBar)
//{{AFX_MSG_MAP(CMainDialogBar)
ON_WM_PAINT()
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMainDialogBar message handlers
void CColorBar::ComputeRect()
{
RECT rect;
GetClientRect(&rect);
int width=(rect.right-rect.left)/2;
m_repaintRect.left = width-20;
m_repaintRect.right = width + 20;
m_repaintRect.top = 10;
m_repaintRect.bottom = m_repaintRect.top+36;
m_colorRect.left=width-BLOCKWIDTH-1;
m_colorRect.top= m_repaintRect.bottom+BLOCKHEIGHT/2;
m_colorRect.right= m_colorRect.left+2*BLOCKWIDTH+1;
m_colorRect.bottom = m_colorRect.top+10*BLOCKHEIGHT+9;
}
void CColorBar::OnPaint()
{
CPaintDC dc(this); // device context for painting
int i;
RECT rect;
CBrush brush,*oldbrush;
GetClientRect(&rect);
DrawConvexLine(&dc,&rect); //border line
ComputeRect();
DrawConcaveBorder(&dc,&m_repaintRect);
rect.top= m_repaintRect.top+14;
rect.left= m_repaintRect.left+15;
rect.bottom=rect.top+18;
rect.right=rect.left+20;
dc.FillSolidRect(&rect,RGB(255,255,255));
DrawConvexBorder(&dc,&rect);
rect.top= m_repaintRect.top+4;
rect.left= m_repaintRect.left+5;
rect.bottom=rect.top+18;
rect.right=rect.left+20;
brush.CreateSolidBrush(m_curColor);
oldbrush=dc.SelectObject(&brush);
dc.FillRect(&rect,&brush);
dc.SelectObject(oldbrush);
brush.DeleteObject();
DrawConvexBorder(&dc,&rect);
rect.top = m_colorRect.top-BLOCKHEIGHT-1;
for (i=0;i<20;i++) {
if (i%2==0) {
rect.left= m_colorRect.left;
rect.top+=BLOCKHEIGHT+1;
}
else
rect.left=m_colorRect.right-BLOCKWIDTH;
rect.right=rect.left+BLOCKWIDTH;
rect.bottom=rect.top+BLOCKHEIGHT;
brush.CreateSolidBrush(RGB(m_colorArr[i].peRed,
m_colorArr[i].peGreen,m_colorArr[i].peBlue));
oldbrush=dc.SelectObject(&brush);
dc.FillRect(&rect,&brush);
dc.SelectObject(oldbrush);
brush.DeleteObject();
DrawConcaveBorder(&dc,&rect);
}
// Do not call CDialogBar::OnPaint() for painting messages
}
void CColorBar::DrawConcaveBorder(CPaintDC *dc, RECT *rect)
{
CPen pen,*oldpen;
pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
oldpen=dc->SelectObject(&pen);
dc->MoveTo(rect->right,rect->top);
dc->LineTo(rect->left,rect->top);
dc->LineTo(rect->left,rect->bottom);
dc->SelectObject(oldpen);
pen.DeleteObject();
pen.CreatePen(PS_SOLID,1,RGB(255,255,255));
oldpen=dc->SelectObject(&pen);
dc->MoveTo(rect->right,rect->top);
dc->LineTo(rect->right,rect->bottom);
dc->LineTo(rect->left,rect->bottom);
dc->SelectObject(oldpen);
pen.DeleteObject();
}
void CColorBar::DrawConvexBorder(CPaintDC *dc, RECT *rect)
{
CPen pen,*oldpen;
pen.CreatePen(PS_SOLID,1,RGB(255,255,255));
oldpen=dc->SelectObject(&pen);
dc->MoveTo(rect->right,rect->top);
dc->LineTo(rect->left,rect->top);
dc->LineTo(rect->left,rect->bottom);
dc->SelectObject(oldpen);
pen.DeleteObject();
pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
oldpen=dc->SelectObject(&pen);
dc->MoveTo(rect->right,rect->top);
dc->LineTo(rect->right,rect->bottom);
dc->LineTo(rect->left,rect->bottom);
dc->SelectObject(oldpen);
pen.DeleteObject();
}
void CColorBar::DrawConvexLine(CPaintDC *dc, RECT *rect)
{
CPen pen,*oldpen;
pen.CreatePen(PS_SOLID,1,RGB(128,128,128));
oldpen=dc->SelectObject(&pen);
dc->MoveTo(rect->left,rect->top);
dc->LineTo(rect->right,rect->top);
dc->SelectObject(oldpen);
pen.DeleteObject();
pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
oldpen=dc->SelectObject(&pen);
dc->MoveTo(rect->left,rect->top+1);
dc->LineTo(rect->right,rect->top+1);
dc->SelectObject(oldpen);
pen.DeleteObject();
pen.CreatePen(PS_SOLID,1,RGB(128,128,128));
oldpen=dc->SelectObject(&pen);
dc->MoveTo(rect->left,rect->bottom-2);
dc->LineTo(rect->right,rect->bottom-2);
dc->SelectObject(oldpen);
pen.DeleteObject();
pen.CreatePen(PS_SOLID,1,RGB(255,255,255));
oldpen=dc->SelectObject(&pen);
dc->MoveTo(rect->left,rect->bottom-1);
dc->LineTo(rect->right,rect->bottom-1);
dc->SelectObject(oldpen);
pen.DeleteObject();
}
void CColorBar::OnLButtonDblClk(UINT nFlags, CPoint point)
{
if (m_colorRect.PtInRect(point))
{
POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition( );
CDocTemplate* docTemplate = AfxGetApp()->GetNextDocTemplate(pos);
ASSERT_VALID(docTemplate);
pos = docTemplate->GetFirstDocPosition( );
CGeditorDoc* pDoc = (CGeditorDoc*)docTemplate->GetNextDoc(pos);
ASSERT_VALID(pDoc);
CColorDialog ColorDlg(m_curColor,0,NULL);
if (ColorDlg.DoModal()==IDOK)
{
m_curColor=ColorDlg.GetColor();
pDoc->m_curColor = m_curColor;
int i=(point.y - m_colorRect.top)/(BLOCKHEIGHT+1);
int j=(point.x - m_colorRect.left)/(BLOCKWIDTH+1);
int index=i*2+j;
m_colorArr[index].peRed= m_curColor & 0x000000FF;
m_colorArr[index].peGreen = (m_curColor & 0x0000FF00)>>8;
m_colorArr[index].peBlue = (m_curColor & 0x00FF0000)>>16;
Invalidate();
}//end of if
}//end of if
}
void CColorBar::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_colorRect.PtInRect(point))
{
POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition( );
CDocTemplate* docTemplate = AfxGetApp()->GetNextDocTemplate(pos);
ASSERT_VALID(docTemplate);
pos = docTemplate->GetFirstDocPosition( );
CGeditorDoc* pDoc = (CGeditorDoc*)docTemplate->GetNextDoc(pos);
ASSERT_VALID(pDoc);
int i=(point.y - m_colorRect.top)/(BLOCKHEIGHT+1);
int j=(point.x - m_colorRect.left)/(BLOCKWIDTH+1);
int index=i*2+j;
m_curColor=RGB(m_colorArr[index].peRed,m_colorArr[index].peGreen,
m_colorArr[index].peBlue);
pDoc->m_curColor= m_curColor;
InvalidateRect(&m_repaintRect);
}//end of if
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -