现在要开发一个程序,要求改变标题栏上的背景为黑色,并且背景上要贴上公司要求的图片。
标题栏上的按钮的形状也要改变,颜色也要改变。
同时边框的四周也要改变颜色。
这个程序我已经做了一段时间,是采用对话框做为程序的主框架的。因为在该对话框上要加入菜单,
要求菜单在标题栏下面。
也就是说,采用某种方法改变对话框的标题栏后,菜单仍然是在标题栏的下面。
响应WM_NCPAINT,用 GetDCEx 获得DC句柄,自行绘制。
在处理WM_NCPAINT的基础上,加上
void CXXXXXDlg::OnInitMenu(CMenu* pMenu)
{
CDialog::OnInitMenu(pMenu);
SendMessage(WM_NCPAINT);
}
LRESULT CXXXXXDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_NCHITTEST)
{
LRESULT lRet = CDialog::WindowProc(message, wParam, lParam);
if (lRet == HTZOOM || lRet == HTMINBUTTON || lRet == HTCLOSE)
return HTCAPTION;
else
return lRet;
}
else if (message == WM_SETCURSOR || message == WM_NCLBUTTONDOWN || message == WM_NCLBUTTONDBLCLK)
{
ModifyStyle(WS_SYSMENU, 0);
LRESULT lRet = CODDialog::WindowProc(message, wParam, lParam);
ModifyStyle(0, WS_SYSMENU);
return lRet;
}
return CDialog::WindowProc(message, wParam, lParam);
}
以避免对窗口标题的重画
在WM_NCPAINT绘图前,先调用DefWindoProc处理消息,然后绘图。
绘制的时候,用GetTitleBarInfo获得标题栏的高度,然后就能控制不在标题栏以外的地方绘图了。比如:
case WM_NCPAINT:
{
DefWindowProc(hDlg, message, wParam, lParam);
HDC hdc;
hdc = GetWindowDC(hDlg);
// Paint into this DC
RECT rcDialog,rc;
GetWindowRect(hDlg, &rcDialog);
HBRUSH hbr = CreateSolidBrush(0);
rc.left = 0; rc.top = 0;
rc.right = rcDialog.right - rcDialog.left;
TITLEBARINFO tbi;
tbi.cbSize = sizeof(tbi);
GetTitleBarInfo(hDlg, &tbi);
rc.bottom = tbi.rcTitleBar.bottom - tbi.rcTitleBar.top;
HBRUSH hOldbr = SelectObject(hdc, hbr);
FillRect(hdc, &rc, hbr);
SelectObject(hdc, hOldbr);
DeleteObject(hbr);
ReleaseDC(hDlg, hdc);
return TRUE;
}