VC中如何定义消息和消息函数

合集下载

VC++手动添加命令消息处理函数实例操作

VC++手动添加命令消息处理函数实例操作

VC++手动添加命令消息处理函数实例
操作
原文地址:/thirdballoon/item/dd320f320f7df45880f1a77a
开始了!
1.打开VC++ 6.0(废话)
2.建立一个exe程序,命名“AAA”(又废话)
点击“确定”弹出如下对话框
选择“基本对话框”,直接点击“完成”即可。

(又弹出对话框,点击“完成”)删除对话框上的默认控件,再天际一个按钮
3.添加消息处理函数
按ctrl+W,弹出类向导,按下图选择,点击“Add Function”
弹出对话框,保持成员函数名OnButton1,点击“OK”
点击“类向导”上的“确定”,退出。

4.添加新消息
点击“查看”——“资源符号”,弹出
点击“新建”,弹出,命名新消息如下:
点击“确定”,“关闭”
5.声明消息处理函数
在ClassView选项卡上双击如图高亮位置
在如下位置添加高亮代码(上边的OnButton1是我们刚才添加的,就按它的格式在下边写个差不多风格的就行,写啥都行,但是你得记住,6中得用)
6.添加映射
双击如下高亮区
在如下位置添加如下代码(还是按照上一行的风格写,添加的位置是按照BUTTON1找到的)
7.添加该新消息的实现函数(就是5中声明的具体内容)
在6中代码的最下端添加如下高亮代码
MessageBox函数功能你试了就知道了
8.设置触发事件
这个要解决的问题是NEWMESSAGE这个消息是哪里来的问题
在7中你添加的代码上有一串代码,如下,添加SendMessage
9.看效果
运行(点击小叹号)
效果如下
点击按钮(只有那一个!!右上角那个不算),效果如下
成功了!。

在C#中使用自定义消息

在C#中使用自定义消息

在C#中使用自定义消息在C#中使用自定义消息在C#中使用自定义消息非常简单,只需要下面几个简单的步骤就可以了:1、定义消息定义消息的方法与在VC中定义消息有一点点不同,比如在VC中申明一个自定义消息是这样的:#define WM_TEST WM_USER + 101而在C#中消息需要定义成Windows 系统中的原始的16进制数字,比如自定义消息public const int USER = 0x0400;那么我们在VC中申明的自定义消息,在C#中就可以做对应的声明:public const int WM_TEST = USER+101;2、发送消息消息发送是通过 Windows 提供的 API 函数 SendMessage 来实现的,它的原型定义:1.[DllImport(User32.dll,EntryPoint=SendMessage)]2.private static extern int SendMessage(3.IntPtr hWnd, // handle to destination window4.uint Msg, // message5.uint wParam, // first message parameter6.uint lParam // second message parameter7.);8.3、消息接收消息发出之后,在Form中如何接收呢?我们可以重载DefWinproc函数来接收消息。

1.protected override void DefWndProc ( ref2.System.Windows.Forms.Message m )3.{4.switch(m.Msg)5.{6.case Message.WM_TEST: //处理消息7.break;8.default:9.base.DefWndProc(ref m);//调用基类函数处理非自定义消息。

10.break;11.}12.}13.用C#调用Windows API和其它进程通信关键字:C#,API,FindWindow,FindWindowEx,SendMessage,进程,注册表设计初衷:公司为了便于网络管理,使用了IEEE802.1X的网络访问控制,这样每次开机需要输入两次登录密码,于是我就研究了一下用C#来帮我输入第二此登录的密码设计思想:主要是通过调用WindowsAPI中的一些方法,主要使用的也就是FindWindow,FindWindowEx和SendMessage这三个函数,循环遍历当前的所有窗口,找到目标窗口和进程以后把保存在特定位置的用户名密码以及域信息自动填入输入框中,然后再触发一下button事件,最后程序本身退出。

【初学VC讲稿】第4篇:自定义消息处理示例

【初学VC讲稿】第4篇:自定义消息处理示例
::PostMessage(hWnd,WM_USERMSG,0,0);
CView::OnRButtonDown(nFlags, point);
}
[7]在CMyDefMsgView类的OnDraw()函数中加入pDC->TextOut(0,0,"按下鼠标右键,测试自定义消息!");
{
}
【完成程序】
[1]生成单文档应用程序MyDefMsg,其余均默认。
[2]定义用户消息
将"const WM_USERMSG = WM_USER + 10"加入到" MyDefMsgView.h"中CMyDefMsgView类的声名的上面
const WM_USERMSG = WM_USER + 10
3. 第[6]部分不是直接调用OnMyFunction(),用SendMessage(WM_USERMSG, NULL, NULL);
不好意思啊,我看的不全,发表垃圾评论了,大家包涵.
致歉 回复此评论 修改评论 发表新评论
王辉 2003-11-20
首先向大家致歉,由于我的疏忽在【完成程序】的第[6]步中,
END_MESSAGE_MAP()
[6]编写发送自定义消息的代码
首先按照上篇介绍的方法,为CMyDefMsgView类加入WM_RBUTTONDOWN消息,在WM_RBUTTONDOWN消息的处理函数OnRButtonDown(UINT nFlags, CPoint point)中加入发送自定义消息的代码:
《一》再次对我的疏忽表示歉意!!!
《二》谢谢Bugzilla的一起讨论!!!
《三》关于WM_USER

从零开始学VC之串口通信与自定义消息

从零开始学VC之串口通信与自定义消息

