Visual C++实现定制标题栏
2008-11-14 19:33:30 来源:WEB开发网char szClassName[128] = {0};
::GetClassName(pCwpStruct->hwnd, szClassName, sizeof(szClassName));
if (strcmp(szClassName, "#32770") != 0)
return ;
实际中不能这样中,因为很多窗体的类名可能不是"#32770",比较好的方法建议去判断 pCwpStruct->hwnd 所代表的对象是否有父窗体,调用 GetParent 判断一下即可。
在正式绘制之前还必须判断窗体是处于活动状态还是非活动状态,这样就可以区分在两种不同的状态下绘制不同的标题栏和边框了。
下面这段代码就是用来绘制标题栏的:
if (bActive)
hBitmap = (HBITMAP)::LoadImage(NULL, _T("active.bmp"), IMAGE_BITMAP, nWidth, nHeight, LR_LOADFROMFILE);
else
hBitmap = (HBITMAP)::LoadImage(NULL, _T("inactive.bmp"), IMAGE_BITMAP, nWidth, nHeight, LR_LOADFROMFILE);
if (NULL == hBitmap)
{
DrawTitleBar(dcWin, rcNcClient, 0);
}
else
{
dcMem = ::CreateCompatibleDC(dcWin);
hOldBitmap = (HBITMAP)::SelectObject(dcMem, hBitmap);
::StretchBlt(dcWin,0,0,nWidth, nHeight,dcMem,0,0,nWidth, nHeight,SRCCOPY);
::SelectObject(dcMem, hOldBitmap);
::DeleteDC(dcMem);
}
其中变量bActive为TRUE时表示窗体处于活动状态,为FALSE时表示窗体处于非活动状态。两个 LoadImage 函数分别用来将两种状态下的位图装载到内存中,以便下一步进行贴图.当 LoadImage 不成功时,表示当前目录下没有 active.bmp 和 inactive.bmp 文件中或文件格式不正确,在这处情况下就调用 DrawTitleBar 函数对标题栏进行绘画。绘画的方法可以随便,但要绘在矩形 rcNcClient 内,因为这个矩形就是标题栏所在区域。
如果 LoadImage 成功,则直接将位图贴到标题栏中。接下来就是绘制边框了,在绘制之前还需要计算出边框的所在矩形,然后再在dcWin上按要求进行绘制即可。完整的示例源代码请到 http://www.megspace.com/computers/bigtime/custtitlebar.htm 上下载(注意:由于申请的是国外免费空间,所以需要将浏览器的编码改为“简体中文”),解压后运行即可看到示例的所述界面
这种方法的关键地方是安装合适的钩子,然后对合适的消息进行处理,采用这种方法可以改变几乎任何一可见窗体的外观,包括其它程序的窗体等,对于特殊的窗体等只需要进行专门处理即可。
由于编译成的是 DLL 文件中,所以可以很轻松的运用到其它程序中。只需要在需要用到的程序中调用 InstallCallWndHook 安装这个钩子即可。
更多精彩
赞助商链接