C++实现仿Office风格的颜色选取框代码(2)
ColorPicker.cpp #include
#include "ColorPicker.h"
WNDPROC ColorPickerWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
CColorPicker* lpColorPicker = (CColorPicker*)GetWindowLong(hwnd, GWL_USERDATA);
if (!lpColorPicker) return (WNDPROC)DefWindowProc(hwnd, msg, wParam, lParam);
/*========================================================================
作者: 彭国辉
DATE: 2007-12-25
EMAIL: kacarton( at )sohu.com
文章为作者原创,转载前请先与本人联系,转载请注明文章出处、保留作者信息,谢谢支持!
=========================================================================*/
switch (msg)
{
case WM_PAINT:
lpColorPicker->OnPaint();
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
lpColorPicker->OnLButtonDown(LOWORD(lParam), HIWORD(lParam));
break;
case WM_LBUTTONUP:
lpColorPicker->OnLButtonUp(LOWORD(lParam), HIWORD(lParam));
break;
case WM_MOUSEMOVE:
lpColorPicker->OnMouseMove(LOWORD(lParam), HIWORD(lParam));
break;
case WM_KEYDOWN:
if (wParam==VK_ESCAPE)
{
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
}
default:
return (WNDPROC)DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
CColorPicker::CColorPicker(POINT *pt, DWORD DefaultColor)
{
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)
{
WNDCLASS wndclass;
//注册窗体类名
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);
}
//创建工具栏窗体,定位于主窗口上方
RECT rc;
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);