从零开始学VC系列教程之三.串口通信与自定义消息课程之前:首先请大家确认一下前面两章都已经熟悉,因为一些前面已经介绍过的基础操作在这里将不再详细说明,如果有什么问题,可以翻看一下前面的两章或者留言提问.本章是基于PC机与单片机的串口通信,用到了一个动态链接库和一个自定义消息.学习目标:掌握VC下串口编程式的方法,掌握动态库的静态调用及自定义消息.课程详解:1.参照第一章新建一个基于对话框的Vc工程,名称定义为Eg03.2.工程建立后,在对话框上加入一个组合框(ComboBox),ID号改为IDC_COMPORT 用于选择使用PC机上的哪一个串口.在组合框后加入一个按钮,标题(Caption)改为”打开”,ID号改为IDC_BTN_PORTOPEN 用于打开串口,开始通信.下面加入一个编程框(EDIT),ID号改为IDC_EDIT_RECMSG 用于显示接收到的数据.在编程框下面再添加一个编程框(EDIT),.ID号改为IDC_EDIT_SEDMSG 用于添加要发送的数据. 然后在这个编程框后加入一个按钮.标题(Caption)为”发送”,ID号为IDC_BTN_SEND 最后调整位置及大小如下3.添加Lib文件.这里介绍的串口通信用的不是VC自带的MSCOMM控件.原因有两个,一是顺便介绍一下动态库和自定义消息的用法.二是MSCOMM控件使用时数据类型转换比较复杂,并且使用也不是很方便.当然,以后也会介绍多线程串口通信给大家,我们会在后面开设一章多线程编程方法,并在那里详细介绍基于多线程的串口通信.这里使用一个动态库,其实也是别人封装好了的多线程通信,名字是Pcomm.在工程下载中,给出了三个文件,分别是Pcomm.h, Pcomm.lib, Pcomm.dll,现在请大家把这三个文件拷到工程目录,也就是Eg03这个文件夹中.至于什么是动态库,这三个文件倒底是什么作用,我们做完这个例程后再解释,现在还是先按步就搬,营造一个感性认识.下面添加Lib文件到工程.首先点击[工程](Project),选择下拉式菜单中的[设置](ProjectSettings)然后会弹出一个对话框,在标签卡中选择[连接]然后在[对象/模块]中添加Pcomm.lib,完成后如上面所示,单击[确定]退出.这样,我们就为Pcomm.dll这个动态库添加了静态链接,同时,这也就是动态库的静态链接方法,当然,还有一步就是包含Pcomm.h这个头文件.在刚才的步骤中,我们将Pcomm.Lib添加到工程,这个文件主要用于指定Pcomm.dll中各个功能函数的入口及地址,Pcomm.Lib就像一个地图指出目的地的路标,而真正的函数是在Pcomm.Dll中的.当然,为了方便调用,我们还要得到Pcomm.Dll中的函数声明,这些函数声明就在Pcomm.h这个头文件中,所以,大家打开Pcomm.h这个文件,只有函数及变量定义,并没有函数过程.下面我们来添加这个文件.4.打开左边的[工作空间](WorkSpace)中选择标签[ClassView](这里大家只能看到[Class…]这一步前两章已经详细介绍过了,大家可以参考.),然后双击[OnInitDialog]就可以打开代码窗口了,在原有头文件包含后面加入串口头文件引用.输入#include ”Pcomm.h”就可以了,完成后如下图这一步我们加入了动态库的函数声明,后面就可以直接使用Pcomm.Dll中的函数了.下面我们来添加事件响应.单击工作空间中间的标签[ResourceView](大家看到的是[Reso…]),再双击[IDD_EG03_DIALOG]就可以回到控件编辑状态.首先为[打开]按钮添加代码.双击[打开]按钮,然后在按钮事件中添加.完成后如下void CEg03Dlg::OnBtnPortopen(){// TODO: Add your control notification handler code herePort=GetDlgItemInt(IDC_COMPORT);if(SIO_OK!=sio_open(Port)){MessageBox("串口打开错误");}else{sio_ioctl(Port,BaudRate,DataBits | StopBits | Parity);sio_cnt_irq(Port,CntIrq,1);}}其中, sio开头的变量及函数都是Pcomm中的,我们来解释一下. sio_open是打开某个串口,传入的参数是串口号,如果我们要打开COM1,可以用sio_open(1),返回的参数在Pcomm里面定义了,如果返回SIO_OK就表示串口打开没有问题,否则,就是打开串口失败. sio_ioctl用于设置通信的相关信息,Port中串口号, BaudRate是波特率, DataBits是数据位数, StopBits是停止位数, Parity是校验. sio_cnt_irq用于设定中断回调函数.中断回调函数其实前面的Timer定时器里也提到过,在这里,我们设定一个中断回调函数,每当串口接收到指定字节数据时,系统就会自动调用这个中断回调函数,就像单片机中的串口中断函数一样.这里的回调函数名是CntIrq,我们将在后面定义.细心的朋友一定会发现, BaudRate,DataBits | StopBits | Parity这些都没定义过啊?所以要定义一下这些变量.参照前面的加入文件的方法,在头文件引用下一行加入以下宏定义#define BaudRate B57600 //波特率#define DataBits BIT_8 //数据位#define Parity P_NONE //效验位#define StopBits STOP_1 //停止位完成后如图下面我们要定义sio_cnt_irq 一般来说,中断回调函数并不写在类里面,我们添加后如下///////////////////////////串口中断回调函数//////////////////////////////////VOID CALLBACK CntIrq(int port){if(::AfxGetMainWnd()){if(::AfxGetMainWnd()->m_hWnd){::PostMessage(::AfxGetMainWnd()->m_hWnd,WM_PCOMM,0,0);}}}学习过前面两章我们知道,这个中断回调函数只做了一件事情,就是发送一个WM_PCOMM 消息到窗口. AfxGetMainWnd()这个函数用于获得主窗口,返回类型是CWnd的指针,主窗体句柄我们是不知道的,用AfxGetMainWnd()->m_hWnd来获得.这样,消息就可到发到主窗体了.有了这个函数,每当串口接收了数据,就会发一个消息到窗体.WM_PCOMM这个消息不是系统的,也不是Pcomm本身的,它是我们自定义的一个消息,怎么定义呢?我们在前面说的宏定义后面再加入一个定义#define WM_PCOMM WM_USER+500 //自定义消息WM_USER是一个消息地址,这个是系统定义好的,从这个地址开始可以自定义消息, 我们把WM_PCOMM定义为WM_USER+500也就是说,我们定义的这个消息位于WM_USER后面的偏移500,当然,这只是个地址,与执行先后无关.这个偏移大家可以自己随便设,不与别的自定义消息冲突就行了.消息定义好了还要为消息添加关联.首先要定义一个消息响应函数,名字随便,我们这里取名为OnPcomm(),双击[工作空间]中的Ceg03Dlg就可以打开窗体的文头件,这里定义了Ceg03Dlg 这个类,我们在类定义里面添加一个成员函数.afx_msg void OnPcomm(); //这里是我们自定义的消息响应函数完成后如图此外,这里还顺便定义了一个变量,就是前面我们用到的Port 用于记录打开的串口号. public:int Port;位置就放在DECLARE_MESSAGE_MAP() 的前面.函数声明就可以了.现在来添加函数体.双击[OnInitDialog( )],然后在该文件的最后添加一个函数.写成如下形式.void CEg03Dlg::OnPcomm(){char buf[200];int end=sio_read(Port,buf,100);if(end){CString a,b="";GetDlgItemText(IDC_EDIT_RECMSG,b);buf[end]=0;for(int i=0;i<end;i++){a.Format("%X ",(unsigned char)buf[i]);b+=a;}SetDlgItemText(IDC_EDIT_RECMSG,b);}}这一段其实不难理解,因为前面两章已经介绍过多次了. sio_read是Pcomm的函数,从串口读取数据用. GetDlgItemText(IDC_EDIT_RECMSG,b);用于读出以前的历史记录,这样每次发上来的数据都放在后面连接起来.end是返回的收到的数据个数.用十六进制形式显示出来.做完了上面一些,我们差一步就可以收到数据了.因为数据发上来后,底层响应,并调用了回调函数,在回调函数里面,发出一个消息WM_PCOMM 虽然我们在后面定义了一个Pcomm()函数专门用于响应这个消息,但这个自定义消息并不是自动连接到Pcomm()的,需要添加一个消息影射才能使WM_PCOMM消息影射到Pcomm()函数.双击左边[工作空间](WorkSpace)中的DoDataExchange(CDataExchange* pDX)DoDataExchange这个函数的下面一般都这是用于定义消息影射的,将下面一段程序增加一行,完成后如下.BEGIN_MESSAGE_MAP(CEg03Dlg, CDialog)//{{AFX_MSG_MAP(CEg03Dlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BTN_PORTOPEN, OnBtnPortopen)//}}AFX_MSG_MAPON_MESSAGE(WM_PCOMM,OnPcomm) //这里是消息影射END_MESSAGE_MAP()完成以后就可以按F7编译一下,如果无误就可以接收到数据了.运行后,选择正确的串口号,按一下[打开]按钮就可以了.现在我们再来看看怎么发送数据回到控件编辑状态,双击[发送]按钮,为该按钮添加代码.void CEg03Dlg::OnBtnSend(){// TODO: Add your control notification handler code hereCString a;unsigned char b=0;GetDlgItemText(IDC_EDIT_SEDMSG,a); //取得编辑框内所有文本a.MakeUpper();//全部转换为大写for(unsigned char i=0;i<a.GetLength();i+=3){if(a.GetAt(i)>='A' && a.GetAt(i)<='Z') b=(a.GetAt(i)-55)*16; //判断填入的是字母还是数字,并把字符转换成十六进制数else if(a.GetAt(i)>='0' && a.GetAt(i)<='9') b=(a.GetAt(i)-0x30)*16;if(a.GetAt(i+1)>='A' && a.GetAt(i+1)<='Z') b+=(a.GetAt(i+1)-55);else if(a.GetAt(i+1)>='0' && a.GetAt(i+1)<='9') b+=(a.GetAt(i+1)-0x30);sio_putch(Port,b); //发送}}这一段主要是把获得的编辑框内的字串转换成十六进制的数字,转换一个发送一个.Cstring 类型以前已经提起来,应该际上是一个类, MakeUpper是一个成员函数,用于将字符串全部转成大写.GetAt也是一个成员函数,可以取出字符串中任意下标的字符. sio_putch用于发送一个字符.填写待发送数据的时候要注意,每两位中间空格一下.填入的是十六进制数据.下面再来总结一下静态方式调用动态库的方法.1.拷贝Lib,H头文件到工程路径2.在工程->设置中加入Lib模块.3.加入.h头文件,用于函数声明4.将Dll文件拷入到工程目标路径中总结一下自定义消息方法:1.用#define WM_NAME WM_USER+1 定义一个自定义消息,名称随便.一般用WM开头.WM_USER+1中的1那个数字是自己定的,一个消息就无所谓了,喜欢多少都行,如果要定义很多个消息,不要冲突就行了2.在类定义里面声明一个消息响应函数,写成afx_msg void FunctionName();格式.3.添加一个消息影射ON_MESSAGE(WM_NAME, FunctionName)注意这句后面是没有分号的.4.写好FunctionName的函数.很简单的四步就行了.。

