📄 sy0402.htm
字号:
<html>
<HEAD>
<TITLE>Visual C++与计算机接口</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=gb2312" >
</HEAD>
<body>
<font color="#0000FF">创建自己的窗口消息</font>
<p>
(一)实验目的:<BR>
在应用程序中创建自己的窗口消息<BR><BR>
(二)实验内容:<BR>
定义一个新的窗口消息,实际上是一个数字ID。然后,在应用程序的类之间发送和接收该窗口消息<BR><BR>
(三)实验方法:<BR><BR>
1、创建一个新的窗口消息<BR>
使用以下方式定义一个新的消息。若想定义多个消息,只要使用WM_USER的更大增量即可。<BR>
# define WM_WZD_MESSAGE WM_USER+1<BR><BR>
2、发送一个窗口消息<BR>
利用SendMessage( )发送新消息:<BR>
pWnd->SendMessage(WM_WZD_MESSAGE,wParam,lParam);<BR>
pWnd是指消息发送的目的窗口指针,例如由 AfxGetMainWnd() 获得的主窗口指针。<BR>
消息所带的参数最多是两个,都是DWORD变量。可以把想要传递的数据(例如一个数值或一个指针)存储在参数wParam和lParam中,在消息处理函数中再将wParam和lParam转换为自己的数据。<BR><BR>
接收并处理新窗口消息的方法有三种:<BR>
·使用WndProc函数处理消息<BR>
·增加ON_MESSAGE宏和消息处理函数本身到接收消息类的消息映像中<BR>
·为此新消息创建自己的消息映像宏<BR>
第一种最简单,但不很直观,第二种的好处是快而且简单,第三种方法的好处是在消息进行处理之前用户可以定制wParam和lParam参数,在大量使用此消息时很有用。<BR><BR>
3、使用WndProc函数处理消息<BR>
·在消息发送的目的窗口重载函数WndProc,它是专门处理各种传递到本窗口内的消息的函数。<BR>
·在函数WndProc中处理消息:<BR>
LRESULT CMyWindow::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) <BR>
{<BR>
if(message == WM_WZD_MESSAGE) { ... }<BR>
return CMDIChildWnd::WindowProc(message, wParam, lParam);<BR>
}<BR><BR>
4、使用ON_MESSAGE()接收新窗口消息<BR>
(1)在类的.h文件中添加消息处理函数的声明:<BR>
protected:<BR>
//{{AFX_MSG(CTttView)<BR>
//}}AFX_MSG<BR>
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);<BR>
DECLARE_MESSAGE_MAP()<BR>
(2)在用户类的.cpp文件中的消息映像区中加入消息映射宏:<BR>
BEGIN_MESSAGE_MAP(CTttView, CView)<BR>
//{{AFX_MSG_MAP(CTttView)<BR>
//}}AFX_MSG_MAP<BR>
ON_MESSAGE(WM_WZD_MESSAGE,OnMyMessage)<BR>
END_MESSAGE_MAP()<BR>
(3)最后,在文件中添加消息处理函数的具体实现:<BR>
LRESULT CMainFrame::OnWzdMessage(WPARAM wParam, LPARAM lParam)<BR>
{<BR>
...<BR>
return 0;<BR>
}<BR>
传送的wParam和lParam的值的含义由你自己决定,函数返回什么值也由你自己决定。<BR><BR>
5、创建新的消息映像宏<BR>
(1)用如下方式为新消息定义一个新的消息映像宏,理想情况下,其定义在一个包含文件中,以便可被应用程序的所有文件共享。<BR>
#define ON_WZD_MESSAGE() {WM_WZD_MESSAGE,0,0,0,AfxSig_vW,(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(CWnd *))&OnMyMessage},<BR>
注意末尾有一个逗号。<BR>
另外,AfxSig_vW的值告诉MFC,新消息带一个指向CWnd类的指针,且返回值是Void类型,再把wParam和lParam参数转换为调用参数。<BR>
AfxSig_vW的其他可用值,请参阅MFC子目录下AFXMSG_.H文件。<BR>
改变AfxSig_vW的值意味着改变这个宏定义的函数的调用参数。<BR>
(2)在类的.h文件中添加消息处理函数的声明:<BR>
protected:<BR>
//{{AFX_MSG(CTttView)<BR>
//}}AFX_MSG<BR>
afx_msg void OnMyMessage(CWnd *pWnd);<BR>
DECLARE_MESSAGE_MAP()<BR>
(3)在用户类的.cpp文件中的消息映像区中加入消息映射宏:<BR>
BEGIN_MESSAGE_MAP(CTttView, CView)<BR>
//{{AFX_MSG_MAP(CTttView)<BR>
//}}AFX_MSG_MAP<BR>
ON_WZD_MESSAGE()<BR>
END_MESSAGE_MAP()<BR>
(4)最后,在文件中添加消息处理函数的具体实现:<BR>
void CMainFrame::OnMyMessage(CWnd *pWnd)<BR>
{<BR>
((CTttView*)pWnd)->DoSomeWork();<BR>
}<BR>
注意,这里传递的参数不是通常的wParam和lParam,而是更友好的CWnd指针。<BR>
(5)另外,发送消息的时候要使用:<BR>
AfxGetMainWnd()->SendMessage(WM_WZD_MESSAGE,(int)m_hWnd);<BR>
<p></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -