织梦CMS - 轻松建站从此开始!

罗索

WINCE 窗口子类化

jackyhwei 发布于 2009-12-23 17:05 点击:次 
SetWindowLong的另一个用途是子类化一个窗口。本质上讲,窗口子类化是使应用程序从先前存在的窗口类派生出新窗口类的一个实例。子类化的典型应用是修改窗口控件的行为,例如一个Edit控件。
TAG:

SetWindowLong的另一个用途是子类化一个窗口。本质上讲,窗口子类化是使应用程序从先前存在的窗口类派生出新窗口类的一个实例。子类化的典型应用是修改窗口控件的行为,例如一个Edit控件。

子类化的过程实际上是很简单的。先创建一个窗口过程来为被子类化的窗口提供新功能,再用基础窗口类创建一个窗口。然后为该窗口调用GetWindowLong来获得并保存一个指向其初始窗口过程的指针,之后调用SetWindowLong函数,将窗口实例的窗口过程设置成新的窗口过程。这样,新的窗口过程就开始接收发给该窗口的消息了。任何没有被新窗口过程响应的消息都通过调用CallWindowProc传递给到旧的窗口过程。下面的代码展示了窗口创建及被子类化的过程。子类化窗口过程截获了WM_LBUTTONDOWN消息,并且在窗口收到该消息时使扬声器发出声音。

  1. //原窗口响应回调函数  
  2. LRESULT CALLBACK SCWndProc(HWND hWnd, UINT wMsg, WPARAM wParam,   LPARAM lParam);  
  3.  
  4. // Variable that holds the pointer to the original WndProc  
  5. WNDPROC lpfnOldProc = 0;  
  6. //  
  7. //w创建相应窗口并得到句柄  
  8. //  
  9. BOOL SubClassThisWnd (HWND hwndSC) {  
  10.     if (lpfnOldProc == 0) {  
  11.         // 保存原函数响应地址  
  12.         lpfnOldProc = (WNDPROC)GetWindowLong (hwndSC, GWL_WNDPROC);  
  13.         // 新窗口过程  
  14.         return SetWindowLong (hwndSC, GWL_WNDPROC, (DWORD)SCWndProc);  
  15.     }  
  16.     return FALSE;  
  17. }  
  18.  
  19. // 新窗口响应函数,对未截取的消息,返回原消息响应函数执行  
  20. //  
  21. LRESULT CALLBACK SCWndProc(HWND hWnd, UINT wMsg, WPARAM wParam,LPARAM lParam) {  
  22.     switch (wMsg) {  
  23.     case WM_LBUTTONDOWN:  
  24.         MessageBeep(0);  
  25.         break;  
  26.     }  
  27.     return CallWindowProc (lpfnOldProc, hWnd, wMsg, wParam, lParam);  
  28. }  

要去除窗口的子类化,只要调用SetWindowLong,把WndProc指针设置回最初的窗口过程即可。

(jacky)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200912/8169.html]
本文出处:网络博客 作者:jacky
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容