用户自定义消息SendMessage的使用
2013-10-12 20:56
323 查看
这里主要讲一下mfc中SendMessage的使用方法。传递消息主要分4步:
1. 在类的定义中声明消息函数:afx_msgvoid AAA();
2. 在相应的cpp文件中的MESSAGE_MAP区域内添加ON_MESSAGE(MESSAGE_ID,AAA),其中参数1为要传递消息的ID,参数2为刚刚声明的函数名称,不用带括号。
3. 实现消息函数:在cpp文件中添加
LRESULT 类名::AAA(WPARAM
wparam,LPARAM lparam)
{
执行内容
……
return 0;
}
4. 发送消息:在需要发送消息的地方添加下列语句:
HWND hWnd = ::FindWindow(
m_hWnd, NULL, NULL, WINDOW_TEXT ) ;
FromHandle(hWnd)->SendMessage(MESSAGE_ID,a,b);
其中,m_hWnd为接收消息的父窗口的句柄,WINDOW_TEXT为接收消息窗口的标题,得到的hWnd为接收消息窗口的句柄。调用该窗口的SendMessage函数,MESSAGE_ID为刚刚设定的消息ID,a和b是要传递的参数。
注:在这4个步骤中,前三个我在做的时候基本没什么障碍。问题主要出现在第4步。开始找到网上的例子给的都是FindWindow函数,怎么用都不好使。后来看到有人说FindWindow是找操作系统下打开的窗口的句柄,找窗口中子窗口要用FindWindowEx函数。我也尝试过用对话框的ID找到相应的句柄,像GetDlgItem(ID)函数一样,未果。我使用的对话框都是没有标题栏的,所以也就没有窗口的标题,当然这并不会影响我设置标题。只要在生成该窗口的区域内添加SetWindowText(“窗口标题”)就可以了。也就是说窗口标题可以设置,但是不会显示。最后一点在SendMessage()函数中,MFC默认传递的参数是WPARAM和LPARAM型(一个是UINT型,一个LONG型),如果要传递浮点类型,或者其它不是整数的类型,就可以用指针的形式传递(如果发送方只是申请一个变量并以地址的形式传递,然后接收方以指针的形式接收,如果在执行完SendMessage之后原函数体立即结束了,我不知道在接收函数体接收和使用该变量的之间的一瞬间,该内存区域会不会被占用,我觉得还是有这种可能的。所以我觉得还是在原函数体先申请一块内存,然后在接收函数使用完之后再释放该内存比较合理吧)。
下面介绍几个发送和接受的例子
一、从发送对话框发送小数到接受对话框1中。
1. 在接受对话框1的类的定义中加入
afx_msg LRESULT GetDouble(WPARAM wparam,LPARAM lparam);
2. 在对应的cpp文件中加入
ON_MESSAGE(GET_DOUBLE,Receive1Dlg::GetDouble)
3. 在函数实现部分加入
LRESULT Receive1Dlg::GetDouble(WPARAM wparam, LPARAM lparam)
{
CString str;
double* a=(double*)wparam;
str.Format("%lf",*a);
CEdit* edit1=(CEdit*)GetDlgItem(IDC_EDIT1);
edit1->SetWindowText(str);
delete a;
return 0;
}
4. 在发送消息的函数中加入
double *a=new double;
*a=1.111;
HWND hWnd = ::FindWindowEx( this->GetParent()->m_hWnd, NULL, NULL, RECEIVE1_TITLE);
FromHandle(hWnd)->SendMessage(GET_DOUBLE,(WPARAM)(a),0);
注:在这个部分中是传递1个小数。第3步是将得到的小数显示到编辑框中。第4步中先为double类型的变量申请一块内存并为其负值,然后以指针的形式发送消息过去。在第3步中首先获得double型指针,最后将内存释放。
二、从发送对话框发送字符串到接受对话框2中。
1. 在接受对话框2的类的定义中加入
afx_msg LRESULT GetString(WPARAM wparam,LPARAM lparam);
2. 在对应的cpp文件中加入
ON_MESSAGE(GET_STRING,Receive2Dlg::GetString)
3. 在函数实现部分加入
LRESULT Receive2Dlg::GetString(WPARAM wparam,LPARAM lparam)
{
CString *str=(CString*)wparam;
CEdit* edit1=(CEdit*)GetDlgItem(IDC_EDIT1);
edit1->SetWindowText(*str);
delete str;
return 0;
}
4. 在发送消息的函数中加入
CString *p_str=new CString("Hello");
HWND hWnd = ::FindWindowEx(this->GetParent()->m_hWnd, NULL, NULL, RECEIVE1_TITLE);
hWnd=::FindWindowEx(FromHandle(hWnd)->GetDlgItem(IDC_TAB1)->m_hWnd, NULL, NULL, RECEIVE2_TITLE);
FromHandle(hWnd)->SendMessage(GET_STRING,(WPARAM)(p_str),0);
注:在这个部分中是传递1个字符串。第3步是将得到的字符串显示到编辑框中。第4步中先为CString类型的变量申请一块内存并为其赋值,然后以指针的形式发送消息过去。这个我在获得对话框句柄的时候遇到了一些问题,首先一定要弄清楚各个窗口之间的父子关系,并知道对话框和控件获得句柄的方法是不同的。在这个例子中,接收对话框2的父窗口是那个Tab
Control,Tab Control的父窗口是接收对话框1,接收对话框1和发送对话框拥有共同的父窗口。调理清晰了就好写了。HWND
hWnd = ::FindWindowEx(this->GetParent()->m_hWnd, NULL, NULL, RECEIVE1_TITLE);前边已经说过了,是获得了接收对话框1的句柄,下边那条语句中的FromHandle(hWnd)->GetDlgItem(IDC_TAB1)->m_hWnd是获得Tab
Control的句柄,hWnd= ::FindWindowEx
(FromHandle(hWnd)-> GetDlgItem(IDC_TAB1)-> m_hWnd, NULL, NULL, RECEIVE2_TITLE);就是获得接收对话框2的句柄了。
三、从发送对话框发送结构到接受对话框2中。
1. 在接受对话框1的类的定义中加入
afx_msg LRESULT GetStruct(WPARAM wparam,LPARAM lparam);
2. 在对应的cpp文件中加入
ON_MESSAGE(GET_STRUCT,Receive2Dlg::GetStruct)
3. 在函数实现部分加入
LRESULT Receive2Dlg::GetStruct(WPARAM wparam,LPARAM lparam)
{
SendStruct* ss=(SendStruct*)wparam;
CString str;
str.Format("%d,%d,%d,%d",ss->a,ss->b,ss->c,ss->d);
CEdit* edit1=(CEdit*)GetDlgItem(IDC_EDIT1);
edit1->SetWindowText(str);
free(ss);
return 0;
}
4. 在发送消息的函数中加入
SendStruct *ss = (SendStruct *)malloc(sizeof(SendStruct));
ss->a=1;
ss->b=2;
ss->c=3;
ss->d=4;
HWND hWnd = ::FindWindowEx(this->GetParent()->m_hWnd, NULL, NULL, RECEIVE1_TITLE);
hWnd = ::FindWindowEx( FromHandle(hWnd)-> GetDlgItem(IDC_TAB1)-> m_hWnd, NULL, NULL ,RECEIVE2_TITLE);
FromHandle(hWnd)->SendMessage(GET_STRUCT,(WPARAM)(ss),0);
相关文章推荐
- 用户自定义消息SendMessage的使用
- 用户自定义消息SendMessage的使用
- 用户自定义消息SendMessage的使用
- 使用用户自定义消息
- MFC中不同对话框间使用SendMessage发送自定义消息的具体实现
- vc中使用SendMessage正确发送自定义消息的方法
- vc中使用SendMessage正确发送自定义消息的方法
- VC++中使用用户自定义消息及自定制窗口技巧
- MFC的自定义消息(用户消息)的定义与使用
- vc中怎么使用SendMessage自定义消息函数
- vc中怎么使用SendMessage自定义消息函数
- 如何使用SendMessage自定义消息函数 2010-11-12 11:41
- vc中怎么使用SendMessage自定义消息函数
- MFC的自定义消息(用户消息)的定义与使用
- vc中怎么使用SendMessage自定义消息函数
- vc中使用SendMessage正确发送自定义消息的方法
- MFC使用SendMessage()发送自定义消息实现进程间通信
- MFC的自定义消息(用户消息)的定义与使用
- MFC使用SendMessage()发送自定义消息实现进程间通信
- 一个简单的用户自定义消息传参的实例 postMessage 和 SendMessage