能不能自定义声明例如WM_ADD这中不是Windows的消息?
又该怎么做呢?
我想在执行我的OnAdd()函数时,发出WM_ADD这个消息,该怎么做?
又该怎么做呢?
我想在执行我的OnAdd()函数时,发出WM_ADD这个消息,该怎么做?
解决方案 »
- VC2008的资源视图里的对话框,我双击没有自动调到对应的CPP文件
- CScrollView 鼠标
- 横秋扫盲系列(4): CRichEditCtrl 超文本编辑(MSN/QQ常用控件)
- 系统热键问题,注册了Ctrl+C,真实的就不能用了,大家帮忙,回答得好,分加满
- OLE 剪 贴 板 样式刷
- LINK : fatal error LNK1104: cannot open file "mfc42u.lib" 这是什么错误?
- 大家好,我按书上编写了一个程序,编译,build都通过了,但运行时却出现这个提示
- 100分送上,Dlg上的Button如何显示Tooltip?
- 大家说的钓子和hook是指的什么?我菜鸟一个
- WinSock库函数中结构 ent 有什么含义?
- 拖动ToolBar后不刷新的问题(急)
- 100分---紧急求助:网易拍如何编程啊?
....h
class *
{
...
afx_msg LRESULT OnAdd(WPARAM wParam,LPARAM lParam);
...
};.cpp
BEGIN_MESSAGE_MAP(.... ..)
//{{AFX_MSG_MAP(CMainFrame)
ON_MESSAGE(WM_ADD, OnAdd)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()LRESULT *::OnAdd(WPARAM wParam,LPARAM lParam)
{
..
}
在和afx联系的消息OnAdd()里,怎么返回自定义的消息?我想返回WM_ADD,但这不是系统自带的,我该怎么办?
就定义了!
通过AFX他将 WM_ADD与相关的响应函数联系在一起了。
**************************************************
说明:
以下用一个自创的对话框类(MyMessageDlg)向视图类(MessageTestView)
发送自定义消息为例,说明这两种不同方法的自定义消息的
总结:
消息传递的方法一:使用ON_MESSAGE
使用ON_MESSAGE响应消息,必须配合定义消息#define WM_MY_MESSAGE (WM_USER+100)对于发送消息者-MyMessageDlg,
在其MyMessageDlg.h中,定义#define WM_MY_MESSAGE (WM_USER+100)
在其MyMessageDlg.cpp中要先添加:#include "MainFrm.h"
因为使用了CMainFrame*定义对象。
并且要有测试消息的函数:
void MyMessageDlg::OnButtonMsg()
{
// TODO: Add your control notification handler code here
CMainFrame* pMF=(CMainFrame*)AfxGetApp()->m_pMainWnd; //先通过获取当前框架指针
CView * active = pMF->GetActiveView();//才能获取当前视类指针
if(active != NULL) //获取了当前视类指针才能发送消息
active->PostMessage(WM_MY_MESSAGE,0,0); //使用PostMessage发送消息
}对于消息的接受者-MessageTestView,
在其MessageTestView.h中,也要定义#define WM_MY_MESSAGE (WM_USER+100)
并定义消息映射函数-OnMyMessage()
protected:
//{{AFX_MSG(CMessageTestView)
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
在其MessageTestView.cpp中,
先要声明响应消息:
BEGIN_MESSAGE_MAP(CMessageTestView, CEditView)
//{{AFX_MSG_MAP(CMessageTestView)
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
//}}AFX_MSG_MAP
再添加消息响应的函数实现:
LRESULT CMessageTestView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
MessageBox("OnMyMessage!");
return 0;
}
消息传递的方法二:使用ON_REGISTERED_MESSAGE
使用ON_REGISTERED_MESSAGE注册消息,必须配合
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");对于消息的发送者-MyMessageDlg,
在其MyMessageDlg.h中,只要
定义static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");
就可以了。
在其MyMessageDlg.cpp中要先添加:#include "MainFrm.h"
因为使用了CMainFrame*定义对象。
并且要有测试消息的函数:
void MyMessageDlg::OnButtonMsg()
{
// TODO: Add your control notification handler code here
CMainFrame* pMF=(CMainFrame*)AfxGetApp()->m_pMainWnd; //先通过获取当前框架指针
CView * active = pMF->GetActiveView();//才能获取当前视类指针
if(active != NULL) //获取了当前视类指针才能发送消息
active->PostMessage(WM_MY_MESSAGE,0,0); //使用PostMessage发送消息
}对于消息的接收者-MessageTestView,
在其MessageTestView.h中不要定义
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");
应该把这个定义放到MessageTestView.cpp中,要不会出现: redefinition
在其MessageTestView.h中只要定义消息映射函数
protected:
//{{AFX_MSG(CMessageTestView)
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
在其MessageTestView.cpp中,先定义
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");
接着注册消息:
BEGIN_MESSAGE_MAP(CMessageTestView, CEditView)
//{{AFX_MSG_MAP(CMessageTestView)
ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage)
//}}AFX_MSG_MAP
最后添加消息响应的函数实现:
LRESULT CMessageTestView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
MessageBox("OnMyMessage!");
return 0;
}
----------------------------------------------------------------
比较两种方法,只是略有不同。但也要小心谨慎,以免出现接收不到消息的情况。 -------------------------------------------------------------------其他注意事项:发送消息的-MyMessageDlg.cpp前也要定义
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");接受消息的-MessageTestView.cpp前也要定义
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");RegisterWindowMessage("Message")中""的内容是什么不重要,写什么都可以,单必须
发送者与接受者是一样的内容,例如:"Message"******************************************************
end
#define WM_ADD WM_USER+300
在你要响应消息的类的.h中添加一个函数
afx_msg void OnAdd(WPARAM wParam, LPARAM lParam);
在类的.cpp中的OnAdd里面加入处理并在消息映射中加入:
//{{AFX_MSG_MAP(CMessageTestView)
ON_MESSAGE(WM_ADD,OnAdd)
//}}AFX_MSG_MAP
要发送消息的时候可以:
SendMessage(WM_ADD, 0, 0);
#define ON_WM_ADD() \
{ WM_ADD, 0, 0, 0, AfxSig_lwl, \
(AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CMyClass::*)(WPARAM, LPARAM))&OnAdd },
另外在.cpp中有这一段:
BEGIN_MESSAGE_MAP(CMyClass, CWnd)
//{{AFX_MSG_MAP(CSunSwin)
ON_WM_ADD()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
才能起作用。
CWnd是你的父类,我这里只是一个例子啦。如果你要修改CMyClass的WndProc的话,就不需要这些东东了,只需要在switch( message )中加上case WM_ADD:就行了。
{
switch( message )
{
case WM_PAINT:
...
break;
...
case WM_ADD:
...//你的处理代码
break;
...
default:
return DefWindowProc( ... );
}
return 0;
}
[email protected]@[email protected]广告来来来,炸死你!
#define WM_ADD (WM_APP+1)
偏移量为0--0x3FFF。
不需要吧,我以前用过的,没有问题!
to jishiping(JSP 季世平):
记不清楚那本书上说,不要从WM_USER开始,因为一些控件也使用这些消息,因此应该从 WM_USER+100 或更多开始