窗体和子窗体均有一个Edit控件和一个按钮,点击父窗体按钮显示子窗体;点击子窗体按钮后,子窗体中Edit控件的值显示在在父窗体中的Edit控件中。 less
一、在父窗体定义静态变量
二、传窗体的指针给子窗体
三、子窗体调用GetParent
四、向父窗体sendMessage 函数
方法1,使用静态变量,若是有多个子对象和父对象存在时,处理比较麻烦。
方法2, 传指针给子窗体,子窗体须要另外保存这个指针,此方法可由方法3替代。
方法3, 比方法2优,但与方法2都与父窗体耦合较深。
方法4,推荐采用方法;采用这种方法,子窗体能够放到任何父窗体上,只要父窗体响应此消息便可。 this
SendMessage的基本结构以下 线程
其中一些参数的说明以下: 指针
//typedef unsigned int UINT;
//typedef UINT WPARAM;
//typedef LONG LPARAM;
//typedef LONG LRESULT; code
能够用如下语句发送消息: 对象
这里我发送的消息是本窗体接收的,因此句柄用:this->m_hWnd。 字符串
这里的消息类别WM_MY_DOSOME是用户自定义的,在接收消息的窗体或线程所在的头文件里: 编译器
咱们发了一个消息出去,那么接收方要能识别这个消息是干什么,就是经过消息类别来区分,而且根据消息类别去调用消息处理函数。接收方须要作如下几步: 源码
一、在接收方编写一个消息处理函数
咱们在接收窗体里定义一个消息处理函数,以处理接收到该消息后应该作什么事情。
编写消息处理函数有3点须要格外注意:
1)使用了afx_msg,而且要将afx_msg LRESULT DoSomeThing(WPARAM iParam1,LPARAM iParam2) 改写到头文件的 {{AFX_MSG ... AFX_MSG}}包含的灰色部分,以下:
2)参数有2个,WPARAM iParam1,LPARAM iParam2,哪怕没有东西传进来也要写,否则会吃苦头的,vc里不会提醒你少写了一个,但若是不写可能会产生莫名奇妙的错误。
3)类型用 LRESULT,完了要return 0;
二、在接收方定义各类消息类型与消息处理函数的映射关系,即让接收方知道每一个消息要调用哪一个处理函数
映射关系书写示例以下
到这里,当发送方用SendMessage,发出一个WM_MY_DOSOME类型的消息过来的时候,接收方就会去作DoSomeThing(WPARAM iParam1,LPARAM iParam2);
发送方发出一个WM_DOOTHER类型的消息过来的时候,接收方就会去作DoOther(WPARAM iParam1,LPARAM iParam2)。
.h头文件中要定义的内容
.cpp文件要实现的内容
ON_MESSAGE(WM_MYMSG, OnMyMessage)
//利用ON_MESSAGE()宏在自定义消息与其处理函数间创建映射关系
void CModelessDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
//从lParam中取出CString对象的指针,并将字符串内容在IDC_MSGEDIT中显示出来
{
CString *str;
str=(CString *)lParam;
SetDlgItemText(IDC_EDIT,*str);
}
按下按钮发送消息