C++实现仿Office风格的颜色选取框代码(3)
//显示窗体,进入消息循环
ShowWindow(m_hwnd, SW_SHOW);
UpdateWindow(m_hwnd);
SetCapture(m_hwnd);
MSG msg;
while (GetMessage (&msg, NULL, 0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
HWND CColorPicker::GetHwnd() ...{return m_hwnd;}
DWORD CColorPicker::GetColor() ...{return m_Color;}
//响应WM_PAINT重画整个窗口
void CColorPicker::OnPaint()
{
PAINTSTRUCT ps;
RECT rc;
HBRUSH hb;
HDC hdc = BeginPaint(m_hwnd, &ps);
GetClientRect(m_hwnd, &rc);
hb = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
FillRect(hdc, &rc, hb);
DeleteObject(hb);
//绘制色块
for (byte i=0; i<5; i++)
for (byte j=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(HDC hdc, byte row, byte col, bool hot, byte correction)
{
RECT rc;
HGDIOBJ hpen, holdpen, hbold;
HBRUSH hb;
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);