用VC写了个颜色选取框,仿Office风格,没用MFC什么的框架,调用很简单指定显示位置POINT和默认颜色就可以<!--作者:彭国辉 http://blog.csdn.net/nhconch-->,如:
POINT pt;
pt.x = 100; pt.y = 100;
CColorPicker *clrpk = new CColorPicker(&pt, HexClr(0xFF0000));
效果图:
代码:
ColorPicker.h
#define
HexClr(rgb)((DWORD)(rgb>>16)|(rgb&0xFF00)|((rgb&0xFF)<<16))
#define COLORPICKERWINNAME"ColorPickerWin"
#define WM_COLORSELECTEDWM_USER+2938
static DWORDColorMap[ 5 ][ 8 ] =
... {
...{HexClr(0x000000),HexClr(0x993300),HexClr(0x333300),HexClr(0x003300),HexClr(0x003366),HexClr(0x000080),HexClr(0x333399),HexClr(0x333333)},
...{HexClr(0x800000),HexClr(0xFF6600),HexClr(0x808000),HexClr(0x008000),HexClr(0x008080),HexClr(0x0000FF),HexClr(0x666699),HexClr(0x808080)},
...{HexClr(0xFF0000),HexClr(0xFF9900),HexClr(0x99CC00),HexClr(0x008080),HexClr(0x33CCCC),HexClr(0x3366FF),HexClr(0x800080),HexClr(0x999999)},
...{HexClr(0xFF00FF),HexClr(0xFFCC00),HexClr(0xFFFF00),HexClr(0x00FF00),HexClr(0x00FFFF),HexClr(0x00CCFF),HexClr(0x993366),HexClr(0xC0C0C0)},
...{HexClr(0xFF99CC),HexClr(0xFFCC99),HexClr(0xFFFF99),HexClr(0xCCFFCC),HexClr(0xCCFFFF),HexClr(0x99CCFF),HexClr(0xCC99FF),HexClr(0xFFFFFF)}
} ;
class CColorPicker
... {
public:
HINSTANCEm_hInstance;//debug
CColorPicker(POINT*pt,DWORDDefaultColor);
~CColorPicker();
HWNDGetHwnd();
DWORDGetColor();
voidOnPaint();
voidOnLButtonDown(longx,longy);
voidOnLButtonUp(longx,longy);
voidOnMouseMove(longx,longy);
private:
HWNDm_hwnd;
DWORDm_Color;
bytem_HotRow,m_HotCol;
boolm_bCustomColor;
boolm_bMouseDown;
voidCreateColorPicker(POINT*pt);
voidDraw(HDChdc,byterow,bytecol,boolhot,bytecorrection);
voidReDraw(byterow,bytecol,boolhot);
} ;
#define COLORPICKERWINNAME"ColorPickerWin"
#define WM_COLORSELECTEDWM_USER+2938
static DWORDColorMap[ 5 ][ 8 ] =
... {
...{HexClr(0x000000),HexClr(0x993300),HexClr(0x333300),HexClr(0x003300),HexClr(0x003366),HexClr(0x000080),HexClr(0x333399),HexClr(0x333333)},
...{HexClr(0x800000),HexClr(0xFF6600),HexClr(0x808000),HexClr(0x008000),HexClr(0x008080),HexClr(0x0000FF),HexClr(0x666699),HexClr(0x808080)},
...{HexClr(0xFF0000),HexClr(0xFF9900),HexClr(0x99CC00),HexClr(0x008080),HexClr(0x33CCCC),HexClr(0x3366FF),HexClr(0x800080),HexClr(0x999999)},
...{HexClr(0xFF00FF),HexClr(0xFFCC00),HexClr(0xFFFF00),HexClr(0x00FF00),HexClr(0x00FFFF),HexClr(0x00CCFF),HexClr(0x993366),HexClr(0xC0C0C0)},
...{HexClr(0xFF99CC),HexClr(0xFFCC99),HexClr(0xFFFF99),HexClr(0xCCFFCC),HexClr(0xCCFFFF),HexClr(0x99CCFF),HexClr(0xCC99FF),HexClr(0xFFFFFF)}
} ;
class CColorPicker
... {
public:
HINSTANCEm_hInstance;//debug
CColorPicker(POINT*pt,DWORDDefaultColor);
~CColorPicker();
HWNDGetHwnd();
DWORDGetColor();
voidOnPaint();
voidOnLButtonDown(longx,longy);
voidOnLButtonUp(longx,longy);
voidOnMouseMove(longx,longy);
private:
HWNDm_hwnd;
DWORDm_Color;
bytem_HotRow,m_HotCol;
boolm_bCustomColor;
boolm_bMouseDown;
voidCreateColorPicker(POINT*pt);
voidDraw(HDChdc,byterow,bytecol,boolhot,bytecorrection);
voidReDraw(byterow,bytecol,boolhot);
} ;
#include
<
stdafx.h
>
#include " ColorPicker.h "
WNDPROCColorPickerWndProc(HWNDhwnd,UINTmsg,WPARAMwParam,LPARAMlParam)
... {
CColorPicker*lpColorPicker=(CColorPicker*)GetWindowLong(hwnd,GWL_USERDATA);
if(!lpColorPicker)return(WNDPROC)DefWindowProc(hwnd,msg,wParam,lParam);
/*========================================================================
作者: 彭国辉
DATE: 2007-12-25
BLOG: http://blog.csdn.net/nhconch
EMAIL: kacarton( at )sohu.com
#include " ColorPicker.h "
WNDPROCColorPickerWndProc(HWNDhwnd,UINTmsg,WPARAMwParam,LPARAMlParam)
... {
CColorPicker*lpColorPicker=(CColorPicker*)GetWindowLong(hwnd,GWL_USERDATA);
if(!lpColorPicker)return(WNDPROC)DefWindowProc(hwnd,msg,wParam,lParam);
/*========================================================================
作者: 彭国辉
DATE: 2007-12-25
BLOG: http://blog.csdn.net/nhconch
EMAIL: kacarton( at )sohu.com
文章为作者原创,转载前请先与本人联系,转载请注明文章出处、保留作者信息,谢谢支持!
=========================================================================*/
switch(msg)
...{
caseWM_PAINT:
lpColorPicker->OnPaint();
break;
caseWM_CLOSE:
DestroyWindow(hwnd);
break;
caseWM_DESTROY:
PostQuitMessage(0);
break;
caseWM_LBUTTONDOWN:
<!--作者:彭国辉 http://blog.csdn.net/nhconch-->lpColorPicker->OnLButtonDown(LOWORD(lParam),HIWORD(lParam));
break;
caseWM_LBUTTONUP:
lpColorPicker->OnLButtonUp(LOWORD(lParam),HIWORD(lParam));
break;
caseWM_MOUSEMOVE:
lpColorPicker->OnMouseMove(LOWORD(lParam),HIWORD(lParam));
break;
caseWM_KEYDOWN:
if(wParam==VK_ESCAPE)
...{
PostMessage(hwnd,WM_CLOSE,0,0);
break;
}
default:
return(WNDPROC)DefWindowProc(hwnd,msg,wParam,lParam);
}
return0;
}
CColorPicker::CColorPicker(POINT * pt,DWORDDefaultColor)
... {
m_hwnd=NULL;
m_Color=DefaultColor;
m_HotRow=m_HotCol=255;
m_bCustomColor=true;
m_bMouseDown=false;
CreateColorPicker(pt);
}
CColorPicker:: ~ CColorPicker()
... {
ReleaseCapture();
}
void CColorPicker::CreateColorPicker(POINT * pt)
... {
WNDCLASSwndclass;
//注册窗体类名
if(GetClassInfo(m_hInstance,COLORPICKERWINNAME,&wndclass)==0)
...{
memset(&wndclass,0,sizeof(WNDCLASS));
wndclass.style=CS_VREDRAW|CS_HREDRAW;
wndclass.lpfnWndProc=(WNDPROC)ColorPickerWndProc;
wndclass.hInstance=m_hInstance;
wndclass.hbrBackground=(HBRUSH)GetStockObject(COLOR_WINDOW);
//wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.lpszClassName=COLORPICKERWINNAME;
RegisterClass(&wndclass);
}
//创建工具栏窗体,定位于主窗口上方
RECTrc;
GetWindowRect(AfxGetMainWnd()->m_hWnd,&rc);
m_hwnd=CreateWindowEx(0,COLORPICKERWINNAME,"颜色拾取窗",WS_POPUP|WS_BORDER|WS_TABSTOP,pt->x,pt->y,8*18+12,126,0,NULL,/**//*AfxGetInstanceHandle()*/m_hInstance,NULL);
if(!m_hwnd)return;
SetWindowLong(m_hwnd,GWL_USERDATA,(LONG)this);
//显示窗体,进入消息循环
ShowWindow(m_hwnd,SW_SHOW);
UpdateWindow(m_hwnd);
SetCapture(m_hwnd);
MSGmsg;
while(GetMessage(&msg,NULL,0,0))
...{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
HWNDCColorPicker::GetHwnd() ... {returnm_hwnd;}
DWORDCColorPicker::GetColor() ... {returnm_Color;}
// 响应WM_PAINT重画整个窗口
void CColorPicker::OnPaint()
... {
PAINTSTRUCTps;
RECTrc;
HBRUSHhb;
HDChdc=BeginPaint(m_hwnd,&ps);
GetClientRect(m_hwnd,&rc);
hb=CreateSolidBrush(GetSysColor(COLOR_WINDOW));
FillRect(hdc,&rc,hb);
DeleteObject(hb);
//绘制色块
for(bytei=0;i<5;i++)
for(bytej=0;j<8;j++)
...{
Draw(hdc,i,j,false,1);
if(m_Color==ColorMap[i][j])m_bCustomColor=false;
}
//绘自定义文字
Draw(hdc,5,0,m_HotRow==5,1);
EndPaint(m_hwnd,&ps);
}
// 根据参数画指定区域
// 窗体重绘与局部刷新竟相差了一个点,correction参数用于校正
void CColorPicker::Draw(HDChdc, byte row, byte col, bool hot, byte correction)
... {
RECTrc;
HGDIOBJhpen,holdpen,hbold;
HBRUSHhb;
if(row<5&&col<8)
...{
rc.left=col*18+5-correction;
rc.top=row*18+5-correction;
rc.right=rc.left+18;
rc.bottom=rc.top+18;
//显示选中热区
if(hot||ColorMap[row][col]==m_Color)
...{
hb=CreateSolidBrush(GetSysColor(m_bMouseDown?COLOR_HIGHLIGHT:COLOR_INACTIVECAPTIONTEXT));
hpen=CreatePen(PS_SOLID,1,GetSysColor(m_bMouseDown?COLOR_WINDOWFRAME:COLOR_INACTIVECAPTION));
hbold=SelectObject(hdc,hb);
holdpen=SelectObject(hdc,hpen);
Rectangle(hdc,rc.left,rc.top,rc.right,rc.bottom);
SelectObject(hdc,holdpen);
SelectObject(hdc,hbold);
DeleteObject(hb);
DeleteObject(hpen);
}
else
FillRect(hdc,&rc,NULL);//GetSysColorBrush
//显示颜色
InflateRect(&rc,-3,-3);
hb=CreateSolidBrush(ColorMap[row][col]);
hpen=CreatePen(PS_SOLID,1,GetSysColor(COLOR_ACTIVEBORDER));
hbold=SelectObject(hdc,hb);
holdpen=SelectObject(hdc,hpen);
Rectangle(hdc,rc.left,rc.top,rc.right,rc.bottom);
SelectObject(hdc,holdpen);
SelectObject(hdc,hbold);<!--作者:彭国辉 http://blog.csdn.net/nhconch-->
DeleteObject(hb);
DeleteObject(hpen);
}
elseif(row==5)
...{
//绘自定义文字
GetClientRect(m_hwnd,&rc);
if(correction)OffsetRect(&rc,-correction,-correction);//校正位置
InflateRect(&rc,-5,-5);
rc.top=5*18+10;
if(hot)
...{
hb=CreateSolidBrush(GetSysColor(m_bMouseDown?COLOR_HIGHLIGHT:COLOR_INACTIVECAPTIONTEXT));
hpen=CreatePen(PS_SOLID,1,GetSysColor(m_bMouseDown?COLOR_WINDOWFRAME:COLOR_INACTIVECAPTION));
hbold=SelectObject(hdc,hb);
holdpen=SelectObject(hdc,hpen);
Rectangle(hdc,rc.left,rc.top,rc.right,rc.bottom);
=========================================================================*/
switch(msg)
...{
caseWM_PAINT:
lpColorPicker->OnPaint();
break;
caseWM_CLOSE:
DestroyWindow(hwnd);
break;
caseWM_DESTROY:
PostQuitMessage(0);
break;
caseWM_LBUTTONDOWN:
<!--作者:彭国辉 http://blog.csdn.net/nhconch-->lpColorPicker->OnLButtonDown(LOWORD(lParam),HIWORD(lParam));
break;
caseWM_LBUTTONUP:
lpColorPicker->OnLButtonUp(LOWORD(lParam),HIWORD(lParam));
break;
caseWM_MOUSEMOVE:
lpColorPicker->OnMouseMove(LOWORD(lParam),HIWORD(lParam));
break;
caseWM_KEYDOWN:
if(wParam==VK_ESCAPE)
...{
PostMessage(hwnd,WM_CLOSE,0,0);
break;
}
default:
return(WNDPROC)DefWindowProc(hwnd,msg,wParam,lParam);
}
return0;
}
CColorPicker::CColorPicker(POINT * pt,DWORDDefaultColor)
... {
m_hwnd=NULL;
m_Color=DefaultColor;
m_HotRow=m_HotCol=255;
m_bCustomColor=true;
m_bMouseDown=false;
CreateColorPicker(pt);
}
CColorPicker:: ~ CColorPicker()
... {
ReleaseCapture();
}
void CColorPicker::CreateColorPicker(POINT * pt)
... {
WNDCLASSwndclass;
//注册窗体类名
if(GetClassInfo(m_hInstance,COLORPICKERWINNAME,&wndclass)==0)
...{
memset(&wndclass,0,sizeof(WNDCLASS));
wndclass.style=CS_VREDRAW|CS_HREDRAW;
wndclass.lpfnWndProc=(WNDPROC)ColorPickerWndProc;
wndclass.hInstance=m_hInstance;
wndclass.hbrBackground=(HBRUSH)GetStockObject(COLOR_WINDOW);
//wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.lpszClassName=COLORPICKERWINNAME;
RegisterClass(&wndclass);
}
//创建工具栏窗体,定位于主窗口上方
RECTrc;
GetWindowRect(AfxGetMainWnd()->m_hWnd,&rc);
m_hwnd=CreateWindowEx(0,COLORPICKERWINNAME,"颜色拾取窗",WS_POPUP|WS_BORDER|WS_TABSTOP,pt->x,pt->y,8*18+12,126,0,NULL,/**//*AfxGetInstanceHandle()*/m_hInstance,NULL);
if(!m_hwnd)return;
SetWindowLong(m_hwnd,GWL_USERDATA,(LONG)this);
//显示窗体,进入消息循环
ShowWindow(m_hwnd,SW_SHOW);
UpdateWindow(m_hwnd);
SetCapture(m_hwnd);
MSGmsg;
while(GetMessage(&msg,NULL,0,0))
...{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
HWNDCColorPicker::GetHwnd() ... {returnm_hwnd;}
DWORDCColorPicker::GetColor() ... {returnm_Color;}
// 响应WM_PAINT重画整个窗口
void CColorPicker::OnPaint()
... {
PAINTSTRUCTps;
RECTrc;
HBRUSHhb;
HDChdc=BeginPaint(m_hwnd,&ps);
GetClientRect(m_hwnd,&rc);
hb=CreateSolidBrush(GetSysColor(COLOR_WINDOW));
FillRect(hdc,&rc,hb);
DeleteObject(hb);
//绘制色块
for(bytei=0;i<5;i++)
for(bytej=0;j<8;j++)
...{
Draw(hdc,i,j,false,1);
if(m_Color==ColorMap[i][j])m_bCustomColor=false;
}
//绘自定义文字
Draw(hdc,5,0,m_HotRow==5,1);
EndPaint(m_hwnd,&ps);
}
// 根据参数画指定区域
// 窗体重绘与局部刷新竟相差了一个点,correction参数用于校正
void CColorPicker::Draw(HDChdc, byte row, byte col, bool hot, byte correction)
... {
RECTrc;
HGDIOBJhpen,holdpen,hbold;
HBRUSHhb;
if(row<5&&col<8)
...{
rc.left=col*18+5-correction;
rc.top=row*18+5-correction;
rc.right=rc.left+18;
rc.bottom=rc.top+18;
//显示选中热区
if(hot||ColorMap[row][col]==m_Color)
...{
hb=CreateSolidBrush(GetSysColor(m_bMouseDown?COLOR_HIGHLIGHT:COLOR_INACTIVECAPTIONTEXT));
hpen=CreatePen(PS_SOLID,1,GetSysColor(m_bMouseDown?COLOR_WINDOWFRAME:COLOR_INACTIVECAPTION));
hbold=SelectObject(hdc,hb);
holdpen=SelectObject(hdc,hpen);
Rectangle(hdc,rc.left,rc.top,rc.right,rc.bottom);
SelectObject(hdc,holdpen);
SelectObject(hdc,hbold);
DeleteObject(hb);
DeleteObject(hpen);
}
else
FillRect(hdc,&rc,NULL);//GetSysColorBrush
//显示颜色
InflateRect(&rc,-3,-3);
hb=CreateSolidBrush(ColorMap[row][col]);
hpen=CreatePen(PS_SOLID,1,GetSysColor(COLOR_ACTIVEBORDER));
hbold=SelectObject(hdc,hb);
holdpen=SelectObject(hdc,hpen);
Rectangle(hdc,rc.left,rc.top,rc.right,rc.bottom);
SelectObject(hdc,holdpen);
SelectObject(hdc,hbold);<!--作者:彭国辉 http://blog.csdn.net/nhconch-->
DeleteObject(hb);
DeleteObject(hpen);
}
elseif(row==5)
...{
//绘自定义文字
GetClientRect(m_hwnd,&rc);
if(correction)OffsetRect(&rc,-correction,-correction);//校正位置
InflateRect(&rc,-5,-5);
rc.top=5*18+10;
if(hot)
...{
hb=CreateSolidBrush(GetSysColor(m_bMouseDown?COLOR_HIGHLIGHT:COLOR_INACTIVECAPTIONTEXT));
hpen=CreatePen(PS_SOLID,1,GetSysColor(m_bMouseDown?COLOR_WINDOWFRAME:COLOR_INACTIVECAPTION));
hbold=SelectObject(hdc,hb);
holdpen=SelectObject(hdc,hpen);
Rectangle(hdc,rc.left,rc.top,rc.right,rc.bottom);