了解VC++消息映射与命令通知

了解VC++消息映射与命令通知

了解VC++消息映射与命令通知作者:未知文章来源:网络站长评论:本问是一篇不错的VC开发技术入门文章通过这篇文章您应该可以对WINDOWS编程中的消息有一定的了解!消息映射消息的传递与发送是Windows应用程序的核心所在,任何事件的触发与响应均要通过消息的作用才能得以完成。

在SDK编程中,对消息的获取与分发主要是通过消息循环来完成的,而在MFC编程中则是通过采取消息映射的方式对其进行处理的。

相比而言,这样的处理方式要简单许多,这也是符合面向对象编程中尽可能隐含实现细节的原则。

一个完整的MFC消息映射包括对消息处理函数的原型声明、实现以及存在于消息映射中的消息入口。

这几部分分别存在与类的头文件和实现文件中。

一般情况下除了对自定义消息的响应外,对于标准Windows 消息的映射处理可以借助ClassWizard向导来完成。

在选定了待处理的Windows 消息后,向导将会根据消息的不同而生成具有相应函数参数和返回值的消息处理代码框架。

下面这段代码给出了一个完成的MFC消息映射过程:// 在.h文件中的声明//{{AFX_MSG(CMessageMapView)afx_msg void OnMove(int x, int y);//}}AFX_MSGDECLARE_MESSAGE_MAP()……// 在.cpp文件中的实现BEGIN_MESSAGE_MAP(CMessageMapView, CView)//{{AFX_MSG_MAP(CMessageMapView)ON_WM_MOVE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()……void CMessageMapView::OnMove(int x, int y){CView::OnMove(x, y);// TODO: Add your message handler code here}这里对Windows标准消息WM_MOVE做了消息映射,其中用到的BEGIN_MESSAGE_MAP、END_MESSAGE_MAP和头文件中的DECLARE_MESSAGE_MAP等均是用于消息映射的宏。

VC++6.0消息含义

VC++6.0消息含义

消息的意思1. 窗口过程每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wParam, lParam), 当窗口收到消息时系统就会调用此窗口过程来处理消息。

(所以叫回调函数)2 消息类型1) 系统定义消息(System-Defined Messages)在SDK中事先定义好的消息,非用户定义的,其范围在[0x0000, 0x03ff]之间,可以分为以下三类:1>窗口消息(Windows Message)与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。

可以是一般的窗口,也可以是Dialog,控件等。

如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL...2>命令消息(Command Message)与处理用户请求有关,如单击菜单项或工具栏或控件时,就会产生命令消息。

WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。

如果是控件, HIWORD(wParam)表示控件消息类型3>控件通知(Notify Message)控件通知消息,这是最灵活的消息格式,其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。

NMHDR包含控件通知的内容,可以任意扩展。

2) 程序定义消息(Application-Defined Messages)用户自定义的消息,对于其范围有如下规定:WM_USER: 0x0400-0x7FFF (ex. WM_USER+10)WM_APP(winver> 4.0): 0x8000-0xBFFF (ex.WM_APP+4)RegisterWindowMessage: 0xC000-0xFFFF3 消息队列(Message Queues)Windows中有两种类型的消息队列1) 系统消息队列(System Message Queue)这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理2) 线程消息队列(Thread-specific Message Queue)每一个GUI线程都会维护这样一个线程消息队列。

VC中自定义消息的方法

VC中自定义消息的方法

VC中自定义消息的方法2009-07-13 17:22第一:简易版本:定义一个自定义消息号:const UINT WM_MYMESSAGE = WM_USER + n; // 自定义消息一般大于WM_USER,然后就可以为该消息添加映射了afx_msg LRESULT OnMyMessage ( WPARAM wParam, LPARAM lParam );ON_MESSAGE ( WM_MYMESSAGE, OnMyMessage )LRESULT cxx::OnMyMessage ( WPARAM wParma, LPARAM lParam ){...}如果该消息不需要返回值,也不需要参数,那么可以使用宏ON_MESSAGE_VOID 来映射afx_msg void OnMyMessage ();ON_MESSAGE_VOID ( WM_MYMESSAGE, OnMyMessage )void cxx::OnMyMessage (){...}复杂全面版本:消息映射、循环机制是Windows程序运行的基本方式。

VC++ MFC 中有许多现成的消息句柄,可当我们需要完成其它的任务,需要自定义消息,就遇到了一些困难。

在MFC ClassWizard中不允许添加用户自定义消息,所以我们必须在程序中添加相应代码,以便可以象处理其它消息一样处理自定义消息。

通常的做法是采取以下步骤:第一步:定义消息。

推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。

#define WM_MY_MESSAGE (WM_USER+100)第二步:实现消息处理函数。

该函数使用WPRAM和LPARAM参数并返回LPESULT。

LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam){// TODO: 处理用户自定义消息...return 0;}第三步:在类头文件的AFX_MSG块中说明消息处理函数:class CMainFrame:public CMDIFrameWnd{...// 一般消息映射函数protected:// {{AFX_MSG(CMainFrame)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnTimer(UINT nIDEvent);afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);//}}AFX_MSGDECLARE_MESSAGE_MAP()}第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。

VC 多媒体技术 MCI使用

VC  多媒体技术 MCI使用

MCI 命令列表 命令说明 命令类型
返回有关 MCI 设备的信息 为一个指定的 MCI 设备设置一个终止键 播放 Windows 指定的系统声音 关闭一个 MCI 设备 获得一个 MCI 设备的性能参数 从一个 MCI 设备得到有关的信息 初始化一个 MCI 设备 从 MCI 设备返回有关的状态 从一个磁盘文件中加载数据 暂停播放 开始播放 开始记录数据 重新开始播放或录音 将数据存储到磁盘文件中 向前或向后检索 设置设备信息 停止播放或记录 常用的 MCI 函数 类型 向 MCI 发送命令消息函数 可选命令 通用命令 系统命令
说 明: (1)mail.wav 是一个 WAV 声音文件,第 4 步时已经复制到此项目文件中。程序首先打开了 MCI 设 备,并把设备标识赋给了类的成员变量 m_MCIDeviceID。注意声音文件名不要带扩展名.wav。
6、播放声音文件 用 ClassWizard 为播放按钮(IDC_PLAY) ,在 CMyDlg 类添加鼠标单击的消息映射函 数,并加如下代码: void CMyDlg::OnPlay() { //添加控件通知消息处理代码 MCI_PLAY_PARMS mciPlayParms; mciPlayParms.dwFrom=0; //从文件开始处开始播放 mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_FROM, (DWORD)(LPVOID)&mciPlayParms); } 7、在程序退出时停止播放并关闭 MCI 设备 用 ClassWizard 为 CMyDlg 类添加 WM_DESTROY 消息, 该消息映射函数能使程序 退出时停止声音文件的播放并关闭 MCI 设备。 void CMyDlg::OnDestroy() { CDialog::OnDestroy(); mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL); //停止播放 mciSendCommand(m_MCIDeviceID,MCI_CLOSE,MCI_WAIT,NULL); //关闭 MCI 设备 } (8)编译并运行程序,在单击“播放”按钮时,程序将播放声音;当单击“退出”按 钮或单击窗口的关闭按钮时,声音播放会立即停止。 7.2 MCI(媒体控制接口) 媒体控制接口(Media Control Interface)为 Windows 程序提供了在高层次上控制媒 体设备接口的能力。程序不必关心具体设备,就可以对激光唱机(CD) 、视盘机、波形 音频设备、视频播放设备和 MIDI 设备等媒体设备进行控制。对于程序员来说,可以把 MCI 理解为设备面板上的一排按钮,通过选择不同的按键(发送不同的 MCI 命令)就可以 让设备完成各种功能,而不必关心设备内部实现。例如,对于 play 按键,视盘机和 CD

VC++6.0消息含义

VC++6.0消息含义

VC++6.0消息含义消息的意思1. 窗口过程每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wParam, lParam), 当窗口收到消息时系统就会调用此窗口过程来处理消息。

(所以叫回调函数)2 消息类型1) 系统定义消息(System-Defined Messages)在SDK中事先定义好的消息,非用户定义的,其范围在[0x0000, 0x03ff]之间,可以分为以下三类:1>窗口消息(Windows Message) 与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。

可以是一般的窗口,也可以是Dialog,控件等。

如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL...2>命令消息(Command Message)与处理用户请求有关,如单击菜单项或工具栏或控件时,就会产生命令消息。

WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。

如果是控件, HIWORD(wParam)表示控件消息类型3>控件通知(Notify Message)控件通知消息,这是最灵活的消息格式,其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。

NMHDR包含控件通知的内容,可以任意扩展。

2) 程序定义消息(Application-Defined Messages)用户自定义的消息,对于其范围有如下规定:WM_USER: 0x0400-0x7FFF (ex. WM_USER+10)WM_APP(winver> 4.0): 0x8000-0xBFFF (ex.WM_APP+4)RegisterWindowMessage: 0xC000-0xFFFF3 消息队列(Message Queues)Windows中有两种类型的消息队列1) 系统消息队列(System Message Queue)这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理2) 线程消息队列(Thread-specific Message Queue)每一个GUI线程都会维护这样一个线程消息队列。

C技巧:VC中对话框上显示信息的方法

C技巧:VC中对话框上显示信息的方法

VC实现对话框上信息的显⽰ 利⽤ VC的AppWizard,可以很容易地实现⼯具条和菜单项的ToolTip,或在状态条上显⽰帮助信息,但要在对话框的控件上显⽰ToolTip和在状态条上显⽰控件信息并不容易实现。

现在,我们⽤VC中的WM_SETCURSOR 与TTN_NEEDTEXT消息就可达到⽬的。

具体操作如下: ⼀、利⽤ VC的 MFC AppWizard ⽣成⼀个 SDI 或 MDI 的应⽤程序 ⼆、编辑对话框控件的字符串资源 例如:IDC_dbBUTTON1 = “This is 肖天鹏的第⼀⾃制按钮天鹏\", 其中字符串“This is肖天鹏的第⼀⾃制按钮“将在⿏标移到控件上时显⽰在状态条上,字符串“天鹏\"将作为 ToolTip 显⽰。

三、建⽴消息映射 在对话框的头⽂件 (*.H) 中 加⼊以下代码: protected: void SetStatusText(UINT nID=0); //{{AFX_MSG(CFileOp1) afx_msg void OnDestroy(); afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); //}}AFX_MSG afx_msg BOOL OnTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult ); DECLARE_MESSAGE_MAP() 在对话框的实现⽂件 (*.CPP) 中加⼊以下代码: BEGIN_MESSAGE_MAP(CFileOp1, CDialog) //{{AFX_MSG_MAP(CFileOp1) ON_WM_DESTROY() ON_WM_SETCURSOR() //}}AFX_MSG_MAP ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnTipNotvify) END_MESSAGE_MAP() 四、编辑消息处理函数 BOOL CFileOp1::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) {// TODO: Add your message handler code here and/or call default if(pWnd==this) SetStatusText(); else {TOOLTIPTEXT m_psttt; m_psttt.hdr.hwndFrom=m_hWnd; m_psttt.hdr.idFrom=pWnd->GetDlgCtrlID(); m_psttt.hdr.code=TTN_NEEDTEXT; m_psttt.uFlags= TTF_IDISHWND; SetStatusText(pWnd->GetDlgCtrlID()); this->SendMessage(WM_NOTIFY,m_psttt.hdr.idFrom,(LPARAM)&m_psttt); } return CDialog::OnSetCursor(pWnd, nHitTest, message);} void CFileOp1::OnDestroy() {SetStatusText(); CDialog::OnDestroy();} void CFileOp1::SetStatusText(UINT nID) {if(nID==0) nID=AFX_IDS_IDLEMESSAGE; CWnd *pWnd=AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR); if(pWnd) {AfxGetMainWnd()->SendMessage(WM_SETMESS AGESTRING ,nID); pWnd->SendMessage(WM_IDLEUPDATECMDUI); pWnd->UpdateWindow();}} BOOL CFileOp1::OnTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult ) { TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; UINT nID =pNMHDR->idFrom; if (pTTT->uFlags & TTF_IDISHWND) { nID = ::GetDlgCtrlID((HWND)nID); if (nID) { TCHAR szFullText[256]; CString StrTipText; AfxLoadString(nID,szFullText); AfxExtractSubString(StrTipText,szFullText,1,′′); if(!StrTipText.IsEmpty()) strcpy(pTTT->lpszText,StrTipText); pTTT->hinst = AfxGetResourceHandle(); return(TRUE); } } return(FALSE);} 五、将该对话框作为⼀个 SDI 或 MDI应⽤程序的主框架的⼦窗⼝,⽣成这样⼀个对话框后,当你把⿏标移到某个控件 (必须有相应的字符串资源 )上时,就会出现该控件的 ToolTip和状态条信息。

vc如何自定义消息与在线程中向主窗体控件发送数据

vc如何自定义消息与在线程中向主窗体控件发送数据

vc如何自定义消息与在线程中向主窗体控件发送数据如何定义消息:1.定义消息:在对话框类的头文件中定义一个自定义消息#define WM_MY_MESSAGE WM_USER+1002.在类中声明该消息的处理函数:在该类声明的内部的protected:下声明如:afx_msg LRESULT MyMessage(WPARAM wParam, LPARAM lParam);3.在类的消息映射表中加入映射项在该类的源文件的消息映射表中添加一条消息处理记录BEGIN_MESSAGE_MAP(CMyDialog, CDialog)......ON_MESSAGE(WM_MY_MESSAGE ,MyMessage)......END_MESSAGE_MAP()4.在类的实现文件中添加该消息的处理函数添加一个消息处理函数,如:LRESULT CMyDialog::MyMessage(WPARAM wParam,LPARAM lParam){........//数据的处理return 0;}5.调用SendMessage函数或是PostMesage函数给主窗体发消息,首先获取主窗体的句柄HWND hHwnd = GetSafeHwnd();然后再线程函数里面DWORD _stdcall ListenProc(LPVOID Param){............char *sendstr="需要发送的数据";PostMessage(hWnd,WM_MY_MESSAGE,(WPARAM)sendstr,0 );............return 0L;}。

