📄 colorpane.cpp
字号:
// ColorPane.cpp : implementation file
//
#include "stdafx.h"
#include "Drawing.h"
#include "ColorPane.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CColorPane
CColorPane::CColorPane()
{
pick = oldmovepick = -1;
_col = 0;
}
CColorPane::~CColorPane()
{
}
COLORREF CColorPane::GetColor()
{
//默认为黑色
if(pick<-1 || pick>27)
return _col;
else if(pick == -1)
return col[0];
else
return col[pick];
}
BEGIN_MESSAGE_MAP(CColorPane, CToolBar)
//{{AFX_MSG_MAP(CColorPane)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CColorPane message handlers
COLORREF CColorPane::col[28] = {
RGB(0, 0, 0), RGB(255, 255, 255), RGB(128, 128, 128), RGB(192, 192, 192),
RGB(128, 0, 0), RGB(255, 0, 0), RGB(128, 128, 64), RGB(255, 255, 0),
RGB(0, 128, 0), RGB(128, 255, 0), RGB(0, 128, 128), RGB(0, 255, 255),
RGB(0, 0, 128), RGB(0, 0, 255), RGB(128, 0, 128), RGB(255, 0, 255),
RGB(128, 128, 0), RGB(255, 255, 128), RGB(0, 64, 64), RGB(128, 255, 128),
RGB(0, 128, 255), RGB(128, 255, 255), RGB(0, 64, 128), RGB(128, 128, 255),
RGB(0, 0, 255), RGB(255, 0, 128), RGB(128, 64, 64), RGB(255, 128, 64)
};
void CColorPane::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rc;
GetClientRect(&rc);
//28个矩形位置的初始化
static int i_rect = 0;
if(i_rect == 0)
{
i_rect++;
for(int i=0; i<14; i++)
{
rs[2*i].left = rc.left+50+i*23; rs[2*i].right = rs[2*i].left+17;
rs[2*i].top = rc.top+5; rs[2*i].bottom = rs[2*i].top+17;
rs[2*i+1].left = rc.left+50+i*23; rs[2*i+1].right = rs[2*i+1].left+17;
rs[2*i+1].top = rc.top+28; rs[2*i+1].bottom = rs[2*i+1].top+17;
}
}
//画出左边的大矩形框,显示所选颜色用
dc.Draw3dRect(rc.left+5, rc.top+5, 43, 43, RGB(0, 0, 0), RGB(255, 255, 255));
static int first = 0;
CPen pen(PS_SOLID, 1, GetColor());
CBrush bru(GetColor());
dc.SelectObject(&pen);
dc.SelectObject(&bru);
dc.Rectangle(rc.left+5+1, rc.top+5+1, rc.left+5+1+41, rc.top+5+1+41);
//画出每一个小颜色矩形框
CPen Pen(PS_SOLID, 1, RGB(255, 255, 255));
dc.SelectObject(&Pen);
for(int i=0; i<14; i++)
{
dc.Draw3dRect(rs[2*i].left, rs[2*i].top, 17, 17, RGB(0, 0, 0), RGB(255, 255, 255));
CPen PenTmp1(PS_SOLID, 1, col[2*i]);
CBrush BruTmp1(col[2*i]);
dc.SelectObject(&PenTmp1);
dc.SelectObject(&BruTmp1);
dc.Rectangle(rc.left+50+i*23+1, rc.top+5+1, rc.left+50+i*23+1+15, rc.top+5+1+15);
dc.Draw3dRect(rs[2*i+1].left, rs[2*i+1].top, 17, 17, RGB(0, 0, 0), RGB(255, 255, 255));
CPen PenTmp2(PS_SOLID, 1, col[2*i+1]);
CBrush BruTmp2(col[2*i+1]);
dc.SelectObject(&PenTmp2);
dc.SelectObject(&BruTmp2);
dc.Rectangle(rc.left+50+i*23+1, rc.top+28+1, rc.left+50+i*23+1+15, rc.top+28+1+15);
//小颜色矩形框间隙用白线画出的效果
if(i<13)
{
dc.SelectObject(&Pen);
dc.MoveTo(rc.left+50+17+i*23+2, rc.top+5);
dc.LineTo(rc.left+50+i*23+17+2, rc.top+5+40);
}
}
//小颜色矩形框间隙用白线画出的效果
dc.SelectObject(&Pen);
dc.MoveTo(rc.left+50, rc.top+5+17+2);
dc.LineTo(rc.left+50+(14-1)*23+17, rc.top+5+17+2);
//画出"更多颜色..."按纽
dc.Draw3dRect(rc.left+50+(14-1)*23+17+5, rc.top+10, 90, 30, RGB(255, 255, 255), RGB(0, 0, 0));
CPen Pen0(PS_SOLID, 1, RGB(0, 0, 0));
dc.SelectObject(&Pen0);
dc.SetBkMode(TRANSPARENT);
dc.TextOut(rc.left+50+(14-1)*23+17+10+1, rc.top+10+6, "更多颜色...");
// Do not call CToolBar::OnPaint() for painting messages
}
//鼠标移动时消息处理,主要是用焦点显示正选择的颜色矩形
void CColorPane::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
if(oldmovepick != -1)
{
CPen pen(PS_SOLID, 1, col[oldmovepick]);
CBrush bru(col[oldmovepick]);
dc.SelectObject(&pen);
dc.SelectObject(&bru);
CRect r = rs[oldmovepick];
r.DeflateRect(1, 1, 1, 1);
dc.Rectangle(&r);
oldmovepick = -1;
}
for(int i=0; i<28; i++)
{
if(rs[i].PtInRect(point))
{
CPen pen(PS_DOT , 1, RGB(255, 0, 0));
CBrush bru(col[i]);
dc.SelectObject(&pen);
dc.SelectObject(&bru);
CRect r = rs[i];
r.DeflateRect(1, 1, 1, 1);
//dc.SetBkMode(TRANSPARENT);
dc.Rectangle(&r);
oldmovepick = i;
}
}
CToolBar::OnMouseMove(nFlags, point);
}
//鼠标点选的颜色矩形或者按纽
void CColorPane::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CRect rc;
GetClientRect(&rc);
for(int i=0; i<28; i++)
{
if(rs[i].PtInRect(point))
{
pick = i;
break;
}
}
if(pick>-1 && pick<28)
{
CPen pen(PS_SOLID, 1, col[pick]);
CBrush bru(col[pick]);
dc.SelectObject(&pen);
dc.SelectObject(&bru);
dc.Rectangle(rc.left+5+1, rc.top+5+1, rc.left+5+1+41, rc.top+5+1+41);
}
CRect rt(rc.left+50+(14-1)*23+17+5, rc.top+10, rc.left+50+(14-1)*23+17+5+90, rc.top+10+30);
if(rt.PtInRect(point))
{
CColorDialog dlg;
int temp = dlg.DoModal();
COLORREF c(dlg.GetColor());
dc.Draw3dRect(rc.left+50+(14-1)*23+17+5, rc.top+10, 90, 30, RGB(255, 255, 255), RGB(0, 0, 0));
if(temp==IDOK)
{
_col = c;
pick = -10;
CPen pen(PS_SOLID, 1, c);
CBrush bru(c);
dc.SelectObject(&pen);
dc.SelectObject(&bru);
dc.Rectangle(rc.left+5+1, rc.top+5+1, rc.left+5+1+41, rc.top+5+1+41);
}
}
else
dc.Draw3dRect(rc.left+50+(14-1)*23+17+5, rc.top+10, 90, 30, RGB(255, 255, 255), RGB(0, 0, 0));
CToolBar::OnLButtonUp(nFlags, point);
}
void CColorPane::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CRect rc;
GetClientRect(&rc);
CRect rt(rc.left+50+(14-1)*23+17+5, rc.top+10, rc.left+50+(14-1)*23+17+5+90, rc.top+10+30);
if(rt.PtInRect(point))
dc.Draw3dRect(rc.left+50+(14-1)*23+17+5, rc.top+10, 90, 30, RGB(0, 0, 0), RGB(255, 255, 255));
CToolBar::OnLButtonDown(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -