win32版的《win32实现简单易用的拾色器(取色器)的功能及代码分析》,对于代码实现的理解,也请看原文。下面我们用MFC实现一次:
在实现文件.cpp中:
void C拾色器Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SetCapture();
SetCursor(LoadCursor(NULL,IDC_CROSS));
CDialogEx::OnLButtonDown(nFlags, point);
}
void C拾色器Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
ReleaseCapture();
SetCursor(LoadCursor(NULL,IDC_ARROW));
CDialogEx::OnLButtonUp(nFlags, point);
}
void C拾色器Dlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDC *pDC=GetDC();
POINT ptScreen;
ptScreen.x=point.x;
ptScreen.y=point.y;
ClientToScreen(&ptScreen);
clr=hScreen->GetPixel(ptScreen.x,ptScreen.y);
wsprintf(clrhex,_T("%X %X %X"),GetRValue(clr),GetGValue(clr),GetBValue(clr));
wsprintf(tip,_T("颜色(%d,%d,%d),十六进制:#%s"),GetRValue(clr),GetGValue
(clr),GetBValue(clr),clrhex);
GetClientRect(&rect);
hBrush.CreateSolidBrush(clr);
pDC->FillRect(&rect,&hBrush);
pDC->SelectObject(GetStockObject(SYSTEM_FIXED_FONT));
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255-GetRValue(clr),255-GetGValue(clr),255-GetBValue(clr)));
//pDC->DrawText(txt,-1,&rect,DT_WORDBREAK);
pDC->TextOutW(0,50,tip);
DeleteObject(pDC->SelectObject(GetStockObject(WHITE_BRUSH)));//删除画刷
ReleaseDC(pDC);
CDialogEx::OnMouseMove(nFlags, point);
}
int C拾色器Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
hScreen=GetWindowDC();
return 0;
}
还有WM_PAINT函数:
PAINTSTRUCT ps;
CDC *pDC=BeginPaint(&ps);
GetClientRect(&rect);
hBrush.CreateSolidBrush(clr);
pDC->FillRect(&rect,&hBrush);
pDC->SelectObject(GetStockObject(SYSTEM_FIXED_FONT));
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255-GetRValue(clr),255-GetGValue(clr),255-GetBValue(clr)));
pDC->TextOutW(0,50,tip);
EndPaint(&ps);
在头文件中:
LPWSTR clrhex,tip;
COLORREF clr;
CDC *hScreen;
CRect rect;
CBrush hBrush;
最后的实现: