4、自定义消息
用户可以自定义消息,在应用程序中主动发出,这种消息一般用于应用程序的某一部分内部处理。
例10:当用户单击光标上移键时,程序发送用户自定义消息,在对应的消息响应函数中弹出消息对话框,显示消息发送成功。
(1)建一个单文档应用程序:名为:自定义消息处理
(2)定义用户消息的ID(标识符)
在视图类的头文件CMyView.h中的前面写如下语句,定义用户消息的标识符:
#endif // _MSC_VER > 1000 #define WM_PAAINT 120 //定义消息的ID标识符,这里用大于100的120表示 class CMyView : public CView { protected: // create from serialization only CMyView(); …… } |
(3)声明并自定义用户消息响应函数:在视图类中添加void OnMyFunction()函数。
ClassView右键对准CMyView单击Add Member Function类型写:void,函数名写:OnMyFunction(),将消息响应函数加到CMyView.cpp中。并加代码:
void CMyView::OnMyFunction() { MessageBox(”恭喜你,消息发送成功”); } |
BEGIN_MESSAGE_MAP(CMyView, CView) //{{AFX_MSG_MAP(CMyView) ……………………………. //}}AFX_MSG_MAP ON_MESSAGE(WM_PAAINT,OnMyFunction) |
(5)编写程序代码
添加WM_KEYDOWN消息响应函数,用户按下光标上移键时,将产生WM_KEYDOWN消息。故加此消息响应函数。
ViewClassWizardClass name:CMyViewObject IDs:CMyViewMessages: WM_KEYDOWN Add FunctionEdit Code到View.cpp的OnKeyDown()函数中加代码: void CMyView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { HWND hWnd = GetSafeHwnd(); //接收消息的窗口句柄 if(nChar==VK_UP) //光标上移键 { ::PostMessage(hWnd,WM_PAAINT,0,0);// 将消息插入消息队列并返回。 return; } CView::OnKeyDown(nChar, nRepCnt, nFlags); } |
(6)编译运行,按下光标上移键,程序发送自定义消息,显示一小对话框,结果见图1.4.10所示。
说 明:
1、OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)当键盘上某个按键被按下时发送此消息
参 数:
nChar为所按的键的字符代码值,这里是VK_UP(光标上移键的虚拟键)
nRepCnt为重复击键的次数nFlags表示扫描码和键转换前后的状态
2、用户消息的发送
::PostMessage()函数:Windows提供的发送消息的函数,PostMessage()的功能是将消息插入消息队列并返回,由处理线程处理,而队列中的消息通过GetMessage()或PeekMessage()函数获取。
PostMessage()函数的原型为:
BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,WPARAM IParam)
参 数:
HWND hWnd 接收消息的窗口句柄
UINT Msg 消息的ID标识符
WPARAM wParam 消息的WPARAM参数
WPARAM IParam 消息的LPARAM参数
WPARAM wParam,WPARAM IParam都是消息的附加参数,比如你要响应键盘按下的消息就得用WM_CHAR消息,但是你并不知道按下的是那个键,这2个参数就指定你按键的ASCII码,来确定你按下的是哪个键。它俩都是4个字节长,一般都用LPARAM传指针,两者没区别;你想怎么用就怎么用。wParam的低4位数也表示消息的ID值,比如某菜单用符号表建的ID符为:ID_NEW_MENUITEM,值为101,则可用if(LOWORD(wParam)==ID_NEW_MENUITEM)来判别。
例中见到了HWND和UINT,它们是Windows常用的句柄类型和常用的基本数据类型。表1.4列出了一些Windows编程中常用的基本数据类型。表1.5列出了Windows常用的句柄类型。