自定义消息处理示例
来源:互联网 发布:蔡家坡广电网络 编辑:程序博客网 时间:2024/05/17 04:21
我们在前两篇中简单介绍了MFC程序的消息处理,并简单了解了鼠标和
键盘消息。今天我们自定义一个消息并处理之~~
【预备知识】(参考:《MFC扩展编程实例》一书)
[1]怎样使用MFC发送一个消息
可以用下列目标窗口的句柄直接调用Windows API:
LRESULT Res=::SendMessage(HWND hWnd , //hWnd是目标窗口的句柄
UINT Msg , //变量Msg是消息,
WPARAM wParam ,//wParam和lParam变量包含消息的参
LPARAM lParam);//数,如鼠标单击哪里或选择了什么菜单项
目标窗口返回的消息结果放在变量Res中。
[2]怎样用MFC寄送一个消息
用MFC寄送一个消息与发送一个消息几乎相同,但寄送时用BOOL PostMessage( ) ,而不是用SendMessage( );返回值Res也不一样,Res不是一个由目标窗口返回的值,而是一个布尔值
,用来表示消息是否成功地放到消息队列中。一旦消息被寄送后,应用程序在后台发送它,
通过GetMessage()或PeekMessage()获取。
[3]自定义消息的ID(标识符)
Windows保留了0和WM_USER-1之间的整数范围,作为系统定义的窗口消息;还有一个
从WM_USER一直到OX7fff的整数范围,留给自定义消息用。可以用一个简单的#define语句
定义消息:
#define WM_MYMESSAGE1 WM_USER
#define WM_MYMESSAGE2 WM_USER+1
: : :
然后,可以像处理任何其他窗口消息一样用SendMessage(WM_MYMESSAGE1, wParam, lParam)
或
PostMessage(WM_MYMESSAGE1, wParam, lParam).发送或寄送这些消息。
可以用下面的宏在消息映像中获取这些新消息:
ON_MESSAGE(WM_MYMESSAGE1, Handler)
(ON_MESSAGE是系统定义的"用户自定义消息映射宏",这里我们不讨论定义自己的消息映射宏)
在这里,处理函数将具有如下格式:
LRESULT Handler(WPARAM, LPA R A M )
{
}
【完成程序】
[1]生成单文档应用程序MyDefMsg,其余均默认。
[2]定义用户消息
将"const WM_USERMSG = WM_USER + 10"加入到" MyDefMsgView.h"中CMyDefMsgView类的声名的上面
const WM_USERMSG = WM_USER + 10
class CMyDefMsgView : public CView
{
protected: // create from serialization only
CMyDefMsgView();
DECLARE_DYNCREATE(CMyDefMsgView)
......
};
为什么要"WM_USER + 10"?——"+其它数行不行"?——可以,只要满足"从WM_USER一直到OX7fff的整数范围"即可!!!!!
[3]声名用户消息响应函数
在CMyDefMsgView类的声名中加入消息响应函数OnMyFunction():
const WM_USERMSG = WM_USER + 10
class CMyDefMsgView : public CView
{
......
// Operations
public:
void OnMyFunction();//用户消息响应函数
......
};
[4]定义用户消息响应函数
在"MyDefMsgView.cpp "中添加OnMyFunction()函数体,并编写代码。为简单起见,只弹出了
一个消息框:
/////////////////////////////////////////////////////////////////////////////
// CMyDefMsgView message handlers
void CMyDefMsgView::OnMyFunction()
{
MessageBox("小辉向大家问好!","自定义消息",MB_OK);
}
[5]填写消息映射
在"MyDefMsgView.cpp "文件的消息映射表中加入ON_MESSAGE(WM_USERMSG,OnMyFunction)
紧接在//}}AFX_MSG_MAP之后(你可以试着改变一下位置)
BEGIN_MESSAGE_MAP(CMyDefMsgView, CView)
//{{AFX_MSG_MAP(CMyDefMsgView)
ON_WM_RBUTTONDOWN()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_USERMSG,OnMyFunction)//我们填写的消息映射
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
[6]编写发送自定义消息的代码
首先按照上篇介绍的方法,为CMyDefMsgView类加入WM_RBUTTONDOWN消息,在WM_RBUTTONDOWN消息的处理函数OnRButtonDown(UINT nFlags, CPoint point)中加入发送自定义消息的代码:
void CMyDefMsgView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
HWND hWnd = this->GetSafeHwnd();//得到视图窗口的句柄
::PostMessage(hWnd,WM_USERMSG,0,0);
CView::OnRButtonDown(nFlags, point);
}
[7]在CMyDefMsgView类的OnDraw()函数中加入pDC->TextOut(0,0,"按下鼠标右键,测试自定义消息!");
void CMyDefMsgView::OnDraw(CDC* pDC)
{
CMyDefMsgDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->TextOut(0,0,"按下鼠标右键,测试自定义消息!");
}
[8]编译运行。
就到这里!!!祝大家进步!!!
键盘消息。今天我们自定义一个消息并处理之~~
【预备知识】(参考:《MFC扩展编程实例》一书)
[1]怎样使用MFC发送一个消息
可以用下列目标窗口的句柄直接调用Windows API:
LRESULT Res=::SendMessage(HWND hWnd , //hWnd是目标窗口的句柄
UINT Msg , //变量Msg是消息,
WPARAM wParam ,//wParam和lParam变量包含消息的参
LPARAM lParam);//数,如鼠标单击哪里或选择了什么菜单项
目标窗口返回的消息结果放在变量Res中。
[2]怎样用MFC寄送一个消息
用MFC寄送一个消息与发送一个消息几乎相同,但寄送时用BOOL PostMessage( ) ,而不是用SendMessage( );返回值Res也不一样,Res不是一个由目标窗口返回的值,而是一个布尔值
,用来表示消息是否成功地放到消息队列中。一旦消息被寄送后,应用程序在后台发送它,
通过GetMessage()或PeekMessage()获取。
[3]自定义消息的ID(标识符)
Windows保留了0和WM_USER-1之间的整数范围,作为系统定义的窗口消息;还有一个
从WM_USER一直到OX7fff的整数范围,留给自定义消息用。可以用一个简单的#define语句
定义消息:
#define WM_MYMESSAGE1 WM_USER
#define WM_MYMESSAGE2 WM_USER+1
: : :
然后,可以像处理任何其他窗口消息一样用SendMessage(WM_MYMESSAGE1, wParam, lParam)
或
PostMessage(WM_MYMESSAGE1, wParam, lParam).发送或寄送这些消息。
可以用下面的宏在消息映像中获取这些新消息:
ON_MESSAGE(WM_MYMESSAGE1, Handler)
(ON_MESSAGE是系统定义的"用户自定义消息映射宏",这里我们不讨论定义自己的消息映射宏)
在这里,处理函数将具有如下格式:
LRESULT Handler(WPARAM, LPA R A M )
{
}
【完成程序】
[1]生成单文档应用程序MyDefMsg,其余均默认。
[2]定义用户消息
将"const WM_USERMSG = WM_USER + 10"加入到" MyDefMsgView.h"中CMyDefMsgView类的声名的上面
const WM_USERMSG = WM_USER + 10
class CMyDefMsgView : public CView
{
protected: // create from serialization only
CMyDefMsgView();
DECLARE_DYNCREATE(CMyDefMsgView)
......
};
为什么要"WM_USER + 10"?——"+其它数行不行"?——可以,只要满足"从WM_USER一直到OX7fff的整数范围"即可!!!!!
[3]声名用户消息响应函数
在CMyDefMsgView类的声名中加入消息响应函数OnMyFunction():
const WM_USERMSG = WM_USER + 10
class CMyDefMsgView : public CView
{
......
// Operations
public:
void OnMyFunction();//用户消息响应函数
......
};
[4]定义用户消息响应函数
在"MyDefMsgView.cpp "中添加OnMyFunction()函数体,并编写代码。为简单起见,只弹出了
一个消息框:
/////////////////////////////////////////////////////////////////////////////
// CMyDefMsgView message handlers
void CMyDefMsgView::OnMyFunction()
{
MessageBox("小辉向大家问好!","自定义消息",MB_OK);
}
[5]填写消息映射
在"MyDefMsgView.cpp "文件的消息映射表中加入ON_MESSAGE(WM_USERMSG,OnMyFunction)
紧接在//}}AFX_MSG_MAP之后(你可以试着改变一下位置)
BEGIN_MESSAGE_MAP(CMyDefMsgView, CView)
//{{AFX_MSG_MAP(CMyDefMsgView)
ON_WM_RBUTTONDOWN()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_USERMSG,OnMyFunction)//我们填写的消息映射
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
[6]编写发送自定义消息的代码
首先按照上篇介绍的方法,为CMyDefMsgView类加入WM_RBUTTONDOWN消息,在WM_RBUTTONDOWN消息的处理函数OnRButtonDown(UINT nFlags, CPoint point)中加入发送自定义消息的代码:
void CMyDefMsgView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
HWND hWnd = this->GetSafeHwnd();//得到视图窗口的句柄
::PostMessage(hWnd,WM_USERMSG,0,0);
CView::OnRButtonDown(nFlags, point);
}
[7]在CMyDefMsgView类的OnDraw()函数中加入pDC->TextOut(0,0,"按下鼠标右键,测试自定义消息!");
void CMyDefMsgView::OnDraw(CDC* pDC)
{
CMyDefMsgDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->TextOut(0,0,"按下鼠标右键,测试自定义消息!");
}
[8]编译运行。
就到这里!!!祝大家进步!!!
- 自定义消息处理示例
- MFC 实现自定义消息 示例
- 自定义消息的处理
- 处理自定义消息
- NSNotificationCenter 处理自定义消息
- 添加自定义消息处理
- C++primer 消息处理示例
- C++ Primer消息处理示例
- C++ Primer 消息处理示例
- 如何处理自定义消息 (非命令消息)
- Message消息重载、自定义消息处理过程
- C# 实现自定义消息处理
- VC++对于自定义消息处理
- MFC中自定义消息处理
- VC++如何处理自定义消息
- MFC中自定义消息处理
- VC++如何处理自定义消息
- VC++如何处理自定义消息
- 解读Python内存管理机制
- Hibernate事件监听
- C++6.0调试篇:变量的观察--watch窗口的技巧
- 软件检测之缺陷模式库
- 跟踪方面最新论文
- 自定义消息处理示例
- 马云建言新同事:三年内需经看、信、思考等五步
- WCF一步一步往前爬(五)
- linux常用操作命令
- WP7编程 XNA框架中播放动画
- 定时器Timer
- R语言,图形
- 杭州邀请赛 Treasure Hunting
- IT人员迅速提升自我效率的十大方法