【
MFC
】CMenu
实现
菜单栏
/工具栏、工具栏
前
勾选
效果、菜单文本动态调整说明
菜单栏
/工具栏的创建添加
菜单栏
/工具栏工具栏
前
勾选
效果菜单文本动态调整其他
主要介绍该如何加载
菜单栏
、工具栏,如何改变
菜单栏
的文字,如何
实现
菜单栏
Checked的
勾选
效果。
菜单栏
/工具栏的创建
“资源视图”内选择“添加资源”,再在弹出的对话框中选择“Menu”再“新建”,
菜单栏
创建完毕。
之后就可以根据自己的需求,是要建立
菜单栏
还是工具栏。
往下创建设置为
菜单栏
,往右延伸为工具栏。
添加
菜单栏
/工具栏
作为
菜单栏
:
1、
MFC
当要显示菜单时,操作系统会发出WM_INITMENUPOPUP消息,然后由程序窗口的基类接管。
此时会创建一个CCmdUI对象,并与程序的第一个菜单相互关联,调用该对象的一个成员函数DoUpdate().
这个函数发出ON_UPDATE_COMMAND_UI消息。这条消息
带有
一个指向CCmdUI对象的指针。
2、这时,系统会判断是否存在一个ON_UPDATE_COMMAND
MFC
是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学
MFC
的小伙伴们都觉得
MFC
比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力......
故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学
MFC
的小伙伴,避免走弯路,费时费力。
### 回答1:
在
MFC
中,可以使用 GetMenu() 函数获取菜单句柄,然后使用 GetMenuItemInfo() 函数获取
菜单项
的信息,其中包括
勾选
框的宽度。示例代码如下:
CMenu* pMenu = GetMenu();
MENUITEMINFO mii;
mii.fMask = MIIM_CHECKMARKS;
pMenu->GetMenuItemInfo(nItem, &mii);
int nWidth = mii.hbmpChecked;
其中nItem为
菜单项
的编号。
在这里, mii.hbmpChecked 就是返回
勾选
框的宽度.
### 回答2:
在
MFC
中获取菜单
勾选
框的宽度,可以通过以下步骤
实现
:
1. 首先,需要获取到菜单的句柄(handle)。可以使用CMenu类的LoadMenu或GetSubMenu函数获取菜单句柄。
2. 通过菜单句柄,可以获得
菜单项
的句柄(handle)。使用CMenu类的GetMenuItemInfo函数,传入
菜单项
索引和菜单句柄,获取
菜单项
信息。
3. 通过
菜单项
信息,可以获得菜单的
勾选
框宽度。
菜单项
信息的结构体中有一个属性fType,如果
菜单项
是
复选
框(MFT_CHECKED),则可以获取
勾选
框的宽度。
4. 获取
勾选
框的宽度。首先,使用CMenuItemInfo类的 dwItemData 属性获得
勾选
框的宽度。dwItemData 属性返回一个无符号INT_PTR,需要将其转换为BOOL类型。
以下是一个示例代码,可以用来在
MFC
中获取菜单
勾选
框的宽度:
CMenu* pMenu = NULL; // 假设获取到了菜单的句柄
UINT uID = 0; // 假设获取到了
菜单项
的索引
CMenu* pSubMenu = pMenu->GetSubMenu(uID); // 获取到子菜单的句柄
MENUITEMINFO mii;
memset(&mii, 0, sizeof(MENUITEMINFO));
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_CHECKMARKS;
pSubMenu->GetMenuItemInfo(uID, &mii, TRUE); // 获取到
菜单项
的信息
int nCheckWidth = mii.dwItemData != 0 ? ::GetSystemMetrics(SM_CXMENUCHECK) : 0; // 判断是否为
勾选
框,并获取
勾选
框宽度
以上是在
MFC
中获取菜单
勾选
框宽度的一个简单示例,通过获取菜单和
菜单项
的句柄,并使用相应的函数来获取
勾选
框的宽度。
### 回答3:
在
MFC
中获取菜单
勾选
框的宽度,您可以通过以下步骤来
实现
:
首先,通过调用
菜单栏
上
菜单项
的GetMenu函数获取菜单对象指针。然后,通过调用菜单对象的GetMenuItemInfo函数获取
菜单项
的信息。
在调用GetMenuItemInfo函数时,需要提供
菜单项
的标识符,您可以通过调用菜单对象的GetMenuItemID函数来获取标识符。如果
菜单项
是一个弹出式菜单,您还需要将MF_POPUP
标记
传递给GetMenuItemInfo函数。
获取
菜单项
信息后,您可以从
菜单项
信息结构中获取
菜单项
的位置和大小。通过将
菜单项
大小的cx值减去
菜单项
文本的宽度,就可以得到菜单
勾选
框的宽度。
以下是一个简单的示例代码,用于在
MFC
的消息处理函数中获取菜单
勾选
框的宽度:
```cpp
void CMyDialog::OnMenuCheckWidth()
CMenu* pMenu = GetMenu();
if (pMenu != nullptr)
MENUITEMINFO menuItemInfo;
memset(&menuItemInfo, 0, sizeof(MENUITEMINFO));
menuItemInfo.cbSize = sizeof(MENUITEMINFO);
menuItemInfo.fMask = MIIM_CHECKMARKS | MIIM_TYPE;
UINT menuItemID = pMenu->GetMenuItemID(0); //
菜单项
标识符
UINT menuItemFlags = pMenu->GetMenuState(menuItemID, MF_BYCOMMAND); //
菜单项
标志
if (menuItemFlags & MF_POPUP)
menuItemInfo.fMask |= MIIM_SUBMENU;
pMenu->GetMenuItemInfo(menuItemID, &menuItemInfo);
// 获取
菜单项
的文本宽度
CClientDC dc(this);
CFont* pOldFont = dc.SelectObject(GetFont());
CRect rect;
dc.DrawText(menuItemInfo.dwTypeData, &rect, DT_SINGLELINE | DT_CALCRECT);
dc.SelectObject(pOldFont);
// 计算
勾选
框宽度
int checkWidth = menuItemInfo.cx - rect.Width();
// 使用得到的宽度进行其他操作
// ...
请注意,此示例仅适用于获取
菜单栏
上的
菜单项
的菜单
勾选
框宽度。如果要获取弹出式菜单中的
勾选
框宽度,您需要根据需要调用PopupMenu函数来显示菜单,并使用TrackPopupMenu函数来跟踪鼠标。然后,使用GetMenuItemRect函数获取
菜单项
的位置和大小,并计算
勾选
框宽度。
Super_Jandroid: