C++作的仿Office风格的颜色选取框

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

效果图:
C++的颜色拾取框

代码:
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);
}
;
ColorPicker.cpp
#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
文章为作者原创,转载前请先与本人联系,转载请注明文章出处、保留作者信息,谢谢支持!
=========================================================================*/

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值