`
nathan09
  • 浏览: 155377 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

动态插入子菜单(ID不定)(MFC)

 
阅读更多

Windows 应 用 程 序 的 菜 单 可 以 分 成 两 大 类: 程 序 窗
口 上 方 菜 单 条 上 的 下 拉 式 菜 单 和 可 以 在 任 意 位 置
显 示 的 弹 出 式 菜 单。 用MFC 建 立 下 拉 菜 单 的 方 法 基 本
上 是 相 同 的, 但 建 立 弹 出 式 菜 单 的 方 法 有 很 多。 其
中 较 常 用 的 是:
说 明 一 个CMenu 对 象;

用LoadMenu 成 员 函 数 装 入 菜 单 资 源;

用TrackPopupMenu 在 指 定 位 置 显 示 菜 单 并 发 送 所 选 菜 单 项 的ID;

用DestroyMenu 销 毁 菜 单 释 放 资 源。
---- 在 某 些 应 用 程 序 中, 只 有 在 程 序 运 行 时 才 能 根 据
情 况 确 定 菜 单 项 的 内 容 和 菜 单 项 的 数 目。 这 样 就 无
法 在 编 程 时 建 立 菜 单 资 源, 也 就 不 能 象 上 面 所 述 的 那
样 用LoadMenu 装 入 资 源。 需 要 用 另 一 种 方 法 建 立 菜 单:

说 明 一 个CMenu 对 象;

用CreatePopupMenu 建 立 一 个 空 菜 单, 再 用InsertMenu 或AppendMenu
加 入 菜 单 项;

用TrackPopupMenu 在 指 定 位 置 显 示 菜 单 并 发 送 所 选 菜 单 项 的ID;

用DestroyMenu 销 毁 菜 单 释 放 资 源。
---- 虽 然 这 种 方 法 可 以 动 态 地 建 立 菜 单, 但 是 能 够 向 动
态 菜 单 中 加 入 的 菜 单 项 被 限 制 在 一 个 有 限 的 范 围 内, 并
且 必 须 在 编 程 时 就 确 定 它 们 的ID。 这 是 因 为 按 照MFC 常 规 的
菜 单 处 理 机 制, 每 个 菜 单 项 都 要 有 一 个 处 理 函 数, 用MFC
的 消 息 映 射 使 每 个 菜 单ID 对 应 到 相 应 的 处 理 函 数, 从 而
建 立 菜 单 项 与 处 理 函 数 的 对 应 关 系。 用 户 选 中 某 一 菜 单
项, 就 会 触 发 相 应 的 处 理 函 数。 这 样 一 来, 我 们 必 须 在 编
程 时 就 知 道 所 有 的 菜 单 项, 它 们 的ID 与 对 应 的 处 理 函 数
, 并 用 消 息 映 射 静 态 地 一 一 建 立 对 应 关 系。

---- 在 设 计 程 序 时, 确 实 可 能 出 现 菜 单 项 数 目 无 法 限 制,
菜 单ID 事 先 不 能 确 定 的 情 况。 例 如, 一 个 应 用 程 序 有 两
个 文 档 类A 与B, 每 个 文 档 都 可 以 同 时 打 开 任 意 次。 我 们 希
望 在 一 个 动 态 菜 单 中, 只 列 出 显 示A 类 文 档 的 窗 口 标 题,
另 一 个 动 态 菜 单 中 只 列 出 显 示B 类 文 档 的 窗 口 标 题。 当
选 定 一 个 菜 单 项 时, 对 应 的 文 档 窗 口 显 示 在 最 上 面。 由
于 我 们 不 能 限 制 打 开 的 窗 口 数 目, 也 不 能 预 知 窗 口 标 题,
所 以 就 无 法 确 定 应 该 编 写 多 少 处 理 函 数 以 及 会 有 哪 些 菜
单ID, 当 然 也 就 无 法 用 消 息 映 射 建 立 对 应 关 系。 这 时, 我
们 需 要 一 种 不 使 用 消 息 映 射 的 方 法。 但 是, 不 使 用 消 息 映
射 我 们 如 何 知 道 用 户 选 中 了 哪 一 个 菜 单 项 呢 ? 答 案 是CMenu
类 的 成 员 函 数TrackPopupMenu 可 以 告 诉 我 们。
我 们 可 以 从 手 册 或 联 机 帮 助 中 找 到 关 于 该 函 数 的 介 绍:


BOOL TrackPopupMenu(UINT nFlag,int x,int
y,CWnd* pWnd,LPCRECT lpRect=NULL);

---- 参 数nFlag 用 于 指 定 弹 出 式 菜 单 的 位 置 标 志 与 有 效 鼠 标 键。
可 以 取 的 值 为 下 列 的 一 个 或 多 个:


TPM_CENTERALIGN,TPM_LEFTALIGN,TPM_RIGHTALIGN,
TPM_LEFTBUTTON,TPM_RIGHTBUTTON

---- 参 数x,y 为 弹 出 式 菜 单 的 位 置, 参 数pWnd 为 父 窗 口 指 针。

---- 该 函 数 在 指 定 位 置 显 示 一 个 弹 出 式 菜 单, 并 发 送 以 选 中
菜 单 项ID 标 识 的 消 息。 执 行 成 功 返 回 非 零 值, 否 则 返 回 零。

---- 这 并 不 是 关 于TrackPopupMenu 的 全 部 信 息。 该 函 数 至 少 有 两
个 重 要 特 性 没 有 列 入 文 档, 而 它 们 对 于 解 决 我 们 的 问 题 是
至 关 重 要 的。 第 一 个 未 写 入 文 档 的 特 性 是: 该 函 数 的 第 一
个 参 数nFlag 还 可 以 取 另 外 两 个 值:TPM_ NONOTIFY 与TPM_RETURNCMD。
从 它 们 的 名 字 可 以 看 出 来,TPM_ NONOTIFY 的 作 用 是 使TrackPopupMenu 函
数 不 发 送 菜 单 消 息 通 知 应 用 程 序。TPM_RETURNCMD 的 作 用 是 使 函 数
将 本 该 发 送 出 去 的 菜 单 消 息 作 为 返 回 值 返 回。 这 时 函 数 的 返
回 值 是UINT 类 型 的, 就 是 选 中 的 菜 单ID。 这 就 是 该 函 数 第 二 个
未 写 入 文 档 的 特 性


---- 下 面, 我 们 通 过 一 个 例 子 详 细 解 释TrackPopupMenu 的 这 种 用
法。

voidCreateDynamicMenu()
...{
CPointpt;
GetCursorPos(
&pt);

CMenum_NewMenu;
m_NewMenu.LoadMenu(IDR_MENU_POPUP);
//顶级菜单,事先在资源管理器中建好

CMenu
*pM=m_NewMenu.GetSubMenu(0);//一级下拉菜单

CMenu
*pSubmenu=pM->GetSubMenu(pM->GetMenuItemCount()-1);//二级子菜单
ASSERT(pSubmenu);

UINTnEnable
=MF_BYPOSITION|MF_STRING|MF_ENABLED;
for(...)...{
pSubmenu
->InsertMenu(pSubmenu->GetMenuItemCount()-1,nEnable,(UINT_PTR)ID,菜单文字);
}


intSelectID=(HTREEITEM)pM->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL|
TPM_NONOTIFY
|TPM_RETURNCMD,pt.x,pt.y,this);

//根据获得的ID作出相应的动作
}
该函数一般在右键消息处理函数中调用.
分享到:
评论

相关推荐

    MFC-动态添加和删除菜单栏

    在多文档接口(MDI)应用程序中,动态管理菜单会更复杂,因为每个子窗口可能需要有自己的菜单。这时可以使用CFrameWnd或CMDIFrameWnd的RecalcLayout和OnCreateClient等方法来处理。 总之,MFC提供了一套完整的API来...

    MFC对话框动态添加右键快捷菜单-多级菜单

    下面将详细阐述如何在MFC对话框中动态添加右键快捷菜单,并实现多级结构。 首先,我们需要了解MFC中的菜单系统。MFC将Windows API的菜单操作进行了封装,主要通过`CMenu`类来操作菜单。对于快捷菜单,我们可以使用`...

    mfc 菜单打勾的方法

    实现 mfc 菜单打勾的方法需要在对话框的头文件中声明菜单和子菜单的变量,并在 OnInitDialog 函数中加载主菜单和子菜单。然后,我们需要处理子菜单的点击事件,并在 OnControlMute 函数中使用 CheckMenuRadioItem ...

    MFC中的菜单基本应用

    1. 创建子菜单:在资源编辑器中,为菜单项添加子菜单,子菜单项同样需要定义ID。 2. 处理子菜单事件:在CWinApp或CView的OnCommand()函数中,检查WM_COMMAND消息的wParam参数,判断是否来自子菜单,然后执行相应的...

    MFC 菜单项带图标

    如果在运行时动态添加菜单项,可以使用`AppendMenu`函数,传入`MF_BITMAP`标志和图标资源的ID。例如: ```cpp CMENUITEMINFO menuInfo; ZeroMemory(&menuInfo, sizeof(CMENUITEMINFO)); menuInfo.cbSize = ...

    MFC编写高级弹出菜单

    高级弹出菜单不仅包括基本的菜单项,还可能包含子菜单、图像、自定义绘制等特性,以提升用户体验。 在MFC中,创建和管理弹出菜单主要涉及以下几个关键类: 1. **CMenu**:这是MFC提供的菜单类,用于处理菜单对象。...

    c++ mfc应用程序实现浮动菜单

    在MFC中,菜单资源通常在资源编辑器中定义,包括主菜单和子菜单项。例如: ```cpp CMenu menu; menu.LoadMenu(IDR_MENU浮动菜单); // IDR_MENU浮动菜单是菜单资源ID ``` 接下来,我们需要创建一个CMiniFrameWnd...

    MFC菜单重写可实现自定义菜单

    - 在`OnInitMenuPopup`中,可以针对每个子菜单进行更细致的调整,如隐藏或显示特定菜单项,设置菜单项的检查标记等。 4. 注册消息处理函数:确保在`BEGIN_MESSAGE_MAP`和`END_MESSAGE_MAP`之间添加对应的消息映射...

    MFC 自定义菜单栏背景颜色,位置,宽度,高度,选中高亮

    在MFC(Microsoft Foundation Classes)框架中,自定义菜单栏是一项常见的需求,它涉及到界面的个性化和用户体验的提升。本文将深入探讨如何实现MFC菜单栏的背景颜色、位置、宽度、高度以及选中高亮的自定义设置。 ...

    Microsoft Word - 如何动态添加菜单菜单项子菜单.pdf

    本文将详细介绍如何使用CMenu类以及部分Win32 API在MFC应用程序中动态添加菜单项、子菜单以及右键菜单,并解释如何响应菜单事件。 首先,要了解MFC中管理菜单的主要类是CMenu。CMenu是对Win32 API中操作菜单的函数...

    MFC对话框上显示带下拉菜单的工具栏

    3. 创建下拉菜单:在资源视图中,右键单击“菜单”并选择“插入菜单”。设计菜单结构,包括所需的子菜单和菜单项。每个菜单项可以有自己的ID,以便在代码中处理用户的点击事件。 4. 关联菜单与工具栏:在对话框类中...

    为MFC对话框程序添加菜单和菜单响应函数

    - 添加新菜单:右键点击资源树中的菜单项,选择“插入菜单”来创建新的菜单。然后,添加菜单项,为每个菜单项设置ID(如ID_FILE_OPEN)和显示文本(如"打开")。 - 菜单项的ID需要遵循MFC的命名规则,通常是ID开头...

    vs2010中MFC常用动态库

    7. **资源处理**:MFC通过CRuntimeClass、CObject和CResourceTemplate等类提供了对资源(如菜单、对话框、图标和字符串)的管理。开发者可以通过资源编辑器创建和修改资源,然后在程序中使用。 8. **国际化和本地化...

    MFC在word模板中插入文字和图片生成文档实例

    本实例主要讲解如何在MFC环境下,通过编程方式在Word模板中插入文字和图片,生成定制的文档。 首先,你需要安装Visual C++ 6.0(vc6.0)集成开发环境,以及与之兼容的Office 2003。这是因为MFC库在vc6.0中的支持...

    为MFC对话框添加Menu菜单

    菜单项可以有子菜单,通过右键单击菜单项选择"插入子菜单"来创建。每个菜单项都有一个ID,用于在代码中识别它们。记得给每个菜单项分配一个唯一的ID,例如ID_FILE_OPEN、ID_FILE_SAVE等。 4. **关联菜单到对话框类*...

    MFC 动态添加按钮

    在MFC(Microsoft Foundation Class)库中,动态添加控件是一种常见的编程需求,特别是当程序运行时需要根据用户交互或特定条件创建控件时。本篇文章将深入探讨如何在MFC应用中动态添加按钮,并实现按钮的响应函数,...

    MFC添加菜单

    1. 打开资源视图(Resource View),在项目中找到` IDR_MAINFRAME `菜单项,点击右键选择“插入菜单”。这将为您创建一个新的顶级菜单。 2. 在新创建的菜单上添加子菜单项,可以通过右键单击并选择“添加”来实现。...

    MFC数据库插入数据代码

    本篇文章将深入探讨如何在MFC中使用Visual Studio的SQL语句来插入数据到SQL Server 2005数据库。MFC提供了一套封装了ODBC(Open Database Connectivity)的类库,使得在C++中操作数据库变得更加便捷。 首先,我们...

    菜单系统MFC的用于PPC平台

    在这个特定的场景中,我们关注的是如何在PPC平台上使用MFC来构建一个菜单系统。 菜单系统在任何用户界面中都扮演着至关重要的角色,因为它提供了用户与应用交互的主要途径。在MFC中,菜单主要通过CMenu类来处理。这...

Global site tag (gtag.js) - Google Analytics