我已经模拟了CObject,CWinApp,CWnd,CFramWnd,普通WM消息,但是到子类化以及WM_COMMAND等消息时就卡住了!现在很急!!!关于子类化,比如BUTTON的子类化(没有用到MFC,纯SDK),因为系统已经帮它注册了,所以我们要子类化这样的对象只能有2种方法:
1:通过GetWindowLong和SetWindowLong把原来的处理过程保存,并设置新的处理过程,这样消息就流到BUTTON类里去了,然后处理完再调用原来的处理过程,实现子类化
2:消息还是先流到父类,然后WM_COMMAND消息的(HWND) lParam可以得到子类的HWND,通过在系统中建立一个HWND和子类的this指针的map,可以查到所需this,通过这个指针去调用子类的虚拟的消息处理函数,BUTTON等的owner可以通过判断返回值来决定是否自己还要处理一下。 如果不是系统定义的类,那就比较方便解决,我可以把this指针在CreateWindow的时候放在lpParam里,然后通过GetWindowLong来取得。但是系统定义的类,如“BUTTON”等就不行了吧?
我不知道自己理解的对不对,有人能看懂我发的东西吗? 不知道大家是怎么做的,以及有什么想法或者见解!欢迎大家啊!!!
1:通过GetWindowLong和SetWindowLong把原来的处理过程保存,并设置新的处理过程,这样消息就流到BUTTON类里去了,然后处理完再调用原来的处理过程,实现子类化
2:消息还是先流到父类,然后WM_COMMAND消息的(HWND) lParam可以得到子类的HWND,通过在系统中建立一个HWND和子类的this指针的map,可以查到所需this,通过这个指针去调用子类的虚拟的消息处理函数,BUTTON等的owner可以通过判断返回值来决定是否自己还要处理一下。 如果不是系统定义的类,那就比较方便解决,我可以把this指针在CreateWindow的时候放在lpParam里,然后通过GetWindowLong来取得。但是系统定义的类,如“BUTTON”等就不行了吧?
我不知道自己理解的对不对,有人能看懂我发的东西吗? 不知道大家是怎么做的,以及有什么想法或者见解!欢迎大家啊!!!
解决方案 »
- VC2008下单文本程序中的outlookbar效果
- !!!菜鸟在线等待: 以下的这个怎么实现的??? (第一次的图片有问题,重新开贴)
- matlab处理曲线
- 如果用AfxBeginThread启动一个类中的一个函数,那个函数一定要定义为Static吗?
- listcontrol动态加载字段名时,出现数据类型不匹配的问题如何解决?里面有详细的问题说明
- 大师留步:COM客户程序作为Windows服务程序时
- 如何创建一个非停靠的工具栏?
- 学习visual c++
- 请问win2000下如何得到密码框中的内容?
- ========GCC3.0那里有的下载?========
- 关于主程序与ActiveX控件的问题。
- 急!急!急!急!在dialogbar中加入button,但是button不能用
我的知识太浅了,我学了1个月都不到。
我想听听大家的理解啊。
Message Routing 没仔细看。没法说
Sams Teach Yourself C++ in 24 Hours, Complete Starter Kit, 4th Editionhttp://www.samspublishing.com/title/0672326191
Sams Teach Yourself PHP in 24 Hours, 3rd Editionhttp://www.samspublishing.com/title/0672325381
Sams Teach Yourself Microsoft Visual C# .NET 2003 in 24 Hours Complete Starter Kit
HWND hButton;...
case WM_CREATE:
hButton=CreateWindowEx(0, TEXT("BUTTON"), ...);
g_OldBtnWndProc=(WNDPROC)GetWindowLong(hButton, GWL_WNDPROC);
SetWindowLong(hButton, GWL_WNDPROC, (LONG)MyBtnWndProc);
break;...LRESULT CALLBACK MyBtnWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_COMMAND:
...
return 0L;
default:
break;
}
return CallWindowProc(g_OldBtnWndProc, hWnd,uMsg, wParam, lParam);}
有空2种方法都试试看!
两种方法都要,SetWindowLong到一个公用的消息处理函数里去,再调用类的虚函数
哈,我怎么可能模仿整个MFC,我只是好玩写点拉。
比方说在一个BUTTON上点一下,按方法2做只能收到WM_COMMAND消息,这样做只是把处理的地方换到子类去,并不算是真正意义上的子类化,只有第1种做法才是真正子类化,可以收到WM_LBUTTONDOWN消息。(但是第1种做法我程序还有点问题......)结帖!