子类化的问题(纯SDK模拟MFC),急需高手!(UP者也有分数!)送完为止!!!(其实我就是那个说15天看完3本书的人)

loveghb 2005-02-26 02:35:23
我已经模拟了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”等就不行了吧?
我不知道自己理解的对不对,有人能看懂我发的东西吗?

不知道大家是怎么做的,以及有什么想法或者见解!欢迎大家啊!!!
...全文
505 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveghb 2005-02-26
  • 打赏
  • 举报
回复
我都试验过了,如果不替换窗口处理过程的话,WM_COMMAND消息不能转化为WM标准消息
比方说在一个BUTTON上点一下,按方法2做只能收到WM_COMMAND消息,这样做只是把处理的地方换到子类去,并不算是真正意义上的子类化,只有第1种做法才是真正子类化,可以收到WM_LBUTTONDOWN消息。(但是第1种做法我程序还有点问题......)

结帖!
erben 2005-02-26
  • 打赏
  • 举报
回复
牛人
loveghb 2005-02-26
  • 打赏
  • 举报
回复
别嘲笑我!我是抱着学习的态度的!
fanqing 2005-02-26
  • 打赏
  • 举报
回复
看样子不用一年,就有纯国产操作系统出来了.
牛人太多了
loveghb 2005-02-26
  • 打赏
  • 举报
回复
:)
哈,我怎么可能模仿整个MFC,我只是好玩写点拉。
ahzhuo 2005-02-26
  • 打赏
  • 举报
回复
若仅仅只想实现窗口的子类化,而不是想要模仿整个MFC的话,你应该参考以下 Paul DiLacia 大师的CSubclassWnd类的设计——简单而高效。
yongdu 2005-02-26
  • 打赏
  • 举报
回复
跟着MFC学就行了。
两种方法都要,SetWindowLong到一个公用的消息处理函数里去,再调用类的虚函数
Jarrylogin 2005-02-26
  • 打赏
  • 举报
回复
向药师学习,交流
ukyoking 2005-02-26
  • 打赏
  • 举报
回复
都系牛人啊,你模拟它还不如直接使用它,如果觉得它不好可以换用别的类库。要想学习它看候杰深入浅出就够了。
BeRoy 2005-02-26
  • 打赏
  • 举报
回复
up
loveghb 2005-02-26
  • 打赏
  • 举报
回复
那样是可以,但是我不希望那样,如果向上述这样做的话,就要为每个响应WM_COMMAND的子类定义一个static的函数了,而且消息不是从一个统一的地方流出并且分派了。我现在是在一个static的函数里调用主窗口的虚拟函数WndProc(派生窗口类可以覆盖它),所有消息都通过它去分派,根据消息类型来决定怎么分派,WM_COMMAND我根据lParam的值通过表去查子类的this指针(构造的时候建立对应关系,可惜为什么 map<HWND, CWnd *> m_point 这样的语法会出错?我现在用2个Vector暂时代替 ),然后根据this去取得消息和消息处理函数的映射,然后主窗口根据返回值来判断子类是否已经处理。

chehw(chehw)兄说的确实是一种做法,感觉也挺不错!
有空2种方法都试试看!
Nintendo_hc 2005-02-26
  • 打赏
  • 举报
回复
帮你顶~
chehw 2005-02-26
  • 打赏
  • 举报
回复
子类化是将原窗口的处理过程改为自定义的处理过程,和指针无关。

以button为例,若你已创建了一个button控件,则可通过下列方法实现子类化

WNDPROC g_OldBtnWndProc;
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);

}
legendhui 2005-02-26
  • 打赏
  • 举报
回复
药兄,是不是感觉曲高和者寡啊?
loveghb 2005-02-26
  • 打赏
  • 举报
回复
哎......我不需要代码,只是郁闷了想交流交流。
:)
EnochShen 2005-02-26
  • 打赏
  • 举报
回复
15天看完3本书算什么,我让你在3天内学会C++,PHP,C#

http://www.samspublishing.com/title/0672326817
Sams Teach Yourself C++ in 24 Hours, Complete Starter Kit, 4th Edition

http://www.samspublishing.com/title/0672326191
Sams Teach Yourself PHP in 24 Hours, 3rd Edition

http://www.samspublishing.com/title/0672325381
Sams Teach Yourself Microsoft Visual C# .NET 2003 in 24 Hours Complete Starter Kit
KissXYL 2005-02-26
  • 打赏
  • 举报
回复
只能up了。 + U
Message Routing 没仔细看。没法说
loveghb 2005-02-26
  • 打赏
  • 举报
回复
是吗?我没看啊,MFC我不熟悉啊。我只写过几个简单的程序,单步跟踪过几次而已。
我的知识太浅了,我学了1个月都不到。
我想听听大家的理解啊。
EnochShen 2005-02-26
  • 打赏
  • 举报
回复
MFC的源代码你没有看吗?讲的多清楚

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