消息映射和消息回调有什么区别

消息映射和消息回调有什么区别,第1张

消息映射是把消息与回调函数关联起来

例如ON_COMMAND(id_DataAccess, OnDataAccess)

它会告诉系统消息的产生者是id_DataAccess,消息的类型是COMMAND,消息的回调函数是OnDataAccess

消息回调就是调用回调函数,MFC响应消息的机制都是以回调函数的形式进行的,这就要求你在定制消息时有几步必需做的步骤

1定义消息

2消息映射

3消息响应声明

4消息响应函数的实现

消息响应就是回调函数,这些在孙鑫老师的视频中都有提到

(1)当然是这样。函数声明能不带参数类型么?

(2)参数类型是32位长整型,所以可以用作表示任何类型的指针。一般情况下随便用任何一个都够了。

一般情况下是这样工作的:将需要传递的参数包装成一个结构体对象,在发出消息的时候把这个对象的地址作为参数。因此,在调用时处理函数就可以拿到这些数据了。微软怕一个地址不够用,所以给了两个作为备用。

/ 创建自定义消息程序步骤: 1:用ClassWard创建一个新project命名为:MessageTest 2:此project选单文档,取消Active X支持,取消打印支持,其它默认。finish 3:在菜单中添加一个菜单“测试”其子菜单为"test",并映射其执行方法:OnTest 4: 制造消息发送者:在资源中新增一个对话框,并用classward为其创建类名为 TestDialog然后在此对话框中加入一个Button,并用classward为其映射执行函数 OnButton1()。 5:在TestDialogh文件中加入一行#define WM_MY_MESSAGE (WM_USER+100) 用来定义自己的消息 6:在TestDialogcpp文件中加入一行:#include "MainFrmh" 7:为对话框的Button按钮加入发送消息代码如下: void TestDialog::OnButton1() { // TODO: Add your control notification handler code here //获取当前框架指针 CMainFrame pMainFrame=(CMainFrame )AfxGetApp()->m_pMainWnd; //获取当前view指针 CView pView=pMainFrame->GetActiveView(); if(pView!=NULL) { pView->PostMessage(WM_MY_MESSAGE,0,0); } } 以上是对于消息的发送者工作己完成 8:以下是对于消息接收者 在MessageTestViewh中也要定义:#define WM_MY_MESSAGE (WM_USER+100) 9:并在MessageTestViewh中定义消息映射函数如下: protected: //{{AFX_MSG(CMessageTestView) afx_msg void OnTest(); afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); //此处为自定义消息映射函数 //}}AFX_MSG DECLARE_MESSAGE_MAP() 10:在MessageTestViewcpp文件中,声明消息响应函数如下: BEGIN_MESSAGE_MAP(CMessageTestView, CView) //{{AFX_MSG_MAP(CMessageTestView) ON_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //自定义消息响应函数 ON_COMMAND(ID_TEST, OnTest) //}}AFX_MSG_MAP END_MESSAGE_MAP() 11:在MessageTestViewcpp文件中实现消息响应函数如下: LRESULT CMessageTestView::OnMyMessage(WPARAM wParam,LPARAM lParam) { MessageBox("OnMyMessage!Receiver"); return 0; } 12:将消息发送者与消息响应者联系起来。即:将对话框与菜单联系起来。 实现CMessageTestView的OnTest方法如下: void CMessageTestView::OnTest() { // TODO: Add your command handler code here TestDialog dlg; dlgDoModal(); } 13:以上完成了所有自定义消息过程 / //////////////////////////////////////////////////////////////// 2:如何编写一个程序在运行后马上删除自己。 / 以下代码在VCnet2002、BCB60、DevC++498环境下均编译通过,并正常运行 / / Creamdog保留所有权力 / #include int main( int argc, char argv[] ) { HMODULE module = GetModuleHandle(0); CHAR buf[MAX_PATH]; GetModuleFileName(module, buf, sizeof buf); CloseHandle(HANDLE(4)); __asm { lea eax, buf; push 0; push 0; push eax; push ExitProcess; push module; push DeleteFile; push UnmapViewOfFile; ret; } return 0; }

希望采纳

WM_COMM_RXCHAR 这个消息在那个文件里面定义的,把头文件#include进来

编译器说的是 WM_COMM_RXCHAR 没有定义!而不是函数!

你写的串口程序,我对串口不熟悉。

可以解决:

1、如果WM_COMM_RXCHAR 是你用第三方的库发出的消息,那么在第三方库的头文件里面肯定有个地方定义了WM_COMM_RXCHAR 消息;

2、如果WM_COMM_RXCHAR是你自定义的消息, 你需要在头文件SerialPortTestDlgh里面加如下一句话

#define WM_COMM_RXCHAR WM_USER+5

WINDOWS *** 作系统总是将HWND窗口句柄同创建它的线程进行关联。并且在很多文档中再三强调,窗口处理函数应该放在一个线程中进行调用,这个线程就是创建窗口的线程。

诸如一些训诫指出--最好把所有的窗口创建都放在主线程中,不要在多个线程中进行窗口创建和函数处理,响应用户界面的消息处理在主线程中进行,将和用户界面无关的工作放在其他线程中进行,这些其他线程又派生出工作线程和后台线程的概念。不管如何叫法,其中心思想还是如开始所说,不要在多线程中处理HWND。

MFC也有这样的原则,因此简单将窗口类指针,如CWnd,CEdit传给新线程,其调用可能会正常,可能就会断言失败。

楼主看下MSDN的说明,里面明确提出,在新线程中,可以将HWND传给新线程,而不是窗口类指针。基于这样的说明正常处理应该是:

1)分配全局缓存,用来存储ListCtrl的文本信息。

TCHAR GlobalBuffer[200];

2)定义自定义消息

#define WM_GETMYTEXT (WM_USER + 10)

3)映射自定义消息函数

BEGIN_MESSAGE_MAP(CMyWindow, CDialog)

ON_MESSAGE(WM_GETMYTEXT, OnGetText)

END_MESSAGE_MAP

4)定义自定义消息函数

HRESULT CMyWindow::OnGetText(WPARAM wParam, LPARAM lParam)

{

this->m_listGetItemText((int)wParam, (int)lParam, GlobalBuffer, 200);

return 0L;

}

5)将窗口句柄传给新线程

6)在新线程中获取文本

int row = 3;

int col = 4;

SendMessage(hwndList, WM_GETMYTEXT, (WPARAM)row, (LPARAM)col);

以上是个大概的思想可以灵活使用,譬如WPARAM和LPARAM可以充分利用,另外就是SendMessage是有返回值的,这个返回值也可以利用,返回值就是CMyWindow::OnGetText中return 的HRESULT值。

Windows消息分为系统消息和用户自定义消息。Windows系统消息有三种:

1标准Windows消息。除WM_COMMAND外以WM_开头的消息是标准消息。例如,WM_CREATE、WM_CLOSE。

2命令消息。消息名为WM_COMMAND,消息中附带了标识符ID来区分是来自哪个菜单、工具栏按钮或加速键的消息。

3通知消息。通知消息一般由列表框等子窗口发送给父窗口,消息名也是WM_COMMAND,其中附带了控件通知码来区分控件。

CWnd的派生类都可以接收到标准Windows消息、通知消息和命令消息。命令消息还可以由文档类等接收。

用户自定义消息实际上就是用户定义一个宏作为消息,此宏的值应该大于等于WM_USER,然后此宏就可以跟系统消息一样使用,窗口类中可以定义它的处理函数。

这两种方法完成的工作相同。都是给视图类增加一个消息句柄,如WM_INITDIALOG (一个32位整数),并添加消息映射函数。

多数情况使用第一个方法 5-11,即,在控件编辑窗口中,针对特定的控件(对话框或按钮)右键添加消息和映射函数,可用的消息都在右侧列表框中。

第二个方法应该是由主菜单打开的,属于一般的通用方法。须要指定新的消息类型(如WM_DESTROY),指定该消息作用的对象(如对话框或按钮控件),之后添加消息映射函数。

在消息映射函数中,你需要编写自己的代码以完成特定的功能。

第二个方法我基本不用,麻烦。

PS

从5-12可以推断,看着看着就睡着了~ 当年我也是一样。。。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12189242.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存