我已经模拟了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.   

    MFC的源代码你没有看吗?讲的多清楚
      

  2.   

    是吗?我没看啊,MFC我不熟悉啊。我只写过几个简单的程序,单步跟踪过几次而已。
    我的知识太浅了,我学了1个月都不到。
    我想听听大家的理解啊。
      

  3.   

    只能up了。 + U
    Message Routing 没仔细看。没法说
      

  4.   

    15天看完3本书算什么,我让你在3天内学会C++,PHP,C#http://www.samspublishing.com/title/0672326817
    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
      

  5.   

    子类化是将原窗口的处理过程改为自定义的处理过程,和指针无关。以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);}
      

  6.   

    那样是可以,但是我不希望那样,如果向上述这样做的话,就要为每个响应WM_COMMAND的子类定义一个static的函数了,而且消息不是从一个统一的地方流出并且分派了。我现在是在一个static的函数里调用主窗口的虚拟函数WndProc(派生窗口类可以覆盖它),所有消息都通过它去分派,根据消息类型来决定怎么分派,WM_COMMAND我根据lParam的值通过表去查子类的this指针(构造的时候建立对应关系,可惜为什么 map<HWND, CWnd *> m_point 这样的语法会出错?我现在用2个Vector暂时代替 ),然后根据this去取得消息和消息处理函数的映射,然后主窗口根据返回值来判断子类是否已经处理。 chehw(chehw)兄说的确实是一种做法,感觉也挺不错!
    有空2种方法都试试看!
      

  7.   

    跟着MFC学就行了。
    两种方法都要,SetWindowLong到一个公用的消息处理函数里去,再调用类的虚函数
      

  8.   

    若仅仅只想实现窗口的子类化,而不是想要模仿整个MFC的话,你应该参考以下 Paul DiLacia 大师的CSubclassWnd类的设计——简单而高效。
      

  9.   

    :)
    哈,我怎么可能模仿整个MFC,我只是好玩写点拉。
      

  10.   

    我都试验过了,如果不替换窗口处理过程的话,WM_COMMAND消息不能转化为WM标准消息
    比方说在一个BUTTON上点一下,按方法2做只能收到WM_COMMAND消息,这样做只是把处理的地方换到子类去,并不算是真正意义上的子类化,只有第1种做法才是真正子类化,可以收到WM_LBUTTONDOWN消息。(但是第1种做法我程序还有点问题......)结帖!