标签: message-map

ATL/WTL替代消息映射(ALT_MSG_MAPs)如何工作?我什么时候使用它们?

我已经阅读文档,其中说:

ATL支持使用ALT_MSG_MAP宏声明的备用消息映射.
每个备用消息映射都由您传递给的唯一编号标识ALT_MSG_MAP.
使用备用消息映射,您可以在一个映射中处理多个窗口的消息.
请注意,默认情况下,CWindowImpl不使用备用消息映射.
要添加此支持,请覆盖-derived类中的WindowProc方法,CWindowImplProcessWindowMessage使用消息映射标识符进行调用.

当我看到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)

但是,我不明白:

  • 他们如何被召唤.(代码如何知道备用消息映射的存在?)

  • 它们与默认消息映射的区别.他们看起来都像是为同一个窗口处理相同类型的消息......

  • 为什么它们有用.(它们不是都在同一个窗口吗?)

有没有人对替代消息映射有什么更好的解释?
(他们被发明的原因很有帮助.)

winapi wtl atl visual-c++ message-map

4
推荐指数
1
解决办法
1481
查看次数

即使添加了ON_COMMAND处理程序,菜单项也会保持禁用状态

我使用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)

events mfc handler menuitem message-map

3
推荐指数
1
解决办法
98
查看次数

如何将值传递给MFC消息映射函数on_command

我有一个函数,根据它收到的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上将按钮文本作为参数传递给此函数?

c++ mfc ribbon message-map

1
推荐指数
1
解决办法
2878
查看次数

标签 统计

message-map ×3

mfc ×2

atl ×1

c++ ×1

events ×1

handler ×1

menuitem ×1

ribbon ×1

visual-c++ ×1

winapi ×1

wtl ×1