VC动态创建对话框和按钮、消息响应

VC动态创建对话框和按钮、消息响应

VC动态创建对话框和按钮、消息响应vc 动态创建对话框和按钮、消息响应1.创建非模态对话框:类*对象=new 类BOOL 对象->Create(ID,this);创建后需调用ShowWindow函数将对话框显示出来对象->ShowWindow(SW_SHOW);在非模态对话框中点击确定和取消时,对话框并不销毁,而是隐藏起来,要想销毁,需调用DestroyWindow函数2.动态创建按钮:方法1为要加按钮的类添加一个私有的CButton成为变量m_btn,还要添加一个BOOL 型的私有成员量m_bIsCreated用来确定是否创建了按钮if(m_blsCreated==FALSE)////判断如果没有创建按钮{m_btn.Create("new",/////按钮上显示的文本BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,///如果没有制定WS_VISIBLE还要调用ShowWindow将其显示出来CRect(0,0,100,100),/////左上角的坐标(0,0),长度为100,100 this,123);ID地址为123m_blsCreated=TRUE;}else{m_btn.DestroyWindow();m_blsCreated=false;}方法2用CWnd类的成员对象m_hWnd用来保存与窗口对象相关联的窗口句柄,如果窗口对象没有与任何窗口相关联,该值为NULL if(!m_btn.m_hWnd){m_btn.Create("new",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_ CHILD,CRect(0,0,100,100),thi s,123);m_blsCreated=TRUE;}else{m_btn.DestroyWindow();m_blsCreated=false;}按钮的动态创建,及添加消息响应函数btn3 = new CButton();btn3->Create("按钮3",BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(250,250,320,270),this,10003);其中最后一个参数10003,是ID号,一定要大于100,因为100以内为VC编译系统使用.按钮消息响应(1) 先在CMy12View类中加入afx_msg void PushButton3();(2) 加入消息函数对应代码BEGIN_MESSAGE_MAP(CMy12View, CView)ON_BN_CLICKED(10003, PushButton3)END_MESSAGE_MAP()(3) 编写PushButton3()void CMy12View::PushButton3(){AfxMessageBox("Button3 is pushed!");//MessageBeep(-1);}//不用在CMy12View.h中定义:public:void CMy12View::PushButton3()。

vc的菜单,工具栏

vc的菜单,工具栏

vc的菜单,⼯具栏⾸先,MFC会⾃动⽣成⼀些菜单,我们也可以在resource view中添加菜单。

点击菜单栏属性--〉左上⾓校园最图形,可以将属性页显⽰。

不会随着菜单项变动丢失。

ID号变灰的栏是不可以编辑的。

是弹出的POPUP菜单。

它不能被⽤来做响应。

⼤写字母标⽰资源。

IDI IDC IDM分别表⽰不同的类型资源。

⼀个菜单项可以由CMAINFRAM CXXXVIEW CXXApp CXXDOC view类先对其响应,接着doc类对其进⾏响应,MAINFRAM第三个对其进⾏响应,第四个响应的APP类对其进⾏响应。

Afxmessagebox框架函数,可以响应⾮WND派⽣类的弹出的提⽰,⽽wnd派⽣的可以直接⽤MessageBox函数。

消息包括三类:WM_XXX标准消息,从cwnd派⽣的类可以接收也可以接受命令消息,WM_COMMANed命令消息(通过ID号标识识别,由cmdtarget派⽣的类可以接受,⽐如说⽂档类,CEIDTview类),第三类通知消息,有cmdtarget派⽣的类可以接收。

APP和Doc类从CMDTARGET派⽣,所以不能接收标准消息。

命令消息,头⽂件消息影射中添加原形,原⽂件中添加ON_COMMND宏完成影射,还有命令函数实现。

命令函数由ONCOMMAND来处理,通知消息由ONNOTIFY来实现。

命令消息到来时⾸先到达CMAINFRAM然后到送达CVIEW 来处理,根据命令消息影射来处理,如果没有处理函数,交给DOC类,如果还没有处理函数,交还给VIEW类,------〉交还CMAINFRAM 类,如果他也没有处理函数,交给APP类来处理。

标记菜单(打对购得):在CMAINFRAM中ONCREATE中创建。

菜单属于框架窗⼝,获取菜单栏指针的⽅法为GetMenu,它返回⼀个返回CMenu的指针。

但是其指向的对象是不⼀样的,⼀个为菜单,⼀个为⼦菜单。

CMenu中的checkmenuitem⽅法可以设置标记。

c语消息机制

c语消息机制

c语言消息机制在C语言中,消息机制通常是通过函数调用、回调函数或数据结构来实现的,而不像一些高级编程语言那样内置了直接支持消息传递的机制。

下面是一些常见的消息机制实现方式:1. 函数调用:在C语言中,最常见的消息传递方式是通过函数调用。

一个模块可以调用另一个模块的函数,并通过参数传递信息。

这种方式是最基本和直接的消息传递机制。

```c// 模块1void handleMessage(int data) {// 处理消息}// 模块2int main() {// 发送消息handleMessage(42);return 0;}```2. 回调函数:另一种常见的消息机制是使用回调函数。

在这种情况下,一个模块可以注册一个回调函数,当特定事件发生时,系统调用这个回调函数。

```c// 模块1typedef void (*CallbackFunction)(int);void registerCallback(CallbackFunction callback) {// 注册回调函数}// 模块2void handleMessage(int data) {// 处理消息}int main() {// 注册回调函数registerCallback(handleMessage);return 0;}```3. 数据结构:可以使用结构体或其他数据结构来传递消息。

这可以是一个包含消息类型和数据的结构体,通过传递这个结构体来实现消息传递。

