WEB开发网
开发学院软件开发VC Visual C++实现定制标题栏 阅读

Visual C++实现定制标题栏

 2008-11-14 19:33:30 来源:WEB开发网   
核心提示: 定制标题栏的入口函数为 CallWndProc(),其代码如下:LRESULT __declspec(dllexport) CALLBACK CallWndProc(int code,Visual C++实现定制标题栏(2), // hook codeWPARAM wParam, // u

定制标题栏的入口函数为 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 则不进行绘制,本文中仅以如下简单的方法来处理:

Tags:Visual 实现 定制

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接