用VC写了个颜色选取框,仿Office风格,没用MFC什么的框架,调用很简单指定显示位置POINT和默认颜色就可以<!--作者:彭国辉 http://blog.youkuaiyun.com/nhconch-->,如:
POINT pt;
pt.x = 100; pt.y = 100;
CColorPicker *clrpk = new CColorPicker(&pt, HexClr(0xFF0000));
效果图:
代码:
ColorPicker.h




















































作者: 彭国辉
DATE: 2007-12-25
BLOG: http://blog.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/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);
=========================================================================*/













<!--作者:彭国辉 http://blog.youkuaiyun.com/nhconch-->









































































































































































