如何从DLL的CMFCRibbonBar获取消息OnUpdateCommandUI [英] How to get message OnUpdateCommandUI from CMFCRibbonBar at DLL
问题描述
嗨。
我有一个带有RIBBON的SDI应用程序(EXE)。这个应用程序有插件作为DLL。
在这些插件中,我创建了一个CFrameWnd,另一个CMFCRibbonBar ...
我的问题是......我没有从DLL CMFCRibbonBar收到OnUpdateCommandUI。只有当我点击任何按钮时才会这样。
通常情况下,当我有OnHover时,会发送一个OnUpdateCommandUI来控制...在我的DLL中,这不会发生。
这是我的代码,仅当我点击ID_BTN_NEW按钮时才调用OnUpdateBtnNew:
void CMTFrameWnd :: CreateRibbon()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
m_wndRibbonBar.Create( this );
MT_PUSH_RESOURCE( MTBaseRes.dll);
m_wndRibbonBar.LoadFromResource(IDR_RIBBON_CADASTROS);
if (!m_wndStatusBar.Create( this ))
{
TRACE0( 无法创建状态栏\ n);
return ; // 无法创建
}
}
BEGIN_MESSAGE_MAP(CMTFrameWnd,CFrameWndEx)
ON_WM_CREATE()
ON_WM_CLOSE()
ON_COMMAND(ID_BTN_EXIT,& CMTFrameWnd :: OnBtnExit)
ON_COMMAND(ID_BTN_NEW,& CMTFrameWnd :: OnBtnNew )
ON_UPDATE_COMMAND_UI(ID_BTN_NEW,& CMTFrameWnd :: OnUpdateBtnNew)
ON_COMMAND(ID_BTN_DEL,& CMTFrameWnd :: OnBtnDel)
ON_UPDATE_COMMAND_UI(ID_BTN_DEL,& CMTFrameWnd :: OnUpdateBtnDel)
END_MESSAGE_MAP()
源代码示例。
https://docs.google.com/file/d/0B8B-NIoST12WeWE3cm9YdmFMRG8/edit?usp=sharing [ ^ ]
联系dll的authot。
Hi. 这篇关于如何从DLL的CMFCRibbonBar获取消息OnUpdateCommandUI的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
我选择的解决方案是在我的CFrame窗口中添加一个计时器。当计时器发生时,我只是调用CWndApp :: OnIdle(0)。
I have an SDI application (EXE), with its RIBBON. This application have plugins as DLL.
In these plugins I have created an CFrameWnd, with another CMFCRibbonBar...
My problem is... I dont get receive OnUpdateCommandUI from DLL CMFCRibbonBar. Only when I have clicked in any button.
Normally, when I have "OnHover" this send an OnUpdateCommandUI to control... In my DLL this doesnt happened.
This is my code, OnUpdateBtnNew is called only when I have clicked on ID_BTN_NEW button:
void CMTFrameWnd::CreateRibbon()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
m_wndRibbonBar.Create(this);
MT_PUSH_RESOURCE("MTBaseRes.dll");
m_wndRibbonBar.LoadFromResource(IDR_RIBBON_CADASTROS);
if (!m_wndStatusBar.Create(this))
{
TRACE0("Failed to create status bar\n");
return; // fail to create
}
}
BEGIN_MESSAGE_MAP(CMTFrameWnd, CFrameWndEx)
ON_WM_CREATE()
ON_WM_CLOSE()
ON_COMMAND(ID_BTN_EXIT, &CMTFrameWnd::OnBtnExit)
ON_COMMAND(ID_BTN_NEW, &CMTFrameWnd::OnBtnNew)
ON_UPDATE_COMMAND_UI(ID_BTN_NEW, &CMTFrameWnd::OnUpdateBtnNew)
ON_COMMAND(ID_BTN_DEL, &CMTFrameWnd::OnBtnDel)
ON_UPDATE_COMMAND_UI(ID_BTN_DEL, &CMTFrameWnd::OnUpdateBtnDel)
END_MESSAGE_MAP()
Source code example.
https://docs.google.com/file/d/0B8B-NIoST12WeWE3cm9YdmFMRG8/edit?usp=sharing[^]contact the authot of the dll.
This is the solution!
The solution I picked was to add a timer to my CFrame window. When the timer occurs, I simply called CWndApp::OnIdle(0).