Visual C++实现定制标题栏
2008-11-14 19:33:30 来源:WEB开发网定制标题栏的入口函数为 CallWndProc(),其代码如下:
LRESULT __declspec(dllexport) CALLBACK CallWndProc(
int code, // hook code
WPARAM wParam, // undefined
LPARAM lParam // address of structure with message data (CWPSTRUCT)
)
{
DWORD dwThreadID = (DWORD)wParam;
LPCWPSTRUCT pCwpStruct = LPCWPSTRUCT(lParam);
if (HC_ACTION == code)
{
if ((pCwpStruct->message == WM_MOUSEMOVE)
|| (pCwpStruct->message == WM_SETCURSOR)
|| (pCwpStruct->message == WM_NCHITTEST)
|| (pCwpStruct->message == WM_KICKIDLE)
|| (pCwpStruct->message == WM_NCMOUSEMOVE)
|| (pCwpStruct->message == WM_MOUSEACTIVATE)
|| (pCwpStruct->message > WM_USER));
else
DrawFrame(pCwpStruct);
}
return CallNextHookEx(g_hCallWndProc, code, wParam, lParam);
}
上面代码中的 if 语句主要用来判断收到哪些消息时需要重绘标题栏,有兴趣的朋友可以对这段代码进行改进。
在函数 DrawFrame 中将实现对窗体标题栏和边框的绘制,标题的绘制有两种方法,一是直接画图,二是贴图的方式。在本文中将实现两种方法,如果在当前目录下有 active.bmp 和 inactive.bmp 两个文件,则采用它们所代表的位图作为窗体的标题栏,否则采用画图的方式。
由于只绘制标题栏,所以需要对 CallWndProc 进行过滤,对于非窗体如 Button 则不进行绘制,本文中仅以如下简单的方法来处理:
更多精彩
赞助商链接