ATL支持使用
ALT_MSG_MAP
宏声明的备用消息映射.
每个备用消息映射都由您传递给的唯一编号标识ALT_MSG_MAP
.
使用备用消息映射,您可以在一个映射中处理多个窗口的消息.
请注意,默认情况下,CWindowImpl
不使用备用消息映射.
要添加此支持,请覆盖-derived类中的WindowProc
方法,CWindowImpl
并ProcessWindowMessage
使用消息映射标识符进行调用.
当我看到WTL时,我会看到如下消息映射:
BEGIN_MSG_MAP(CCommandBarCtrlImpl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg)
...
ALT_MSG_MAP(1) // Parent window messages
MESSAGE_HANDLER(WM_INITMENUPOPUP, OnParentInitMenuPopup)
...
ALT_MSG_MAP(2) // MDI client window messages
// Use CMDICommandBarCtrl for MDI support
ALT_MSG_MAP(3) // Message hook messages
MESSAGE_HANDLER(WM_MOUSEMOVE, OnHookMouseMove)
...
END_MSG_MAP()
Run Code Online (Sandbox Code Playgroud)
但是,我不明白:
他们如何被召唤.(代码如何知道备用消息映射的存在?)
它们与默认消息映射的区别.他们看起来都像是为同一个窗口处理相同类型的消息......
为什么它们有用.(它们不是都在同一个窗口吗?)
有没有人对替代消息映射有什么更好的解释?
(他们被发明的原因很有帮助.)
我使用Visual Studio 2013创建了一个简单的拆分窗口应用程序.有两个视图,一个视图由default-view-class组成,另一个视图由from-view-class派生而来CScrollView
.
/////////////////////////
// MainFrm.cpp
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext* pContext)
{
split_wnd.CreateStatic(this,1,2);
CRect cr;
GetClientRect(&cr);
split_wnd.CreateView(0,0,RUNTIME_CLASS(CProjectMainView),CSize(cr.Width()/2,cr.Height()),pContext);
split_wnd.CreateView(0,1,RUNTIME_CLASS(CMyCustomView),CSize(cr.Width()/2,cr.Height()),pContext);
return true;
}
Run Code Online (Sandbox Code Playgroud)
这个分离器工作正常.
当我尝试将ON_COMMAND
处理程序添加到其中一个菜单项时,会出现问题.如果我将ON_COMMAND
处理程序放在default-view-class中则没有问题.菜单项点击很好,处理程序工作.
但是,如果我将ON_COMMAND
处理程序放在custom-view-class中,则菜单项根本不会启用.
我相信我已经做了一切,在我的自定义视图类中正确实现了消息映射.
/////////////////////////
// CMyCustomView.h
class CMyCustomView:public CScrollView
{
public:
DECLARE_DYNCREATE(CMyCustomView)
CMyCustomView();
~CMyCustomView();
virtual void OnDraw(CDC* /*pDC*/);
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual void OnInitialUpdate();
public:
DECLARE_MESSAGE_MAP()
afx_msg void OnMenuIdTestMessageMap();
};
Run Code Online (Sandbox Code Playgroud)
该DECLARE_MESSAGE_MAP()
肯定是有在MyCustomView.h当然,我已经添加BEGIN_MESSAGE_MAP
,END_MESSAGE_MAP()
对在MyCustomView.cpp文件.
/////////////////////////
// CMyCustomView.cpp
BEGIN_MESSAGE_MAP(CMyCustomView,CScrollView)
ON_COMMAND(MENU_ID_TEST_MESSAGE_MAP,&CMyCustomView::OnMenuIdTestMessageMap)
END_MESSAGE_MAP()
void CMyCaptureView::OnMenuIdTestMessageMap()
{
// TODO: Add your …
Run Code Online (Sandbox Code Playgroud) 我有一个函数,根据它收到的std :: string值执行特定的操作.
例如:
void performTaskOnStringValue(std :: string);
现在我有一组Ribbon Buttons(CMFCRibbonButton)需要通过在按钮点击时将它们各自的文本作为值传递来调用此函数.
我已经将这些按钮的id映射到带有按钮id的消息映射宏on_command.所有按钮共享一个共同的ID - 例如 -
ID_RIBBON_BUTTON_ID
消息映射如下
ON_COMMAND(ID_RIBBON_BUTTON_ID,&MyClass :: performTaskOnStringValue);
如何在ButtonClick上将按钮文本作为参数传递给此函数?