📄 chap2_4.htm
字号:
</table>
<p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">为了说明如何使用用户自定义消息,我们看一个例子,见程序清单</font><font FACE="Times New Roman" SIZE="3">2.4</font><font SIZE="3"><font SIZE="3">:</font><b><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">清单</font></font><font FACE="Times New Roman" SIZE="3">2.4 </font><font SIZE="3">使用用户自定义消息</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p>#include<afxwin.h></p>
<p>#define CM_APPLE (WM_USER+0)</p>
<p>#define CM_ORANGE (WM_USER+1)</p>
<p>class CMainFrame:CFrameWnd{</p>
<p>public:</p>
<p>CMainFrame();</p>
<p>protected:</p>
<p>afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);</p>
<p>afx_msg void OnClose();</p>
<p>//handle user select apple</p>
<p>afx_msg LRESULT CMApple(WPARAM wParam, LPARAM lParam);</p>
<p>//handle user select orange</p>
<p>afx_msg LRESULT CMOrange(WPARAM wParam, LPARAM lParam);</p>
<p>DECLARE_MESSAGE_MAP()</p>
<p>};</p>
<p></font><font SIZE="3">相应的消息映射如下:</font><font FACE="Times New Roman" SIZE="3"></p>
<p>BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)</p>
<p>ON_WM_CREATE()</p>
<p>ON_MESSAGE(CM_APPLE, CMApple)</p>
<p>ON_MESSAGE(CM_ORANGE,CMOrange)</p>
<p>ON_WM_CLOSE()</p>
<p>END_MESSAGE_MAP()</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">第一个</font><font FACE="Times New Roman" SIZE="3">ON_MESSAGE</font><font SIZE="3">宏用于指定 </font><font FACE="Times New Roman" SIZE="3">CM_APPLE </font><font SIZE="3">命令消息的处理成员函数为</font><font FACE="Times New Roman" SIZE="3">CMApple </font><font SIZE="3">,而第二个</font><font FACE="Times New Roman" SIZE="3">ON_MESSAGE</font><font SIZE="3">宏用于指定</font><font FACE="Times New Roman" SIZE="3">CM_ORANGE</font><font SIZE="3">命令消息的处理函数为</font><font FACE="Times New Roman" SIZE="3">CMOrange</font><font SIZE="3"><font SIZE="3">。</font><b><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">消息的发送</font></b></font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">Windows</font><font SIZE="3">应用程序允许应用程序向自己发送消息、向其他应用程序发送消息,甚至可以向</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">操作系统本身发送消息(比如要求关闭操作系统或重新启动操作系统)。</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">提供了三个</font><font FACE="Times New Roman" SIZE="3">API</font><font SIZE="3">函数用于发送消息,这三个函数是:</font><font FACE="Times New Roman" SIZE="3">SendMessage</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">PostMessage</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">SendDlgItemMessage</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>SendMessage</font><font SIZE="3">用于向窗口发送消息,该函数说明如下:</font><font FACE="Times New Roman" SIZE="3"></p>
<blockquote>
<p>LRESULT SendMessage(</p>
</blockquote>
<p>HWND hWnd, //</font><font SIZE="3">消息要发往的窗口的句柄</font><font FACE="Times New Roman" SIZE="3"></p>
<p>UINT Msg, //</font><font SIZE="3">要发送的消息</font><font FACE="Times New Roman" SIZE="3"></p>
<p>WPARAM wParam, //</font><font SIZE="3">消息的第一个参数</font><font FACE="Times New Roman" SIZE="3"></p>
<p>LPARAM lParam //</font><font SIZE="3">消息的第二个参数</font><font FACE="Times New Roman" SIZE="3"></p>
<p>);</p>
<p></font><font SIZE="3">其中,</font><font FACE="Times New Roman" SIZE="3">hWnd</font><font SIZE="3">为接收消息窗口的句柄,参数</font><font FACE="Times New Roman" SIZE="3">Msg</font><font SIZE="3">指定发送的消息,参数</font><font FACE="Times New Roman" SIZE="3">wParam</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">lParam</font><font SIZE="3">依赖于消息</font><font FACE="Times New Roman" SIZE="3">Msg</font><font SIZE="3">。该函数调用目标窗口的窗口函数,直到目标窗口处理完该消息才返回。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">PostMessage</font><font SIZE="3">函数同</font><font FACE="Times New Roman" SIZE="3">SendMessage</font><font SIZE="3">类似,它把消息放在指定窗口创建的线程的消息队列中,然后不等消息处理完就返回,而不象</font><font FACE="Times New Roman" SIZE="3">SendMessage</font><font SIZE="3">那样必须等到消息处理完毕才返回。目标窗口通过</font><font FACE="Times New Roman" SIZE="3">GetMessage</font><font SIZE="3">或</font><font FACE="Times New Roman" SIZE="3">PeekMessage</font><font SIZE="3">从消息队列中取出并处理。</font><font FACE="Times New Roman" SIZE="3">PostMessage</font><font SIZE="3">函数说明如下:</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<blockquote>
<p>BOOL PostMessage(</p>
</blockquote>
<p>HWND hWnd, //</font><font SIZE="3">消息发往的窗口</font><font FACE="Times New Roman" SIZE="3"></p>
<p>UINT Ms<i>g</i>, //</font><font SIZE="3">要发送的消息</font><font FACE="Times New Roman" SIZE="3"></p>
<p>WPARAM wParam, //</font><font SIZE="3">消息的第一个参数</font><font FACE="Times New Roman" SIZE="3"></p>
<p>LPARAM lParam //</font><font SIZE="3">消息的第二个参数</font><font FACE="Times New Roman" SIZE="3"></p>
<p>);</p>
<p></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">其中,参数</font><font FACE="Times New Roman" SIZE="3">hWnd</font><font SIZE="3">为接收消息的窗口的句柄,参数</font><font FACE="Times New Roman" SIZE="3">Msg</font><font SIZE="3">指定所发送的消息,参数</font><font FACE="Times New Roman" SIZE="3">wParam</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">lParam</font><font SIZE="3">依赖于消息</font><font FACE="Times New Roman" SIZE="3">Msg</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>SendDlgItemMessage</font><font SIZE="3">函数用于向对话框的某个控制发送消息,函数声明如下:</font><font FACE="Times New Roman" SIZE="3"></p>
<blockquote>
<b><p></b>LONG SendDlgItemMessage(</p>
</blockquote>
<p>HWND hDlg, //</font><font SIZE="3">对话框句柄</font><font FACE="Times New Roman" SIZE="3"></p>
<p>int nIDDlgItem, //</font><font SIZE="3">对话框控件的</font><font FACE="Times New Roman" SIZE="3">ID</p>
<p>UINT Msg, //</font><font SIZE="3">要发送的消息</font><font FACE="Times New Roman" SIZE="3"></p>
<p>WPARAM wParam, //</font><font SIZE="3">消息的第一个参数</font><font FACE="Times New Roman" SIZE="3"></p>
<p>LPARAM lParam //</font><font SIZE="3">消息的第二个参数</font><font FACE="Times New Roman" SIZE="3"></p>
<p>); </p>
<p></font><font SIZE="3">其中,</font><font FACE="Times New Roman" SIZE="3">hDlg</font><font SIZE="3">为包含目标控制的对话框的窗口句柄,参数</font><font FACE="Times New Roman" SIZE="3">nIDDlgItem</font><font SIZE="3">为接收消息的对话框控制的整数标识符,参数</font><font FACE="Times New Roman" SIZE="3">Msg</font><font SIZE="3">指定了所发送的消息,参数</font><font FACE="Times New Roman" SIZE="3">wParam</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">lParam</font><font SIZE="3">提供附加的特定消息的信息。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>MFC</font><font SIZE="3">将这三个函数封装为</font><font FACE="Times New Roman" SIZE="3">CWnd</font><font SIZE="3"><font SIZE="3">类的成员函数,隐藏了窗口句柄和对话框句柄。这三个成员函数用于向本窗口发送消息,函数的说明如下:</font><font FACE="Times New Roman" SIZE="3"></p>
<blockquote>
<blockquote>
</font><font FACE="Arial" SIZE="2"><b><p></b></font>LRESULT SendMessage( UINT message,
WPARAM wParam = 0, LPARAM lParam = 0 );</p>
<font FACE="Arial" SIZE="2"><b><p></b></font>BOOL PostMessage( UINT message, WPARAM wParam
= 0, LPARAM lParam = 0 );</p>
<p>LRESULT SendDlgItemMessage( int nID, UINT message, WPARAM wParam = 0, LPARAM lParam = 0
);</p>
</blockquote>
</blockquote>
<b><p></b></font><font color="#3973DE" SIZE="3">2.4.5</font><font color="#3973DE"><font SIZE="3"><font SIZE="3">学习</font></font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">的方法</font></font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">首先要
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -