当前位置:有风信息港IT学院编程技术JAVA → Visual C++实现定制标题栏

Visual C++实现定制标题栏

减小字体 增大字体 作者:有风IT学院  来源:有风信息港  发布时间:2008-1-13 9:33:40
  要想用VC编写出一个漂亮的界面通常是比较费时的,主要原因有两个,一是VC中自带的组件少而不亮,二是无法进行可视化设计。不过,这些都只是针对常用的方法罢了,如果你采用子类化,钩子等技术,可以完全改变这处局面,甚至比Delphi等RAD工具还要快.本文中就将介绍如何编写一个DLL,如何来轻松的定制标题栏。

  为了使每个窗体的标题栏都能定制,并且不用为每一个窗体类编码,所以本方法采用钩子技术,其核心思想是监控 Windows 消息,处理需要重缓标题的消息,以达到定制标题栏的思想。

  本文件介绍的方法将在应用程序中安装 WH_CALLWNDPROC 钩子,具体的代码如下所示:

  在应用程序启动时安装钩子的代码:

  

  extern "C" BOOL __declspec(dllexport) InstallCallWndHook()

  {

   g_hCallWndProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, AfxGetInstanceHandle(),GetCurrentThreadId());

   if (NULL == g_hCallWndProc)

    return FALSE;

   else

    return TRUE;

  }

  InstallCallWndHook() 函数定义为出口函数,在需要定制标题的程序中将调用它,由于安装的是 WH_CALLWNDPROC 钩子,所以在应用程序调用自己的窗体过程之前,总会先调用 CallWndProc;如果设置为 WH_CALLWNDPROCRET 则顺序刚好相反

  g_hCallWndProc为一内存共享变量,其它定义的方法如下所示:

  

  #pragma data_seg("Shared")

  static HHOOK g_hCallWndProc;

  #pragma data_seg()

  当然你也可以定义为其它形式,比如直接采用共享内存API创建方式。

  在应用程序退出时安装卸载钩子的代码:

  

  extern "C" void __declspec(dllexport) UnInstallCallWndHook()

  {

   if (g_hCallWndProc != NULL)

   {

    UnhookWindowsHookEx(g_hCallWndProc);

    g_hCallWndProc = NULL;

   }

  }

  定制标题栏的入口函数为 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 语句主要用来判断收到哪些消息时需要重绘标题栏,有兴趣的朋友可以对这段代码进行改进。

  



  
推荐文章:搞笑之可爱水果表情  清新素洁水仙壁纸集


  

[1] [2]  下一页