码迷,mamicode.com
首页 > 其他好文 > 详细

如何正确使用SendMessage进行发送消息

时间:2014-12-13 23:13:38      阅读:685      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   color   使用   sp   on   文件   div   

1、SendMessage的基本结构:

SendMessage(

HWND hWnd, //消息传递的目标窗口或线程的句柄。

UINT Msg, //消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,)

WPARAM wParam, //参数1 (WPARAM 其实是与UINT是同种类型的,

LPARAM lParam); //参数2

其中一些参数的由来如下:

//typedef unsigned int UINT;

//typedef UINT WPARAM;

//typedef LONG LPARAM;

//typedef LONG LRESULT;

2、用法实例:

 1 void CTextShow::OnBnClickedGraybtn()
 2 {
 3     // TODO: 在此添加控件通知处理程序代码
 4     MyDib dib(FilePathStr);
 5     dib.BitmapToIplImage();
 6     int width=dib.GetWidth();
 7     int height=dib.GetHeight();
 8     IplImage* src=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
 9     cvCvtColor(dib.pIplImage,src,CV_RGB2GRAY);
10     cvSmooth(src,src,CV_MEDIAN,11);
11     cvThreshold(src,src,40,255,CV_THRESH_BINARY);
12     ::SendMessage(this->m_hWnd,WM_SHOWIMAGE,0,(LPARAM)src);
13 }

实现在新建对话框中,点击灰度按钮,能将图片转化二值图,其中SendMessage就是二值图给显示出来;点击后,发给带参数的消息(WM_USER+1)给主窗口,WM_SHOWIMAGE就是自定义消息的标识符,首先需要新建对话框设置为主窗口,在CTextShow的构造函数加入:

 

1 AfxGetApp()->m_pMainWnd=this;

 

所以SendMessage中this->m_hWnd就是主窗口,而将其改为GetDlgItem(IDC_PICShOW)->m_hWnd,其中IDC_PICSHOW是显示图片控件的ID,不知道为什么显示不出来图片。具体流程:

1)在接收消息的窗体以及线程所在的头文件里定义:#define WM_SHOWIMAGE  WM_USER+1

2)然后接下来定义一个消息需要映射的函数,如下: afx_msg LRESULT OnShowImage(WPARAM wParam, LPARAM lParam);

         注意格式必须是:两个参数必不可少,返回类型一定为LRESULT

3)添加消息函数映射:ON_MESSAGE(WM_SHOWIMAGE,OnShowImage)

      注意这里必须是ON_MESSAGE, 不能使用ON_COMMAND, 前者主要针对用户自定义消息,后者针对WM_COMMAND命令,比如菜单、工具栏等.

4)实现消息函数:

1 LRESULT CTextShow::OnShowImage(WPARAM wParam, LPARAM lParam)
2 {
3     IplImage* plmgSrc=(IplImage*)lParam;    
4     CIplImageToBitmap IplImageToBitmap;
5     IplImageToBitmap.ShowImageAuto(plmgSrc,GetDlgItem(IDC_PICSHOW));
6     return 0;
7 }

3、总结:

无论时利用MFC向导还是手动添加消息处理时,都需要在源文件中增加三处代码:

1、在类的定义中添加消息处理成员函数的函数声明。

2、在类的消息映射表中加入相应的消息映射表项。

3、在类的实现中加入该消息处理成员函数的函数实现。

如果时自定义消息,则还需要在头文件中定义自定义消息的宏。

 

例如:要在ABC类中添加个自定义消息UM_AAA的处理,当消息产生的时候,响应OnAAA( )函数。可以按照下面四个步骤来实现:

1、在头文件ABC.H中定义自定义消息的宏。

#define UM_AAA WM_USER+1

在windows系统中提供了大量的消息的同时可以给用户自定义消息提供了空间,我们在自定义消息的宏的时,只有选择WM_USER以上的数值就不会与系统提供的消息冲突了。

2、在头文件ABC.H中声明消息响应函数的OnAAA( )。

protected:

//{{AFX_MSG (ABC)

afx_msg void OnAAA( );

//}}AFX_MSG

DECLARE_MESSAGE_MAP( )

消息响应函数应该放在DECLARE_MESSAGE_MAP( )之前,AFX_MSG注释宏之间。该函数声明前不有一个afx_msg限定符,这也是一个宏,这个宏表面这个函数是一个消息响应函数的声明。

3、进行消息映射

BEIGIN_MESSAGE_MAP(ABC)

//{{AFX_MSG_MAP(ABC)

ON_MESSAGE(UM_AAA, OnAAA)

//}}AFX_MSG_MAP

END_MESSAGE_MAP( )

在END_MESSAGE_MAP( )之前的AFX_MSG_MAP注释宏之间用ON_MESSAGE( )将UM_AAA和OnAAA响应函数相关联起来

4、在ABC.CPP中将消息响应函数的实现

void OnAAA( )

{……}

只有按照上面的4个步骤,就可以根据自己的需要,在系统程序中添加合适的消息和响应函数了。

 

如何正确使用SendMessage进行发送消息

标签:style   blog   ar   color   使用   sp   on   文件   div   

原文地址:http://www.cnblogs.com/gzy-zju-edu/p/4161967.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!