```c// 模块1struct Message {int messageType;int data;};void processMessage(struct Message msg) {// 处理消息}// 模块2int main() {// 创建消息struct Message msg = {1, 42};// 发送消息processMessage(msg);return 0;}```需要注意的是,C语言是一种相对底层的语言,不像一些高级语言(如Java、C#)直接提供高级的消息机制。

VC消息映射

VC消息映射

VC消息映射假如代码⽣成⼀个菜单项。

如下:cMenu.AppendMenu(MF_POPUP,300,_T("⽂件"));怎样让这个菜单项响应事件呢?⾸先在.h中声明:afx_msg void Hi();//声明⼀个消息处理函数Hi();然后消息映射表⾥添加映射:BEGIN_MESSAGE_MAP(CUseControlDlg, CDialog)ON_COMMAND(300, &CUseControlDlg::Hi)//第⼀个参数是控件的IDEND_MESSAGE_MAP()最后是函数体:void CUseControlDlg::Hi(){// TODO: 在此添加命令处理程序代码AfxMessageBox(_T("hi"));}这⾥⼀个知识点:Resource.h打开,可以看到你即使给控件使⽤了字母ID也是对应到⼀个宏。

对应数字。

#define IDC_BUTTON_OK 1001视类增加⼀个消息相应函数后,在源⽂件中都会增加三处代码。

1 消息相应函数原型。

在CDrawView中会有这样的代码:⼤⽓象// Generated message map functionsprotected://{{AFX_MSG(CMainFrame)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//}}AFX_MSGDECLARE_MESSAGE_MAP()在DECLARE_MESSAGE_MAP()宏上有两个AFX_MSG注释宏,在这两个注释宏之间有⼀个函数原型OnLButtonDown,因为她位于两个注释宏之间,所以是以灰⾊显⽰,还函数声明的前部有⼀个afx_msg限定符,这也是⼀个宏。

该宏表明这个函数是⼀个消息响应函数的声明。

Visual C++:消息映射、消息路由原理

Visual C++:消息映射、消息路由原理

本文作者:黄邦勇帅(原名:黄勇)本文不会对C++语法进行讲解(只会对不常用语法进行分析讲解),本文假设读者已经很熟悉C++语法了,若读者对C++语法不熟悉,请参阅本人所编著C++语法系列专题文章。

本文是VC++中的难点内容,本文对MFC中的消息映射原理,从最基础的整体设计架构开始进行讲解,并以最简单的映射开始进行模仿,然后逐步对其原理加深讲解,并以完整的可运行的程序代码进行验证,每个程序代码验证一个原理。

对复杂的消息路由原理,本文使用单独的C++程序对其内部核心原理作了深入的分析,从而避开了复杂的MFC源代码(特别是长长的标识符名称)的庞大结构及各种迂回调用,并以完整的可运行的示例代码进行模仿演示,并对其运行原理作了详尽的示例图分析,最后对MFC实现消息路由的源代码作了分析,结合模仿程序再加上对源代码的分析,让读者彻底弄明白MFC的消息是怎样进行映射,是怎样进行路由的,本文主要讲解MFC的消息映射内部原理,对于消息映射的使用是比较简单的,本文也作了示例讲解。

读完本文,读者会对MFC的消息映射内部原理有一个完全的清晰的认识,会让MFC消息映射原理变得不再那么复杂,那么难,而是简单易懂。

本文内容由浅入深,内容较为全面,本文使用VS2005、VS2010、VS2015编译器进行讲解,其中的源代码摘自VC++2005。

本文内容完全属于个人见解与参考文献的作者无关,限于水平有限,其中难免有误解之处,望指出更正。

声明:禁止抄袭、复印、转载本文,本文作者拥有完全版权。

主要参考文献:1、深入浅出MFC(第2版) 侯俊杰著华中科技大学出版社出版日期不祥2、VC++深入详解孙鑫余安萍编著电子工业出版社2006年6月3、windows程序设计(第5版珍藏版) [美]Charles Petzold著方敏张胜梁路平赵勇等译清华大学出版社2010年9月4、Visual C++2013入门经典(第7版) [美] Ivor Horton著李周芳江凌译清华大学出版社2015年1月第3部分MFC消息映射及内部原理专题1、为讲解方便,本文不使用宽字符。

VC第05讲消息及自定义消息

VC第05讲消息及自定义消息

自定义消息(3)
19 0 6
消息的类别 19 0 6
1.窗口消息(标准windows消息),该消息的产生一般与创建窗口、绘制 窗口、移动窗口、销毁窗口,以及在窗口中的操作(如移动鼠标)等操作窗 口的动作有关。标准window消息有默认的处理函数,这些函数在CWnd类 中进行了预定义(如WM_PAINT, WM_LBUTTONUP)
的窗口进行开发而不必过多关注窗口各种消息的处理。 例如窗口在被拖动时会有很多消息发送,而我们都可以
不予理睬让系统自己去处理。
理解消息机制 19 0 6
4、窗口句柄: 说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个
系统中唯一标识一个窗口,发送一个消息时必须指定一个窗 口句柄表明该消息由那个窗口接收。 而每个窗口都会有自己的窗口过程,所以用户的输入就会被 正确的处理。 例如有两个窗口共用一个窗口过程代码,你在窗口一上按下 鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗 口二。
该函数不必拥有特定的名称,因为Windows是通过提供的函数指针 访问该函数。
给程序发消息归结为Windows调用提供的通常名为WindowProc()的 函数,并借助于给该函数传递的实参给程序传递任何必要的数据。
在相应的WindowProc()函数内,编程人员应该负责根据提供的数据, 确定消息的意义以及应该采取的动作。
象处理。 框架窗口类和视图类都有间接基类CWnd,故可以处理Windows消息
和控制通知消息。应用程序类、文档类和文档模板类不是派生于CWnd ,所以不能处理这些消息。 命令消息的处理对象范围就广得多.它不仅可以由窗口类处理,还可以 由文档类,文档模板类及应用类所处理。
控件通知消息 19 0 6

C++vc中怎么使用SendMessage自定义消息函数

C++vc中怎么使用SendMessage自定义消息函数

C++vc中怎么使⽤SendMessage⾃定义消息函数vc中怎么使⽤SendMessage⾃定义消息函数:SendMessage的基本结构如下:SendMessage(HWND hWnd, //消息传递的⽬标窗⼝或线程的句柄。

UINT Msg, //消息类别(这⾥可以是⼀些系统消息,也可以是⾃⼰定义,下⽂具体介绍,)WPARAM wParam, //参数1 (WPARAM 其实是与UINT是同种类型的,//在vc编译器中右键有个“转到WPARAM的定义”的选项可以查看。

LPARAM lParam); //参数2其中⼀些参数的由来如下://typedef unsigned int UINT;//typedef UINT WPARAM;//typedef LONG LPARAM;//typedef LONG LRESULT;例如可以⽤以下语句:::SendMessage(this->m_hWnd, WM_MY_DOSOME, (WPARAM) 0, (LPARAM) 0);这⾥我发送的消息是本窗体接收的,所以句柄⽤:this->m_hWnd这⾥的消息类别WM_MY_DOSOME就是我⾃定义的,在接收消息的窗体或线程所在的头⽂件⾥:#define WM_MY_DOSOME WM_USER+1 // do something当然你还可以定义更多如:#define WM_DOOTHER WM_USER+2 // do other表⽰要做⼀些事情。

到这⾥,可能⼤家还是对消息类别有点模糊,不要担⼼,我下⾯很快就讲到。

我们发了⼀个消息出去,那么接收⽅要能识别这个消息是⼲什么,就是通过消息类别来区分,并且开始去做这个消息对应要处理的事情。

如下:⼀:编写⼀个事情:我们在接收窗体⾥定义⼀个这样的事情(过程),afx_msg LRESULT DoSomeThing(WPARAM iParam1,LPARAM iParam2){MessageBox("收到消息了,我要开始做⼀些事情了。

VC编程中的消息机制及关键函数

VC编程中的消息机制及关键函数

VC编程中的消息机制及关键函数
胡昌林;李永军;卢海星;陶贵明
【期刊名称】《微计算机信息》
【年(卷),期】2006(000)05X
【摘要】首先陈述消息在VC编程中的作用、理解消息机制的重要性;然后介绍消息的分类。

包括其作用、产生方式和处理方式的不同。

重点举出VC编程中的关键的机制作为例子,一方面对消息机制的实质有深刻理解。

另一方面也对VC编程中的基本模式有所领会。

最后给出几个实用小技巧和VC编程中容易出现的问题及其解决办法。

基本概括了VC编程中基本技能。

【总页数】3页(P250-251,279)
【作者】胡昌林;李永军;卢海星;陶贵明
【作者单位】军械工程学院
【正文语种】中文
【中图分类】TP392
【相关文献】
1.基于DLL的数据共享技术和Windows消息机制在摩托车整车检测系统中的应用 [J], 王亚晓;劳奇成
2.MVC编程模型在Web程序中的应用及Java实现 [J], 孙莹;许俊华;张毅;贺清峰
3.VC编程中的消息机制及关键函数 [J], 胡昌林;李永军;卢海星;陶贵明
4.VC编程中位图在状态条中的加入探析 [J], 柳建东
5.基于消息机制的医院信息平台建设关键点设计与研究 [J], 贾末;王永刚;孙震;张沛;计虹
因版权原因,仅展示原文概要,查看原文内容请购买。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC中如何定义消息和消息函数
遇见恒星编辑
本教程结合一个实例来讲解。

首先要定义我们自己的消息类型的值,如下
(代码在socket_talkDlg.h中。

)
#define WM_RECVDATA WM_USER+1
其次是在头文件中声明消息函数,如下
(代码在socket_talkDlg.h中。

)
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg LRESULT OnRecvData(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
其中红包部分是我们对应要声明的消息函数,这里注意,在VS2008下消息函数的返回类型都要定义为LRESULT,不然会报错。

接下来是为消息WM_RECVDATA要添加消息映射,如下:
(代码在socket_talkDlg.cpp中)
BEGIN_MESSAGE_MAP(Csocket_talkDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDOK, &Csocket_talkDlg::OnBnClickedOk)
ON_MESSAGE(WM_RECVDATA,&OnRecvData)//处理WM_RECVDATA消息相对应的函数为OnRecvData(WPARAM wParam,LPARAM lParam)
END_MESSAGE_MAP()
红色部分是我们要定义的消息映射,其中OnRecvData是我们的消息映射函数。

注意,这里是定义在Csocket_talkDlg的类位置中,而不是CAboutDlg的类位置中
接下来是消息映射函数OnRecvData的定义实现,如下:
(代码在socket_talkDlg.cpp中)
LRESULT Csocket_talkDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
//注意要进行边界检查,防止字符太多出现溢出
char *str = (char *)lParam;
char strTemp[1060];
if (this->EditFull == FALSE)
{
GetDlgItemTextA(this->m_hWnd,IDC_EDIT1,strTemp,1060);
}
else
{
this->EditFull = FALSE;
lstrcpyA(strTemp,this->recvTemp);
delete this->recvTemp;
}
int len = lstrlenA(str);
int len2 = lstrlenA(strTemp);
int len3 = len + len2;
char *str_all = new char[len3+5];
lstrcpyA(str_all,strTemp);
lstrcatA(str_all,"\r\n");
lstrcatA(str_all,str);
if (len3 >= (1060+1050))
{
this->EditFull = TRUE;
this->recvTemp = new char[len];
lstrcpyA(this->recvTemp,str);
}
SetDlgItemTextA(this->m_hWnd,IDC_EDIT1,str_all);
return TRUE;
}
然后最后就是我们要如何来使用这个定义的消息函数了,如下:
(代码在socket_talkDlg.cpp中的DWORD WINAPI Csocket_talkDlg::RecvProc(LPVOID lparameter)函数中)
::SendMessage(hwnd,WM_RECVDATA,0,(LPARAM)recvBuf);//发送WM_RECVDATA的消息,交给对应的消息函数OnRecvData去处理
或者是:
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);//发送WM_RECVDATA的消息,
这里
OnRecvData(WPARAM wParam,LPARAM lParam)
我们要用到的是消息过程中要用到的传递参数:wParam和lParam,对应我们在调用::SendMessage(hwnd,WM_RECVDATA,0,(LPARAM)recvBuf)中的 0 和recvBuf,我们只用了lParam参数。

那么我们在程序中每次调用::SendMessage(hwnd,WM_RECVDATA,0,(LPARAM)recvBuf),调用消息类型为WM_RECVDATA的消息时候,SendMessage就会把两个参数wParam和lParam(对应的就是0 和 lParam)传递给消息处理函数OnRecvData(WPARAM wParam,LPARAM lParam)去处理了。

相关文档
最新文档