当前位置:C++技术网 > 资讯 > mfc的消息机制,多窗口的互动

mfc的消息机制,多窗口的互动

更新时间:2015-06-27 17:54:10浏览次数:1+次

1、对于新手来说,消息机制到底是什么呢?消息又是怎么产生和传递的呢。
    本网站的消息机制搜索,有兴趣了解的可以看一下。
    我用简单的话说:
    Win32

    一个hwnd对应一个窗体,我们发送接收的消息都与hwnd相关,而与父子关系的窗口无关。一旦获得hwnd你就可以向它发送消息。
    MFC
    一旦你获取了CWnd*,那么你就可以控制这一个窗口。当然也可以向它发消息。同样于父子窗口是不相关的。
    Hwnd与CWnd的区别:类型不同,使用的时候,意义相同。Hwnd通过C++面向对象的封装就变成了CWnd。
    不懂消息机制的就回头去学吧。

2、知道消息机制以后,多窗口怎么互动,重点是hwnd句柄。
    我们通常会想方设法地去获得这个hwnd/CWnd,无论是用全局变量还是用class的成员变量,我们都希望在用的时候可以有方法可以获取。
    如果是父子窗口,我们通常会把子窗口作为成员变量。
    例如:

pulbic : CChild1 m_child1; //头文件要include””子窗体的文件头。
     那么我们的每一个方法都可以操作子窗体了,包括移动moveWindow,sendmessage()等等。无论何时何地(除了destoryWindows()以后,别告诉我你销毁了窗体还想用他们,那是作死啊~)。


3、子窗口传递消息给父窗口,简单消息传递。
    那么子窗体怎么传递消息给父窗体呢?通常我们会用自定义消息 就是著名的:

#define WM_YOURMESSAGE WM_USER+1
     然后我们用向导类添加一个自定义消息,他就自动生成对应该消息的方法。如果你问我win32该怎么添加呢?那就麻烦了,百度一下吧。
    我们在子窗口的时候可以这么做
Auto father =  (father*)(GetParent());
     这样我们就获得CWn*d了。(什么你不知道auto?C++新语法啊!什么你说你获取的是father* 而不是CWnd*?回顾一下C++的多态吧,所有窗体类都是从CWnd继承来的,当然可以算是获取了CWnd)
    然后我们可以这么做:
father->sendMessage(WM_YOURMESSAGE );
     当然你也可以直接调用father的方法。
4、那么不是父子窗口应该怎么办呢?
    这时候就要发送消息了,告诉那个拥有hwnd/CWnd 的窗口,让它返回一个指针给你吧。例如:
Cdlg Anthor_dlg;
sendMessage(WM_GETANTHOR_DLG,0,&Anthor_dlg);
     让函数从变量返回一个指针,你就拥有了这个窗体,然后为所欲为。