c++的消息机制(一)

转载 2016年08月30日 14:04:28

今天研究c++消息机制是遇到两个参数不是很明白 查了下资料 记录下(以下都是我个人理解,错误请帮忙指正):

LRESULT SendMessageHWND hWnd,UINT Msg,WPARAM wParam, LPARAM lParam);

这是一个向指定的窗口发送指定消息的函数

HWND hWnd 这个参数是窗口的句柄,相当于id的玩意 不难理解

UINT Msg 这个是要发送的消息 如:WM_CLOSE,WM_SETTEXT。。。。。。。好多

WPARAM wParamLPARAM lParam这两个参数不是很陌生 下面也是我看其他的资料得到的理解

 

Windows的消息必须参考帮助文件才能知道具体的含义。如果是你定义的消息,愿意怎么使这两个参数都行。但是习惯上,我们愿意使用LPARAM传 递地址,而WPARAM传递其他参数。”

接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。下面的伪代码演示了消息循环的用法:

 

 

例如:主程序MyDlg.cpp

1.自定义消息:#define WM_TRAY WM_USER 100

2.函数原形:afx_msg LRESULT OnTrayNotify(WPARAM wParam,LPARAM lParam);

3.消息映射:ON_MESSAGE(WM_TRAY,OnTrayNotify)

4.原函数:

LRESULT CMyDlg::OnTrayNotify(WPARAM wParam,LPARAM lParam)

{

return m_tray.OnTrayNotify(wParam,lParam);

}

 

上面程序呢 主要过程是这样 自定义了一个消息WM_TRAY 

再创建一个函数OnTrayNotify 

然后将消息和函数绑定在一起ON_MESSAGE(WM_TRAY,OnTrayNotify)

每当接受这个消息时就运行函数

WPARAM wParam,LPARAM lParam这两个参数就是消息附带的参数跟着消息一起传递过来


在Win32 SDK中消息本身是作为一个结构体记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。这个记录类型叫做MSG,它在window中是这样声明的:
typedef struct tagMSG { // msg
HWND hwnd; //窗口句柄
UINT message; //消息常量标识符
WPARAM wParam; //32位消息的特定附加信息,具体表示什么处决于message
LPARAM lParam; //32位消息的特定附加信息,具体表示什么处决于message
DWORD time; //消息创建时的时间
POINT pt; //消息创建时的鼠标位置
} MSG;

hwnd 接收消息的32位窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。


message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。


wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。 lParam 通常是一个指向内存中数据的指针。由于wParam,lParam和指针都是32位的,需要时可以强制类型转换。具体表示什么,与message相关,他们是事先定义好的。


如果自定义消息:#define WM_MYMESSAGE WM_USER+100,需确定wParam,lParam的意义 (假设wParam=0时发送数据,wParam=1时接收数据,lParam为CMyClass* 指针,指向一个CMyClass对象,准备要发送的数据或接收数据 发送WM_MYMESSAGE时 SendMessage(hwnd,WM_MYMESSAGE,0,pMyClassObject) 接收消息的窗口,接收WM_MYMESSAGE中(CMyClass*)lParam参数即pMyClassObject传过来的数据



深入Windows内核——C++中的消息机制

《编程思想之消息机制》一文中我们讲了消息的相关概念和消息机制的模拟,本文将进一步聊聊C++中的消息机制。从简单例子探析核心原理在讲之前,我们先看一个简单例子:创建一个窗口和两个按钮,用来控制窗口的背景...
  • luoweifu
  • luoweifu
  • 2015年06月14日 21:31
  • 8070

c++ 消息传递(通过SendMessage)

//同一进程间传递 char* msg="ttbb";::SendMessage(hwnd,Thread_Msg_Student,0,(LPARAM)msg); //不同进程间,传递字符串通过cop...
  • mansir123
  • mansir123
  • 2015年07月06日 16:33
  • 2859

Cstring 转换为LPARAM

CString   str="ssss";(LPARAM)(LPCTSTR)str
  • wletv
  • wletv
  • 2011年07月20日 13:13
  • 5767

VC++中WPARAM和LPARAM的使用

这两个数据数一样的数据类型 typedef UINT WPARAM; typedef LONG LPARAM; 在Win32 API中,WPARAM和LPARAM都是32位,所以没有什么本质的区...
  • mjzhlstk
  • mjzhlstk
  • 2014年10月12日 14:18
  • 761

VC中关于lParam和wParam 的问题

wParam和lParam消息 1 WM_PAINT消息,LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高。 2 滚动条WM_VSCROLL或WM_HSCRO...
  • yuzhenxiong0823
  • yuzhenxiong0823
  • 2013年07月04日 10:25
  • 1876

C++中利用回调实现消息通知

回调函数实现消息通知,例如交派一个任务给某人去做,然后不去管他怎样做,什么时候做,做得怎样,而等他完成后自己汇报。这就是我对回调的理解,当然其中还有涉及了异步处理的概念;首先是函数A去调用一个函数B(...
  • JellyLi2091
  • JellyLi2091
  • 2016年10月31日 00:16
  • 1309

C++编程中的消息机制

消息映射: BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏定义这个消息映射的边界。 BEGIN_MESSAGE_MAP()宏有两个参数,第一个参数为定义消息映射的当前...
  • timebomb
  • timebomb
  • 2011年08月27日 16:34
  • 5397

C++(24)消息处理示例

复制控制 --消息处理示例 说明:     有些类为了做一些工作需要对复制进行控制。为了给出这样的例子,我们将概略定义两个类,这两个类可用于邮件处理应用程序。...
  • u011225629
  • u011225629
  • 2015年08月08日 19:50
  • 1119

编程思想之消息机制

有很多人可能一听到消息机制就觉得其是一种非常高深和神秘的东西(我刚开始也是这种感觉),但你又无法避免地经常到接触它。它确实比较复杂难懂,但复杂并不代表你就不能去理解,关键在于能不能将复杂的问题讲清楚。...
  • luoweifu
  • luoweifu
  • 2015年05月07日 23:01
  • 16168

C++消息机制

  • 2012年09月22日 21:22
  • 89KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++的消息机制(一)
举报原因:
原因补充:

(最多只允许输入30个字)