MFC CMenu 更新
时间: 2023-12-11 11:31:34 浏览: 214
以下是MFC CMenu更新的示例代码:
假设我们有一个菜单项ID为ID_MENUITEM,我们可以使用以下代码来更新该菜单项的状态:
```cpp
// 获取菜单对象
CMenu* pMenu = GetMenu();
if (pMenu != NULL)
{
// 获取菜单项
CMenu* pSubMenu = pMenu->GetSubMenu(0);
if (pSubMenu != NULL)
{
// 更新菜单项状态
pSubMenu->EnableMenuItem(ID_MENUITEM, MF_BYCOMMAND | MF_ENABLED);
pSubMenu->CheckMenuItem(ID_MENUITEM, MF_BYCOMMAND | MF_CHECKED);
}
}
```
在上面的代码中,我们首先获取了主菜单对象,然后获取了第一个子菜单对象。接下来,我们使用EnableMenuItem()函数启用了菜单项,并使用CheckMenuItem()函数选中了菜单项。
相关问题
vs2017 mfc menu
在 VS2017 中创建一个 MFC 项目的时候,会自动生成一些默认的菜单和工具栏。如果你需要自定义菜单,可以按照以下步骤操作:
1. 打开 Resource View(资源视图),右键单击您的项目,选择 Add-> Resource...(添加资源)。
2. 在对话框中选择 Menu,然后单击 New(新建)。
3. 在新建菜单的对话框中,您可以指定菜单的名称和 ID,以及添加菜单项。
4. 单击 OK 保存菜单。
5. 在您的对话框类中,重写 OnInitMenuPopup 函数以便您可以动态地更改菜单项的属性。
6. 在您的主框架窗口类中,使用 LoadMenu 函数将菜单加载到您的应用程序中。
7. 最后,您可以在您的主框架窗口类中添加菜单命令处理程序函数来响应用户的输入。
这是一个简单的示例代码,演示如何添加一个名为“File”的菜单项,其中包含“Open”和“Exit”菜单命令:
```
// 在资源视图中创建一个新菜单,并将其命名为 IDR_MYMENU
// 在您的主框架窗口类中加载菜单
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
{
// ... 其他代码 ...
// 加载菜单
if (!m_menu.LoadMenu(IDR_MYMENU))
return FALSE;
SetMenu(&m_menu);
// ... 其他代码 ...
return TRUE;
}
// 在您的主框架窗口类中重写 OnInitMenuPopup 函数
void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
if (pPopupMenu == NULL)
return;
if (pPopupMenu->GetSafeHmenu() == m_menu.GetSafeHmenu())
{
// 更改“Open”菜单项的属性
UINT nID = pPopupMenu->GetMenuItemID(0);
if (nID == ID_FILE_OPEN)
{
CWnd* pWnd = AfxGetMainWnd();
if (pWnd != NULL)
{
// 如果没有文档,则禁用“Open”菜单项
if (((CMDIFrameWnd*)pWnd)->GetActiveDocument() == NULL)
pPopupMenu->EnableMenuItem(ID_FILE_OPEN, MF_GRAYED);
else
pPopupMenu->EnableMenuItem(ID_FILE_OPEN, MF_ENABLED);
}
}
}
}
// 在您的主框架窗口类中添加菜单命令处理程序函数
void CMainFrame::OnFileOpen()
{
// 处理“Open”菜单命令
}
void CMainFrame::OnFileExit()
{
// 处理“Exit”菜单命令
}
```
希望这可以帮助到您!
mfc菜单自动调整宽度
MFC应用程序中的菜单可以根据菜单项的文字内容自动调整宽度。要实现自动调整宽度,需要使用CMenu类。首先,使用CMenu::GetSubMenu()方法获取顶级菜单的子菜单,然后遍历各个菜单项,使用CMenu::GetMenuString()方法获取菜单项的文本,以此来确定菜单项的最大宽度。接下来,调用CMenu::SetMenuWidths()方法来设置菜单项的宽度。
例如,以下代码演示了如何实现CMenu的自动调整宽度:
CMenu* pMenu = GetMenu();
CMenu* pSubMenu = pMenu->GetSubMenu(0); // 获取第一个子菜单
CString strText;
int nMaxWidth = 0;
for (int i = 0; i < pSubMenu->GetMenuItemCount(); i++) {
pSubMenu->GetMenuString(i, strText, MF_BYPOSITION); // 获取菜单项文本
CSize size = pSubMenu->GetTextExtent(strText); // 获取菜单项文本尺寸
nMaxWidth = max(nMaxWidth, size.cx); // 取最大值
}
pSubMenu->SetMenuWidths(nMaxWidth, -1); // 设置菜单项宽度
这段代码会遍历第一个子菜单的所有菜单项,利用GetTextExtent()方法获取菜单项的尺寸,并记录下最大的宽度值。最后,调用SetMenuWidths()方法,设置所有菜单项的宽度为最大宽度。这样,当菜单中的文本变化时,菜单项的宽度会自动调整。