CMFCMenuButton 的示例代码?
Example code for CMFCMenuButton?
很抱歉新手问题,但谁能指出说明 CMFCMenuButton 用法的示例代码? Microsoft 帮助指的是 "New Controls samples",但这些示例似乎在 Visual Studio 2008 "Feature Pack" 中,这拒绝在我的系统上安装,因为我是 运行 VS 2013并且没有 VS 2008。我无法找到作为独立代码的示例。
具体来说,我有一个对话框栏,其中我想要一个标有“保存”的按钮,其中包含“全部保存”和“保存可见”的下拉选项(默认为“全部保存”)。但是任何工作代码至少可以让我开始。
声明数据成员:
CMFCMenuButton m_button_menu;
CMenu m_menu;
同时将按钮的 id 添加到消息映射和数据交换中:
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
ON_BN_CLICKED(IDC_MFCMENUBUTTON1, OnButtonMenu)
...
END_MESSAGE_MAP
void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_MFCMENUBUTTON1, m_button_menu);
}
定义:
BOOL CMyDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
//...
m_menu.LoadMenu(IDR_MENU1);
m_button_menu.m_hMenu = m_menu.GetSubMenu(0)->GetSafeHmenu();
return TRUE;
}
其中 IDR_MENU1
是常规菜单栏,我们得到它的第一个子菜单。例如:
IDR_MENU1 MENU
BEGIN
POPUP "Dummy"
BEGIN
MENUITEM "&Item1", ID_FILE_ITEM1
MENUITEM "&Item2", ID_FILE_ITEM2
END
END
如果点击按钮的下拉箭头,弹出菜单出现,菜单结果传递给OnButtonMenu
。如果单击按钮左侧,则直接调用 OnButtonMenu
,而不显示弹出菜单。
void CMyDialog::OnButtonMenu()
{
CString str;
switch (m_button_menu.m_nMenuResult)
{
case ID_FILE_ITEM1:
str = L"first menu item clicked";
break;
case ID_FILE_ITEM2:
str = L"second menu item clicked";
break;
default:
str = L"Button click (popup menu did not appear, or menu ID is not handled)";
break;
}
MessageBox(str);
}
** 当使用停靠控件、对话框栏等时。MFC 可能 运行 它自己的子类,我认为 DoDataExchange
不会被调用。 m_button_menu
可能无效。 GetDlgItem
可用于寻找正确的指针:
CMFCMenuButton* CMyDlgBar::GetButtonMenu()
{
CMFCMenuButton* pButton = &m_button_menu;
if (!IsWindow(pButton->m_hWnd))
pButton = (CMFCMenuButton*)GetDlgItem(IDC_MFCMENUBUTTON1);
return pButton;
}
我们在其他任何地方都使用 GetButtonMenu()
而不是 m_button_menu
。例如:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
m_dlgbar.Create(...);
m_dlgbar.m_menu.LoadMenu(IDR_MENU1);
m_dlgbar.GetButtonMenu()->m_hMenu = m_dlgbar.m_menu.GetSubMenu(0)->GetSafeHmenu();
return 0;
}
void CMainFrame::OnButtonMenu()
{
CString str;
switch (GetButtonMenu()->m_nMenuResult)
...
}
下拉箭头不显示怎么办?
然后阅读解释 RC 文件所需更改的答案 here。
很抱歉新手问题,但谁能指出说明 CMFCMenuButton 用法的示例代码? Microsoft 帮助指的是 "New Controls samples",但这些示例似乎在 Visual Studio 2008 "Feature Pack" 中,这拒绝在我的系统上安装,因为我是 运行 VS 2013并且没有 VS 2008。我无法找到作为独立代码的示例。 具体来说,我有一个对话框栏,其中我想要一个标有“保存”的按钮,其中包含“全部保存”和“保存可见”的下拉选项(默认为“全部保存”)。但是任何工作代码至少可以让我开始。
声明数据成员:
CMFCMenuButton m_button_menu;
CMenu m_menu;
同时将按钮的 id 添加到消息映射和数据交换中:
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
ON_BN_CLICKED(IDC_MFCMENUBUTTON1, OnButtonMenu)
...
END_MESSAGE_MAP
void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_MFCMENUBUTTON1, m_button_menu);
}
定义:
BOOL CMyDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
//...
m_menu.LoadMenu(IDR_MENU1);
m_button_menu.m_hMenu = m_menu.GetSubMenu(0)->GetSafeHmenu();
return TRUE;
}
其中 IDR_MENU1
是常规菜单栏,我们得到它的第一个子菜单。例如:
IDR_MENU1 MENU
BEGIN
POPUP "Dummy"
BEGIN
MENUITEM "&Item1", ID_FILE_ITEM1
MENUITEM "&Item2", ID_FILE_ITEM2
END
END
如果点击按钮的下拉箭头,弹出菜单出现,菜单结果传递给OnButtonMenu
。如果单击按钮左侧,则直接调用 OnButtonMenu
,而不显示弹出菜单。
void CMyDialog::OnButtonMenu()
{
CString str;
switch (m_button_menu.m_nMenuResult)
{
case ID_FILE_ITEM1:
str = L"first menu item clicked";
break;
case ID_FILE_ITEM2:
str = L"second menu item clicked";
break;
default:
str = L"Button click (popup menu did not appear, or menu ID is not handled)";
break;
}
MessageBox(str);
}
** 当使用停靠控件、对话框栏等时。MFC 可能 运行 它自己的子类,我认为 DoDataExchange
不会被调用。 m_button_menu
可能无效。 GetDlgItem
可用于寻找正确的指针:
CMFCMenuButton* CMyDlgBar::GetButtonMenu()
{
CMFCMenuButton* pButton = &m_button_menu;
if (!IsWindow(pButton->m_hWnd))
pButton = (CMFCMenuButton*)GetDlgItem(IDC_MFCMENUBUTTON1);
return pButton;
}
我们在其他任何地方都使用 GetButtonMenu()
而不是 m_button_menu
。例如:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
m_dlgbar.Create(...);
m_dlgbar.m_menu.LoadMenu(IDR_MENU1);
m_dlgbar.GetButtonMenu()->m_hMenu = m_dlgbar.m_menu.GetSubMenu(0)->GetSafeHmenu();
return 0;
}
void CMainFrame::OnButtonMenu()
{
CString str;
switch (GetButtonMenu()->m_nMenuResult)
...
}
下拉箭头不显示怎么办?
然后阅读解释 RC 文件所需更改的答案 here。