子类化思想 简单例示

子类化思想 简单例示

ID:47520742

大小:51.00 KB

页数:6页

时间:2019-09-13

子类化思想 简单例示_第1页
子类化思想 简单例示_第2页
子类化思想 简单例示_第3页
子类化思想 简单例示_第4页
子类化思想 简单例示_第5页
资源描述:

《子类化思想 简单例示》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、子类化思想简单例示子类化的思想和子类继承父类的思想一样,子类化一个控件或其他东西可以加入自己想要的功能。子类化实际上并没有像C++一样重载哪个函数,而是靠拦截Windows系统中的某些消息来自己进行处理罢了比如:也许你需要一个特殊的Edit控件,只能输入数字,但是现有的Edit却并不能完成这项工作,我们可以采用子类化技术使它完成这个功能。举例来说,请大家看以下这段简单的窗口回调过程:LRESULTCALLBACKProcMain(HWNDhDlg,UINTMsg,WPARAMwParam,LPARAMlParam){switch(Msg

2、){caseWM_CLOSE:EndDialog(hDlg,0);break;caseWM_DESTROY:PostQuitMessage(0);break;}return0;}在这个回调之中,我手动处理了两个消息:在单击了“关闭”按钮(WM_CLOSE)的时候,我将对话框关闭(EndDialog);在对话框销毁(WM_DESTROY)的时候,我向系统消息队列中发送了退出的消息来完成结束工作(PostQuitMessage)。如果把WM_CLOSE的响应代码改成:caseWM_CLOSE:ShowWindow(hDlg,SW_MINIM

3、IZE);break;这样一来,这个对话框就会和好多其他软件一样,在单击了“关闭”之后,就会完成最小化的工作了。那么,对于窗口过程已定义好的系统控件,将如何手动响应它的消息呢?  我们可以用函数指针的办法,将我们感兴趣的消息拦截下来,处理完之后再让预定义的窗口过程处理。这个过程大致如下:  WNDPROCOldProc;  OldProc=(WNDPROC)SetWindowsLong(hWnd,GWL_WNDPROC,(LONG)NewProc);  当然,这里的新窗口过程NewProc是预先由你实现好的。上述代码执行以后,系统在处理

4、hWnd的窗口消息时,就会先进入你实现的NewProc回调过程,然后在处理过你感兴趣的消息之后,通过CallWindowProc函数和你预先保存的OldProc再次回到原来的回调过程中完成剩余的工作。  以上就是窗口子类化的原理分析,下面我通过一个实例来实际解说如何对窗口进行子类化。这个例子的界面如下:  界面上方的编辑框是用来限制浮点输入的,下面则是一个普通的超级链接。  好了,下面我开始按步骤完成对这两个窗口的子类化:  第一步,在主窗口对话框初始化的时候,保存原有的窗口过程,并设置新的窗口过程。代码如下:caseWM_INITDI

5、ALOG:EditProc=(WNDPROC)SetWindowLong(GetDlgItem(hDlg,IDC_EDIT),GWL_WNDPROC,(LONG)ProcFloat);StaticProc=(WNDPROC)SetWindowLong(GetDlgItem(hDlg,IDC_ST_HOMEPAGE),GWL_WNDPROC,(LONG)ProcLink);break;  第二步,实现浮点编辑框的窗口过程:LRESULTCALLBACKProcFloat(HWNDhWnd,UINTMsg,WPARAMwParam,LPAR

6、AMlParam){if(Msg==WM_CHAR&&wParam!='.'&&(wParam<='0'

7、

8、wParam>='9')&&wParam!=VK_BACK){MessageBeep(MB_OK);return0;}elsereturnCallWindowProc(EditProc,hWnd,Msg,wParam,lParam);}  这里需要解释的是,由于控件本身的需求,所以只需要拦截一个消息,就是接收字符的WM_CHAR。当用户输入的字符不是小数点、0~9以及退格键(注意不要少了退格键,否则你将会发现你的编辑框无法删除输入

9、错误的数字)的时候,就发出一声声音以提示输入错误。至于其它的消息,则调用原有的回调函数进行处理。  第三步,实现超级链接的窗口过程:LRESULTCALLBACKProcLink(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam){switch(Msg){caseWM_SETCURSOR:SetCursor(LoadCursor(NULL,IDC_HAND));break;caseWM_LBUTTONDOWN:ShellExecute(NULL,"open","http://home.ncust.ed

10、u.cn/~titilima",NULL,NULL,SW_SHOWNORMAL);break;default:returnCallWindowProc(StaticProc,hWnd,Msg,wParam,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。