先看看TM2008的皮肤调色板:
![](http://www.shenjk.com/webedit/UploadFile/2008221113120197.jpg)
虽然简单,也还是很漂亮的。
接下来,我将一步一步去(非完全)实现该调色板。
建立MFC工程
添加:
typedef struct {
COLORREF crColour;
TCHAR *szName;
} ColourTableEntry;
新建类 CColorPanel 继承CWnd;给该类添加一个变量:CRect m_WindowRect;用于保存该面板的大小;在添加CWnd* m_pParent; 用于保存父窗体指针。添加静态变量:
static ColourTableEntry m_crColours[];
ColourTableEntry CColorPanel::m_crColours[] ={
{RGB(147,210,247), _T("Blue") },
{RGB(137,184,224), _T("GrayBlue") },
{RGB(189,103,234), _T("Purple") },
{RGB(110,196,70), _T("Green") },
{RGB(233,173,112), _T("YellowBrown")},
{RGB(198,94,59), _T("Brown") },
{RGB(203,73,156), _T("Violet") },
{RGB(147,147,147), _T("Gray") }
};
我们再为该类添加一个新的构造函数:CColorPanel(CPoint p, CWnd *pParentWnd, COLORREF crColour)
所有代码如下:
ColorPanel.cpp
//
ColorPanel.cpp : implementation file
//
#include
"
stdafx.h
"
#include
"
DoodlePanel.h
"
#include
"
ColorPanel.h
"
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#ifdef _DEBUG
#define
new DEBUG_NEW
#undef
THIS_FILE
static
char
THIS_FILE[]
=
__FILE__;
#endif
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/////
//
CColorPanel
CColorPanel::CColorPanel()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
}
CColorPanel::CColorPanel(CPoint p, CWnd
*
pParentWnd, COLORREF crColour)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
m_nBoxSize=20;
CColorPanel::Create(p,pParentWnd,crColour);
}
CColorPanel::
~
CColorPanel()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
BEGIN_MESSAGE_MAP(CColorPanel, CWnd)
//
{{AFX_MSG_MAP(CColorPanel)
ON_WM_PAINT()
ON_WM_ACTIVATEAPP()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
//
}}AFX_MSG_MAP
END_MESSAGE_MAP()
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
ColourTableEntry CColorPanel::m_crColours[]
=
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{RGB(147,210,247), _T("Blue") },
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{RGB(137,184,224), _T("GrayBlue") },
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{RGB(189,103,234), _T("Purple") },
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{RGB(110,196,70), _T("Green") },
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{RGB(233,173,112), _T("YellowBrown")},
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{RGB(198,94,59), _T("Brown") },
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{RGB(203,73,156), _T("Violet") },
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{RGB(147,147,147), _T("Gray") }
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/////
//
CColorPanel message handlers
//
创建调色板
BOOL CColorPanel::Create(CPoint p, CWnd
*
pParentWnd, COLORREF crColour)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
ASSERT(pParentWnd && ::IsWindow(pParentWnd->GetSafeHwnd()));
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
m_pParent=pParentWnd;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
CString szClassName=AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|CS_HREDRAW|CS_VREDRAW,
0,
(HBRUSH)(COLOR_BTNFACE+1),
0
);
if(!CWnd::CreateEx(0,szClassName,_T(""),WS_VISIBLE|WS_POPUP,
p.x,p.y,115,120,
pParentWnd->GetSafeHwnd(),0,NULL
))
return FALSE;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//面板保存大小
CRect rect;
GetWindowRect(rect);
m_WindowRect.SetRect(rect.left, rect.top, rect.right,rect.bottom);
//CClientDC dc(this);
//DrawSliderBar(&dc,0);
CreateToolTips();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SetCapture();
return TRUE;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CColorPanel::OnPaint()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CWnd::OnPaint() for painting messages
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//绘制面板边框
CRect rect;
GetClientRect(rect);
//dc.DrawEdge(rect, EDGE_RAISED, BF_RECT);
//Top Line
dc.FillSolidRect(rect,RGB(37,135,14));
dc.FillSolidRect(rect.left+1,rect.top+1,rect.Width()-2,rect.Height()-2,RGB(211,236,185));
dc.FillSolidRect(rect.left+2, rect.top+2,rect.Width()-4, rect.Height()-4,RGB(189,237,176));
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
for(int i=0;i<8;i++)
DrawCell(&dc,i);
// for(i=0;i<3;i++)
// DrawSliderBar(&dc,i);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CColorPanel::OnActivateApp(BOOL bActive, HTASK hTask)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
CWnd::OnActivateApp(bActive, hTask);
// TODO: Add your message handler code here
if(!bActive)
DestroyWindow();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CColorPanel::OnLButtonUp(UINT nFlags, CPoint point)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// TODO: Add your message handler code here and/or call default
CWnd::OnLButtonUp(nFlags, point);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
DWORD pos = GetMessagePos();
point = CPoint(LOWORD(pos), HIWORD(pos));
if(!m_WindowRect.PtInRect(point))
DestroyWindow();
}
//
绘制默认色块
void
CColorPanel::DrawCell(CDC
*
pDC,
int
nIndex)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
CRect rect;
if(!GetCellRect(nIndex,rect))return;
pDC->FillSolidRect(rect,RGB(0,0,0));
pDC->FillSolidRect(rect.left+1,rect.top+1,rect.Width()-2,rect.Height()-2,m_crColours[nIndex].crColour);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
BOOL CColorPanel::GetCellRect(
int
nIndex,
const
LPRECT
&
rect)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if (nIndex < 0 || nIndex >= 8)
return FALSE;
rect->top=nIndex<=3?5:30;
rect->top+=5;
rect->bottom=rect->top+m_nBoxSize;
rect->left=5*(nIndex+1)+m_nBoxSize*nIndex;
if(nIndex>3)
rect->left-=100;
rect->left+=5;
rect->right=rect->left+m_nBoxSize;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
return TRUE;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
BOOL CColorPanel::PreTranslateMessage(MSG
*
pMsg)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// TODO: Add your specialized code here and/or call the base class
m_ToolTip.RelayEvent(pMsg);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (GetCapture()->GetSafeHwnd() != m_hWnd)...{
SetCapture();
}
return CWnd::PreTranslateMessage(pMsg);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CColorPanel::CreateToolTips()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if (!m_ToolTip.Create(this)) return;
// Add a tool for each cell
for (int i = 0; i < 8; i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
CRect rect;
if (!GetCellRect(i, rect)) continue;
m_ToolTip.AddTool(this, m_crColours[i].szName, rect, 1);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CColorPanel::OnMouseMove(UINT nFlags, CPoint point)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// TODO: Add your message handler code here and/or call default
CWnd::OnMouseMove(nFlags, point);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CColorPanel::DrawSliderBar(CDC
*
pDc,
int
nRGB)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
CRect rect;
if(!GetSilderRGBRect(nRGB,rect))
return;
m_rSlider.Create(WS_CHILD|WS_VISIBLE,rect,this,123);
// pDc->FillSolidRect(rect.left,rect.top-1,rect.Width(),rect.Height(),::GetSysColor(COLOR_3DSHADOW));
// pDc->FillSolidRect(rect,::GetSysColor(COLOR_3DHILIGHT));
// pDc->FillSolidRect(rect.left,rect.top+1,rect.Width(),rect.Height(),::GetSysColor(COLOR_3DSHADOW));
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
BOOL CColorPanel::GetSilderRGBRect(
int
nRGB,
const
LPRECT
&
rect)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(nRGB<0 || nRGB>=3)
return FALSE;
rect->left=10;
rect->right=105;
rect->top=(nRGB+1)*15+50;
rect->bottom=rect->top+20;
return TRUE;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
ColorPanel.h
#if
!defined(AFX_COLORPANEL_H__6AC0AF39_0C13_4238_8018_82651474D77E__INCLUDED_)
#define
AFX_COLORPANEL_H__6AC0AF39_0C13_4238_8018_82651474D77E__INCLUDED_
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#if
_MSC_VER > 1000
#pragma
once
#endif
//
_MSC_VER > 1000
//
ColorPanel.h : header file
//
#include
"
NewSlider.h
"
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/////
//
CColorPanel window
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
typedef
struct
...
{
COLORREF crColour;
TCHAR *szName;
}
ColourTableEntry;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
class
CColorPanel :
public
CWnd
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// Construction
public:
CColorPanel();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Attributes
public:
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Operations
public:
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CColorPanel)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
//}}AFX_VIRTUAL
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Implementation
public:
CColorPanel(CPoint p, CWnd *pParentWnd, COLORREF crColour);
virtual ~CColorPanel();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Generated message map functions
protected:
CNewSlider m_rSlider;
BOOL GetSilderRGBRect(int nRGB,const LPRECT &rect);
void DrawSliderBar(CDC* pDc,int nRGB);
void CreateToolTips();
CToolTipCtrl m_ToolTip;
int m_nBoxSize;
BOOL GetCellRect(int nIndex, const LPRECT& rect);
void DrawCell(CDC* pDC, int nIndex);
static ColourTableEntry m_crColours[];
CRect m_WindowRect;
CWnd* m_pParent;
BOOL Create(CPoint p, CWnd *pParentWnd, COLORREF crColour);
//{{AFX_MSG(CColorPanel)
afx_msg void OnPaint();
afx_msg void OnActivateApp(BOOL bActive, HTASK hTask);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/////
//
{{AFX_INSERT_LOCATION}}
//
Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif
//
!defined(AFX_COLORPANEL_H__6AC0AF39_0C13_4238_8018_82651474D77E__INCLUDED_)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
Demo:
CRect rect;
m_btnTest.GetWindowRect(rect);
new
CColorPanel(CPoint(rect.left,rect.bottom),
this
,RGB(
255
,
0
,
0
));
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
demo效果:![](http://www.shenjk.com/webedit/UploadFile/2008221121150753.jpg)