设为首页 加入收藏

TOP

1.4 公共模块设计(3)
2013-10-07 13:26:46 来源: 作者: 【 】 浏览:82
Tags:1.4 公共 模块 设计

1.4  公共模块设计(3)

定义钩子函数,对按钮类控件进行子类化。代码如下:

  1. LRESULT CALLBACK HOOKProc( int nCode, WPARAM wParam, LPARAM lParam )  
  2. {  
  3.     PCWPSTRUCT  wc = (PCWPSTRUCT) lParam;  
  4.     HWND  hWnd = wc->hwnd;  
  5.     if( hWnd )   
  6.     {  
  7.         char ClassName[MAX_PATH] = "";  
  8.         GetClassName( hWnd, ClassName, MAX_PATH );  
    //去掉窗口类名  
  9.         if( strcmp( ClassName, "Button" ) == 0 )  
  10.         {  
  11.             CWnd    *pWnd = CWnd::FromHandle( hWnd );  
  12.             if ( pWnd->GetStyle() & BS_RADIOBUTTON )  
    //判断单选按钮  
  13.             {  
  14.                 return 1;  
  15.             }  
  16.             if ( pWnd->GetStyle() & BS_CHECKBOX )  
    //判断复选框  
  17.             {  
  18.                 return 1;  
  19.             }  
  20.             WNDPROC WndProc;  
  21.             WndProc = (WNDPROC) GetWindowLong( hWnd, GWL_WNDPROC );  
  22.             CDrawButton *pButton=(CDrawButton*)GetWindowLong(hWnd,GWL_USERDATA);  
  23.             if (pButton != NULL&& pButton->m_Flag==1 )  
  24.             {  
  25.                 SetWindowLong(hWnd,GWL_USERDATA,0);   
    //设置窗口信息  
  26.                 //设置窗口对话框函数地址  
  27.                 SetWindowLong( hWnd, GWL_WNDPROC,
    (LONG)pButton-
    >m_OldProc );   
  28.                 pButton->m_OldProc = NULL;  
  29.                 delete pButton;  
  30.             }  
  31.             else if (pButton == NULL )   
  32.             {  
  33.                 if( WndProc !=DefWindowProc1 )  
  34.                 {  
  35.                     pButton = new CDrawButton;  
  36.                     pButton->m_OldProc = WndProc;  
  37.                     SetWindowLong(hWnd,GWL_USERDATA,
    (long)pButton); //设置窗口信息  
  38.                     WndProc =  (WNDPROC) SetWindowLong
    ( hWnd, GWL_WNDPROC, (LONG) DefWindowProc1);        

    //设置窗口函数地址  
  39.                 }  
  40.             }  
  41.         }  
  42.     }  
  43.     return CallNextHookEx( hWndHook, nCode, wParam, lParam );  
  44. }  
  45.  

定义一个安装钩子的函数RunHook,代码如下:

  1. BOOL  RunHook( HMODULE hModule, DWORD dwThreadID)  
  2. {  
  3.     hWndHook = SetWindowsHookEx(  
  4.         WH_CALLWNDPROC, (HOOKPROC) HOOKProc, 
    hModule, dwThreadID ); //安装钩子  
  5.     return TRUE;  
  6. }  

定义一个卸载钩子的函数StopHook,代码如下:

  1. BOOL  StopHook()  
  2. {  
  3.     UnhookWindowsHookEx(hWndHook);                                  //卸载钩子  
  4.     return TRUE;  
  5. }  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.5 主窗体设计(6) 下一篇1.4 公共模块设计(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: