- 浏览: 64191 次
-
文章分类
最新评论
VC消息的分类
什么是消息?
消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。
消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做MSG,MSG含有来自windows应用程序消息队列的消息信息,它在Windows中声明如下:
typedef struct tagMsg
{
HWND hwnd; 接受该消息的窗口句柄
UINT message; 消息常量标识符,也就是我们通常所说的消息号
WPARAM wParam; 32位消息的特定附加信息,确切含义依赖于消息值
LPARAM lParam; 32位消息的特定附加信息,确切含义依赖于消息值
DWORD time; 消息创建时的时间
POINT pt; 消息创建时的鼠标/光标在屏幕坐标系中的位置
}MSG;
消息可以由系统或者应用程序产生。系统在发生输入事件时产生消息。举个例子, 当用户敲键, 移动鼠标或者单击控件。系统也产生消息以响应由应用程序带来的变化, 比如应用程序改变系统字体改变窗体大小。应用程序可以产生消息使窗体执行任务,或者与其他应用程序中的窗口通讯。
消息中有什么?
我们给出了上面的注释,是不是会对消息结构有了一个比较清楚的认识?如果还没有,那么我们再试着给出下面的解释:
hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。
message用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。消息标识符以常量命名的方式指出消息的含义。当窗口过程接收到消息之后,他就会使用消息标识符来决定如何处理消息。例如、WM_PAINT告诉窗口过程窗体客户区被改变了需要重绘。符号常量指定系统消息属于的类别,其前缀指明了处理解释消息的窗体的类型。
wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。
lParam 通常是一个指向内存中数据的指针。由于WParam、lParam和Pointer都是32位的,因此,它们之间可以相互转换。
标准消息:除WM_COMMAND之外,所有的以WM_开头的消息。从CWnd派生的类,都可以接受到这类消息。注意:标准消息并不需要我们指定处理函数名称,是默认的对应关系。
例如:宏名称<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>对应消息<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>消息处理函数</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>ON_WM_CHAR<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>WM_CHAR<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>OnChar<br><wbr><wbr><wbr><wbr><wbr>ON_WM_CLOSE<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>WM_CLOSE<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>OnClose<br><wbr><wbr><wbr><wbr><wbr><wbr>ON_WM_CREATE<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>WM_CREATE<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>OnCreate<br><wbr><wbr><wbr><wbr><wbr>ON_WM_DESTROY<wbr><wbr><wbr><wbr><wbr><wbr><wbr>WM_DESTROY<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>OnDestroy<br><wbr><wbr><wbr><wbr><wbr>ON_WM_LBUTTONDO<wbr><wbr><wbr>WNWM_LBUTTONDOWN OnLButtonDown<br><wbr><wbr><wbr><wbr><wbr>ON_WM_LBUTTONUP<wbr><wbr><wbr>WM_LBUTTONUP<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>OnLButtonUp<br><wbr><wbr><wbr><wbr><wbr>ON_WM_MOUSEMOVEWM_MOUSEMOVE<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>OnMouseMove<br><wbr><wbr><wbr><wbr><wbr>ON_WM_PAINT<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>WM_PAINT<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>OnPaint<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>.........<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>............<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>.......</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
命令消息:来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接收到这类消息,其wParam记录着该消息来自哪一个菜单项目。
例如:ON_COMMAND(IDM_ABOUT,<wbr><wbr><wbr>OnAbout)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>ON_COMMAND(IDM_FILENEW, OnFileNew)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>ON_COMMAND(IDM_FILEOPEN, OnFileOpen)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>ON_COMMAND(IDM_FILESAVE, OnFileSave)</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>...........</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
通告消息:由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口通(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。从CCmdTarget派生的类都可以接收到这类消息。
例如:控件<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>宏<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>消息处理函数</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>Button<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>ON_BN_CLICKED(<id>,<memberFxn>)<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>memberFxn<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>ComboBox<wbr><wbr><wbr>ON_CBN_DBLCLK(<id>,<memberFxn>)<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>memberFxn<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>Edit<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>ON_EN_SETFOCUS(<id>,<memberFxn>)<wbr><wbr><wbr><wbr><wbr><wbr>memberFxn<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>ListBox<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>ON_LBN_DBLCLK(<id>,<memberFxn>)<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>memberFxn</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>.........<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>......................<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>...........</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
CWnd是CCmdTarget的派生类,在MFC的单文档程序中的CMenuApp和CMenuDoc都是属于CCmdTarget的派生类而不包含CWnd类。
MFC命令消息的路由:AfxWndProc(替换了窗口过程函数)->AfxCallWndProc->WindowProc->OnWnddMsg->(如果是命令消息则调用Oncommand;如果是通告消息则调用OnNotify)->OnCmdMsg
标准消息和非标准消息的区分:标准消息:代有控制后后续操作;非标准消息:只是简单提示。
你可以在程序的许多类别之中设计「消息映像表格」(每一个类别只能拥有一个消息映像表格,但也可以没有),接收并处理消息。只要是CWnd 衍生类别,就可以拦下任何 Windows 消息。与窗口无关的MFC 类别(例如 CDocument 和CWinApp)如果也想处理消息,必须衍生自 CCmdTarget,并且只可能收到 WM_COMMAND命令消息。
对于一条MFC消息响应函数,一般会有三处相关信息。
1. 消息响应函数声明
project1Dlg.h<wbr><wbr><wbr>(如何多doc文档则是xxxView.h)</wbr></wbr></wbr>
class Cproject1Dlg : public CDialog
{
// 构造
public:
<wbr>Cproject1Dlg(CWnd* pParent =NULL);<wbr>// 标准构造函数</wbr></wbr>
// 对话框数据
<wbr>enum { IDD = IDD_PROJECT1_DIALOG };</wbr>
<wbr>protected:<br><wbr>virtual void DoDataExchange(CDataExchange*pDX);<wbr>// DDX/DDV 支持</wbr></wbr></wbr>
// 实现
protected:
<wbr>HICON m_hIcon;</wbr>
<wbr>// 生成的消息映射函数<br><wbr>virtual BOOL OnInitDialog();<br><wbr>afx_msg void OnSysCommand(UINT nID, LPARAMlParam);<br><wbr>afx_msg void OnPaint();<br><wbr>afx_msg HCURSOR OnQueryDragIcon();<br><wbr>DECLARE_MESSAGE_MAP()<br> public:<br><wbr>afx_msg void OnBnClickedOk();<wbr>//函数声明,声明了是消息响应函数<br> };</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
<wbr></wbr>
2.<wbr><wbr> 消息响应函数定义</wbr></wbr>
<wbr>project1Dlg.cpp</wbr>
<wbr></wbr>
void Cproject1Dlg::OnBnClickedOk()
{
<wbr>// TODO: 在此添加控件通知处理程序代码<br><wbr>OnOK();<br>
}</wbr></wbr>
3.<wbr> 书写消息映射宏,表示遇到该宏对应消息时,将消息与消息响应函数关联,调用消息响应函数</wbr>
BEGIN_MESSAGE_MAP(Cproject1Dlg, CDialog)
<wbr>ON_WM_SYSCOMMAND()<br><wbr>ON_WM_PAINT()<br><wbr>ON_WM_QUERYDRAGICON()<br><wbr>//}}AFX_MSG_MAP<br><wbr>ON_BN_CLICKED(IDOK, OnBnClickedOk)<br>
END_MESSAGE_MAP()</wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
<wbr></wbr>
ON_BN_CLICKED(IDOK,OnBnClickedOk)与OnBnClickedOk()<wbr>通过参数对应的关系显得很清晰。而原有的VC机制常用ON_WM_LBUTTONDOWN与响应函数OnLButtonDown()对应,这对书写有严格要求,不能错,因为VC中存在了一个消息映射表这样的东西,对每个消息宏(如ON_WM_LBUTTONDOWN)都预定义了消息映射函数(如OnLButtonDown())这样的虚函数,使用时定义一下就可以,但必须按映射表的原函数书写才能关联消息宏。</wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
如何消息映射表中没有该消息及响应函数,想自定义一个。
转一个MFC自定义消息的实现
1).在相关类的头文件顶部添加如下所示的字串(以CMyDlg类为例):
在CMyDlg.h中添加#define WM_MY_MESSAGE (WM_USER+100)<wbr>注意:在源文件(。cpp)也可以的。<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>1<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>2<br>
其中1位置处的消息名可以自定,位置2处是确保消息在程序中唯一性,所以用(WM_USER+数值)的形式来表示,数值不可为负.</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
2).在消息定义完成后,需要转到相应类的源程序文件CMyDlg.cpp中,在如下所示的固定结构间添加消息与函数的映射.
BEGIN_MESSAGE_MAP(CTestdisockDlg, CDialog)
//{{AFX_MSG_MAP(CTestdisockDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
例如要添加上面已经定义好的消息,添加后的结构如下:
BEGIN_MESSAGE_MAP(CTestdisockDlg, CDialog)
//{{AFX_MSG_MAP(CTestdisockDlg)
ON_MESSAGE(WM_NOTIFY_MESSAGE, OnMyMessage) //3
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
其中3所示的行即是添加的内容.要注意自定义消息是以ON_MESSAGE()的形式映射,第一个参数是上面已经定义好的消息名,第二个参数是该消息的映射函数,消息是函数的触发条件.无消息到达时该函数永远不被执行.
3).上面的完成后,需要转到CMyDlg.h文件中,也就是定义类的文件中,在如下的结构中申明刚才映射好的函数.
//{{AFX_MSG(CTestdisockDlg)
virtual BOOL OnInitDialog();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()<wbr><wbr>//找位置的时候,以该行出现的地方为准.<br>
添加函数后的结构如下,与普通的申明稍有区别.<br>
//{{AFX_MSG(CTestdisockDlg)<br>
virtual BOOL OnInitDialog();<br>
afx_msgOnMyMessage();<wbr><wbr><wbr>//4<br>
//}}AFX_MSG<br>
DECLARE_MESSAGE_MAP()<wbr><wbr>//找位置的时候,以该行出现的地方为准,添加函数后的结构如下,与普通的申明稍有区别.</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
位置4对应的行是加上的函数申明,如果有参数就写带参的形式,其中afx_msg 头是所有与消息有关的函数必须加的标识.
最后一步就是到源文件CMyDlg.cpp中写函数的实现部分,也就是具体的编程.
消息的触发是靠SendMessage()或PostMessage()函数完成的,它们的第一个参数就是指定把消息发往那个窗口,发送成功后,映射函数就会被调用执行。
<wbr></wbr>
小白特别提示: 在很多动态菜单自定义函数问题上,ON_MESSAGE会无效,推荐用ON_COMMAND
ON_COMMAND 对应的都是WM_COMMAND消息,是用户自定义消息的较好发布者
<wbr></wbr>
两者区别非常理论
口消息(Window Message)一般与窗口的内部运作有关,如创建窗口、绘制窗口和销毁窗
口等。通常,消息是从系统发送到窗口,或从窗口发送到窗口。
若需要窗口消息的完全的列表,请参考M F C文档。
命令消息
命令消息一般与处理用户请求相关,当用户单击一个菜单项或工具栏时,命令消息产生,
并被发送到能处理该请求的类对象(如,装载文件、编辑文本和保存选项等)。
控件通知
通常,控件通知在某些重要事件发生时,由控件窗口发送到父窗口,如打开一个组合框。
控件通知为父窗口进一步控制子窗口提供了机会。例如,打开一个组合框时,父窗口可以用
组合框初建时得不到的消息填充它。
相关推荐
【VC消息钩子编程】 在Windows编程中,消息钩子是一种强大的工具,允许开发者拦截和处理系统中的消息。本文将详细解析VC++中消息钩子编程的概念、分类、实现步骤以及其在病毒行为中的应用,同时探讨如何对抗利用...
【VC++ API函数分类详解】 在Windows编程中,VC++ API函数是不可或缺的一部分,它们提供了对操作系统底层功能的访问。本文将对网络函数、消息函数和文件处理函数这三类API进行详细介绍。 **1. 网络函数** 网络...
基于VC++和MATLAB的车型分类及车辆计数系统.pdf 基于VC++的AIS基站网络系统的研究与实现.pdf 基于VC++的小型变电站监控组态软件的设计与开发.pdf 基于VC++的智能压路机人机交互软件开发.pdf 基于VC++的汽车制动系统...
1. **消息的分类**: - **队列消息**:这类消息先放入系统消息队列,然后转移到对应线程的消息队列,如键盘、鼠标事件,WM_PAINT,WM_TIMER和WM_QUIT。 - **非队列消息**:直接发送到目的窗口过程,不经过消息队列...
- **消息的分类与发送方式** - 通常,由输入设备产生的消息(如键盘和鼠标消息)以及菜单操作引发的`WM_COMMAND`消息会被`Post`到消息队列。 - 其他消息可能直接通过`SendMessage`发送,无需经过消息队列。 #### ...
#### 三、深入理解消息分类与特性 Windows消息可以分为两大类:队列消息和非队列消息。队列消息是指那些需要通过消息循环才能被应用程序处理的消息,它们首先被放入消息队列中等待处理;而非队列消息则可以直接发送...
本文将深入解析“VC视图拆分源代码(含一个拆分类)”这个资源,探讨如何通过自定义类实现视图的灵活拆分。 视图(View)是MFC(Microsoft Foundation Classes)框架中的一个重要概念,它代表了用户界面中的一个...
- MFC Regular DLL:包含一个继承自CWinApp的类,但没有消息循环,适用于MFC环境。 - MFC Extension DLL:基于MFC的动态链接版本,只能被MFC类库编写的程序调用,提供了扩展MFC类的功能。 3. 使用DLL的好处 - ...
树形控件(Tree Control)是一种常见的用户界面元素,它允许用户以树状结构来展示数据,通常用于文件系统浏览、菜单系统或者复杂的分类导航等。在MFC中,树形控件通过CTreeCtrl类进行封装,开发者可以方便地对其进行...
MFC库中包含了大量与窗口、控件、消息处理相关的类和函数,如`CWinApp`是应用程序主类,`CWnd`代表Windows窗口,`OnMessage`用于处理消息。通过函数查询工具,开发者能迅速找到并理解MFC类的成员函数,如`CButton::...
这些标签方便搜索和分类,有助于有相同学习需求的人找到这个资源。 在【压缩包子文件】中: 1. "www.pudn.com.txt" 可能是发布者在上传源代码时附加的一个文本文件,通常包含关于源代码的更多背景信息,如作者、...
在实际开发中,`FigureDlg.cpp`文件可能还会和其他源文件如`FigureDlg.h`(头文件)一起,定义类的结构和成员函数,以及相关的消息处理函数,如`OnInitDialog()`(初始化对话框)、`OnBnClickedButtonRecognize()`...
- **MFC类分类**: - **应用程序类**: 如`CWinApp`,负责初始化和运行整个应用程序。 - **窗口类**: 如`CWnd`及其派生类,用于创建和管理各种类型的窗口。 - **绘图类**: 如`CDC`,用于图形绘制。 - **文件访问类...
关于标签“vc做的一个漂亮的登录窗口”,这是对项目特点的简洁概括,用于分类或搜索。在实际开发中,可能涉及的技术包括: 1. MFC库:用于构建窗口和控件,如CButton、CEdit等,它们提供了创建用户界面的基本元素。 ...
基于VC++和MATLAB的车型分类及车辆计数系统.pdf 基于VC++的AIS基站网络系统的研究与实现.pdf 基于VC++的小型变电站监控组态软件的设计与开发.pdf 基于VC++的智能压路机人机交互软件开发.pdf 基于VC++的汽车制动系统...
VC_EXCEL DDE连接就是这样一个技术,它允许Visual C++(VC++)应用程序通过动态数据交换(DDE)协议与Microsoft Excel进行通信,实现实时数据同步。在本文中,我们将深入探讨DDE连接的原理、实现步骤以及注意事项。 ...
中图分类号TN911.7-34和文献标识码A指示了本论文的学科分类和文献标准化信息。文章编号1004-373X(2011)13-0172-03则说明了论文发表的具体信息,包括发表的时间、卷期等。基金项目部分表明该研究获得了国家863计划...
### IT知识点:VC中文版MSDN与Microsoft Visual C++6.0 MFC Library Reference #### 知识点一:Microsoft Visual C++6.0及MFC库简介 Microsoft Visual C++6.0是一款由微软公司开发的集成开发环境(IDE),专为C++...
#### 四、VC动态链接库的分类 1. **非MFC动态库 (Non-MFCDLL)**:这类DLL不依赖于MFC类库结构,其导出函数通常为标准的C接口,因此既可以被非MFC程序也可以被MFC程序调用。 2. **MFC规则DLL (MFC Regular DLL)**:...
文档"VC__API函数分类大全.doc"可能包含了对Windows API函数的详尽分类和介绍,这对于Windows开发人员来说是非常宝贵的资源。以下是对常见API函数类别的一些概述: 1. **进程与线程管理**:包括CreateProcess、...