`
runfeel
  • 浏览: 936314 次
文章分类
社区版块
存档分类
最新评论

菜单

 
阅读更多

1、在菜单项前添加标记

用到的函数

GetMenu() 作用 :获取菜单栏;GetSubMenu() 作用: 获取子菜单;

CheckMenuItem()作用:菜单标记;

 函数功能:该函数取得与指定菜单项相联系的菜单标志。如果该菜单项打开了一个子菜单,该函数也返回子菜单里的菜单项数。

 函数原型:DWORD CheckMenuItem(HMENU hmenu, UINT uIDCheckItem, UINT uCheck); 
 参数:
  hmenu:含有其菜单项的标志将被提取得的菜单的句柄。一般为缺省值,可以省略。
  uIDCheckItem:指定要修改的菜单项。这个参数取决于第三个参数,若第三个参数为MF_BYCOMMAND,则该参数是所选菜单项的ID号,若为MF_BYPOSITION,则该参数是所选菜单的索引值。
  uCheck:表示标记的状态。此参数可取下列值之一:
  MF_BYCOMMAND:表示参数uId给出菜单项的标识符。如果MF_BYCOMMAND和MF_BYPOSITION都没被指定,则MF_BYCOMMAND是缺省值。
  MF_BYPOSITION:表示参数uId给出菜单项相对于零的位置。

其中MF_BYCOMMAND和MF_BYPOSITION均可以与菜单项相关的菜单标志一起使用。

  返回值:如果指定的项不存在,返回值是OXFFFFFFFF;如果菜单项打开了一个子菜单,则返回值的低位含有与菜单相联系的菜单标志,高位含有子菜单的项数。否则,返回 值是莱单标志的掩码(布尔OR)。
  下面列出与菜单项相关的菜单标志。
  MF_CHECKED:放置选取标记于菜单项旁边(只用于下拉式菜单、子菜单或快捷菜单)。
  MF_DISABLED:使菜单项无效。MF_GRAYED:使菜单项无效并交灰。MF_HILITE:加亮菜单项。
  MF_MENUBARBREAK:对下拉式菜单、子菜单和快捷菜单,新列和旧列由垂直线隔开,其余功能同MF_MENUBREAK标志。
  MF_MENUBREAK:将菜单项放于新行(对菜单条)或无分隔列地放于新列(对下拉式菜单、子菜单或快捷菜单)。
  MF_SEPARATOR:创建一个水平分隔线(只用于下拉式菜单、子菜单或快捷菜单)。
  MF_UNCHECKED: 相当于MF_CHECKED 的反作用,取消放置于菜单项旁边的标记。

例如:对文件-新建菜单前添加一个标记,可在CMainFrame类 oncreat()下添加如下代码:

GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);

或GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMOND|MF_CHECKED);


2、创建缺省菜单项

用到的函数:

SetDaultItem()

函数原型:BOOL SetDefaultItem(UINT UItem,BOOL fByPos = FALSE

第二个参数缺省值是FALSE,若第二个参数是FALSE,则第一个参数是菜单项的ID,若若第二个参数是TRUE,则第一个参数是菜单项的索引值;

例如:将文件-打开设置为缺省菜单,可在CMainFrame类 oncreat()下添加如下代码:

GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);

GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN,FALSE);

GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN);

注意:在一个菜单项中只能有一个缺省菜单


3、创建图形标记菜单

用到的函数:SetMenuItemBitmaps

函数原型:BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );

第一个参数取决于第二个参数,若第二个参数是MF_BYPOSITION,第一个参数则为菜单项的索引,若第二个参数是MF_BYCOMMOND,第一个参数则为菜单项的ID.第三个参数是选择菜单项时菜单项前标记的位图,第四个参数是不选菜单项时它前边的位图标记。

添加步骤

a、新建一个bitmap

b、在CMainFrame中添加成员变量 CBitmap bitmap;

c、在oncreat中添加代码:

bitmap.LoadBitmap(IDB_BITMAP1);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&bitmap,&bitmap);

注意:图形标记菜单位图bitma的大小,可以先获取bitmap大小,通过以下代码:

GetSystemMetrics()是获取系统信息;参数是指想获取关于哪方面的信息

可以先获取图形标记菜单位图的大小

CString str;
str.Format("x = %d,y = %d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));

MessageBox(str);

其中GetSystemMetrics(SM_CXMENUCHECK))和GetSystemMetrics(SM_CYMENUCHECK))分别是获取图形标记菜单位图的宽度和高度;

通过 MessageBox输出。


4、使菜单不可用

用到的函数:

EnableMenuItem()

函数原型:BOOL EnableMenuItem(UINT uIDEnableItem, UINT uEnable);

作用:允许或禁止指定的菜单条目

但是在用EnableMenuItem()禁止指定的菜单条目时,应先在构造函数中赋值 m_bAutoMenuEnable = FALSE;

例如: 将文件-保存设为不可用

CMainFrame::CMainFrame()
{
m_bAutoMenuEnable = FALSE;
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

。。。

GetMenu()->GetSubMenu(0)->EnableMenuItem(2,MF_BYPOSITION|MF_GRAYED);

GetMenu()->GetSubMenu(0)->EnableMenuItem(ID_FILE_SAVE,MF_BYCOMMAND|MF_GRAYED);

}

(注意,若用索引,只能设置菜单的可用与不可用,而不能控制工具栏中图标的可用和不可用,但是,用ID号可以使控制菜单项状态与工具栏状态一致)

5、取消和添加整个菜单

取消菜单:

在oncreat中添加代码 SetMenu(NULL);即可

添加菜单:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

。。。

CMenu menu; //定义变量
menu.LoadMenu(IDR_MAINFRAME); //加载菜单
SetMenu(&menu); //添加菜单
menu.Detach(); //将菜单句柄和c++断开,必须有。

}

命令更新机制:

菜单项状态的维护是依赖于CN_UPDATE_COMMAND_UI消息,谁捕获了CN_UPDATE_COMMAND_UI消息,MFC就在其中创建了一个CCmdUI对象。可以通过类向导在消息映射中添加ON_UPDATE_COMMAND_UI宏来捕获CN_UPDATE_COMMAND_UI消息。

在后台所作的工作是:操作系统发出WM_INITMEUPOPUP消息,然后由MFC基类如CFrameWnd接管。他创建一个CCmdUI对象,并与第一个菜单项相关联,调用对象的一个成员函数,DoUpdate()。这个函数发出CN_UPDATE_COMMAND_UI消息,这条消息带有指向CCmdUI对象的指针。同一个CCmdUI对象就设置为与第二个菜单项相关联,这样顺序进行,直到完成所有菜单项。

更新命令UI处理程序仅应用于弹出式菜单项的项目,不能应用于永久显示的顶级菜单项目。

利用这样的更新机制使菜单项能或不能使用可以用一下的方法:

1、查看——建立类向导

2、在object ids 中选择ID_FILE_NEW 在message中选择ON_UPDATE_COMMAND_UI,点击Addfunction。点击Edit。在函数中输入代码:

pCmdUI->Enable(FALSE);

3、运行,可以看到菜单上新建已经禁用。

为了保证菜单项和工具栏中的工具相一致,一般用ID进行索引。

6、右键弹出菜单功能

工程——增加到工程——组建和控件——visual c++ components——pop-up-menu——insert——确定——add pop-up-menu to 中选择cmainmenu——关闭;

运行,右击鼠标,弹出菜单;

用到的函数:

trackpopupmenu()

函数功能:该函数在指定位置显示快捷菜单,并跟踪菜单项的选择。快捷菜单可出现在屏幕上的任何位置。

  函数原型:BOOL TrackPopupMenu(HMENU hMenu,UINT uFlags,int x,int y,int nReserved,HWND hWnd,CONST RECT* prcRect);

  hMenu:被显示的快捷菜单的句柄。此句柄可为调用CreatePopupMenu创建的新快捷菜单的句柄,也可以为调用GetSubMenu取得的与一个已存在菜单项相联系的子菜单的句柄。

  uFlags:一种指定功能选项的位标志。用下列标志位之一来确定函数如何水平放置快捷菜单:

  TPM_CENTERALIGN:若设置此标志,函数将按参数x指定的坐标水平居中放置快捷菜单。

  TPM_LEFTALIGN:若设置此标志,函数使快捷菜单的左边界与由参数X指定的坐标对齐。

  TPM_RIGHTALIGN:若设置此标志,函数使快捷菜单的右边界与由参数X指定的坐标对齐。

  用下列标志位之一来确定函数如何垂直放置快捷菜单:

  TPM_BOTTOMALIGN:若设置此标志,函数使快捷菜单的下边界与由参数y指定的坐标对齐。

  TPM_TOPALIGN:若设置此标志,函数使快捷菜单的上边界与由参数y指定的坐标对齐。

  TPM_VCENTERALIGN;若设置此标志,函数将按参数y指定的坐标垂直居中放置快捷菜单

  用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择:

  TPM_NONOTIFY:若设置此标志,当用户单击菜单项时函数不发送通知消息。

  TPM_RETURNCMD;若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。

  (补充:当TrackPopupMenu的返回值大于0,就说明用户从弹出菜单中选择了一个菜单。以返回的ID号为参数wParam的值,程序给自己发送了一个WM_SYSCOMMAND消息)

  用下列标志位之一来确定在快捷菜单跟踪哪一个鼠标键:

  TPM_LEFTBUTTON:若设置此标志,用户只能用鼠标左键选择菜单项。

  TPM_RIGHTBUTTON:若设置此标志,用户能用鼠标左、右键选择菜单项。

  X:在屏幕坐标下,快捷菜单的水平位置。

  Y:在屏幕坐标下,快捷菜单的垂直位置。

  NReserved:保留值,必须为零。

  HWnd:拥有快捷菜单的窗口的句柄。此窗口接收来自菜单的所有消息。函数返回前,此窗口不接受来自菜单的WM_COMMAND消息。

  如果在参数uFlags里指定了TPM_NONOTIFY值,此函数不向hWnd标识的窗口发消息。 但必须给hWnd里传一个窗口句柄,可以是应用程序里的任一个窗口句柄。

  PrcRect:未用。

  返回值:如果在参数uFlags里指定了TPM_RETURNCMD值,则返回值是用户选择的菜单项的标识符。如果用户未作选择就取消了菜单或发生了错误,则退回值是零。如果没在参数uFlags里指定TPM_RETURNCMD值,若函数调用成功,返回非零值,若函数调用失败,返回零。若想获得更多的错误信息,清调用GetLastError

手动添加弹出菜单方法:

1、在menu中添加菜单

2、在从view中添加句柄,在window消息句柄中选择WM_RBUTTONDOWN,添加句柄。

3、在OnRButtonDown中添加代码如下:

void CMenuView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMenu menu;
menu.LoadMenu(IDR_MENU1); //加载弹出菜单
CMenu *pPopup = menu.GetSubMenu(0);
ClientToScreen(&point); //将客户区窗口转为屏幕窗口
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
GetParent()); //GetParent()是指向cmainframe的指针,这样可以响应在cmainframe中添加的消息响应函数。
CView::OnRButtonDown(nFlags, point);
}

4、运行。

动态添加、删除、操作菜单:

用到的函数 AppendMenu(在现有菜单后添加菜单) creatpopupmenu(创建空的弹出菜单,将他和CMENU的一个对象关联起来)

eg:添加一个弹出菜单:

eg:插入一个弹出菜单:

InsertMenu

eg:删除一个菜单

DeleteMenu

手动添加响应函数:

1、定义ID号

在resource中的Header File下的Resource.h中添加

#define IDM_HELLO 111(定义ID号)

2. 添加函数

a、在头文件中写:afx_msg void OnHello() //消息原型

b、ON_COMMAND (IDM_HELLO,OnHello() //添加消息响应

c、添加函数

void CMainFrame::OnHello()
{
MessageBox("hello!");
}

d、运行,就可以发现winsun下的hello是可用的

分享到:
评论

相关推荐

    网吧游戏菜单 游戏菜单 家用游戏菜单

    【标题】:“网吧游戏菜单 游戏菜单 家用游戏菜单” 在当今的数字娱乐领域,网吧游戏菜单和家用游戏菜单扮演着至关重要的角色。它们是玩家与游戏库之间的桥梁,提供了一个用户友好的界面来浏览、选择和启动各种游戏...

    Qt实现的PC端环形菜单、悬浮球菜单、动画菜单、高级菜单

    在本文中,我们将深入探讨如何使用Qt框架来实现各种创新的菜单设计,包括环形菜单、悬浮球菜单和动画菜单。这些高级菜单设计为用户界面增添了互动性和视觉吸引力,是现代应用程序中提升用户体验的重要元素。 首先,...

    51单片机lcd多级菜单.rar_51单片机显示_LCD多级菜单_lcd 菜单_单片机菜单_多级菜单

    在这个“51单片机lcd多级菜单.rar”压缩包中,包含了关于如何在51单片机上实现LCD(液晶显示屏)多级菜单的资源,这对于设计交互式用户界面非常关键。下面将详细解释这一技术的核心知识点。 首先,我们需要理解51...

    Android实现上下文菜单、下拉菜单、选项菜单代码

    Android 实现上下文菜单、下拉菜单、选项菜单代码详解 Android 中的菜单系统是一个非常重要的组件,它提供了多种方式来帮助用户与应用程序进行交互。在本文档中,我们将详细介绍如何实现上下文菜单、下拉菜单和选项...

    VC 菜单制作实例(动态创建菜单、建立带图标的菜单)

    2. 添加顶级菜单项:调用`AppendMenu()`或`InsertMenu()`,传入菜单句柄、菜单类型(如MF_STRING表示文本菜单项)、菜单ID和菜单文本。 3. 添加子菜单项:如果需要创建子菜单,可以使用`AppendMenu()`,设置MF_POPUP...

    C# 向窗体的系统菜单添加菜单项

    在C#编程中,Windows Forms应用常常需要自定义窗口的操作,比如向系统菜单(也称为控制菜单或标题栏菜单)中添加额外的菜单项。这可以让用户更容易地访问应用程序特定的功能,而无需打开单独的菜单或者工具栏。下面...

    VB导航菜单 仿QQ菜单

    VB导航菜单 仿QQ菜单是一种在Visual Basic (VB)开发环境中创建类似QQ应用程序的垂直折叠式菜单的控件。这个控件的设计目的是提供一个简单、直观且可自定义的方式来构建用户界面,使得开发者能够轻松地为应用程序添加...

    html实现好看的多种风格导航菜单(源码)

    html实现好看的多种风格导航菜单(附源码),导航菜单,源码下载,分为顶部导航菜单,悬浮按钮菜单,右键功能菜单,左侧导航菜单四种导航菜单。每种导航菜单有至少三种风格,总共23种风格,各种风格都有,代码上手简单,...

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

    在对话框中实现右键快捷菜单,尤其是多级菜单,可以增强用户交互体验,使得功能调用更为便捷。下面将详细阐述如何在MFC对话框中动态添加右键快捷菜单,并实现多级结构。 首先,我们需要了解MFC中的菜单系统。MFC将...

    京东左侧商品分类菜单JS弹出式菜单

    京东左侧商品分类菜单就是一个典型的实例,它采用JavaScript(JS)技术实现了一个高效的、弹出式的导航菜单。这种菜单设计旨在为用户提供方便快捷的商品浏览方式,同时优化网站的可用性。本文将深入探讨这个菜单的...

    Labview 设置菜单栏

    在Labview中,菜单栏位于窗口的顶部,包含了如“文件”、“编辑”、“查看”等标准菜单项,每个菜单项下又可能有多个子菜单。这些菜单项对应着程序的不同功能,点击它们可以触发相应的操作。 设置Labview菜单栏的...

    axure rp9.0 左联菜单功能框架

    1、界面描述:分为左侧菜单功能区,右侧为上方是打开菜单区,下方是打开的功能显示区。 2、使用介绍: 左侧菜单使用中继器进行菜单的动态加载,菜单分两级,可建立多个菜单。在多个菜单进行功能切换时,自动实现菜单...

    链表实现多级菜单

    在本文中,我们将深入探讨如何使用链表来实现多级菜单系统,特别是在单片机环境中的应用。链表作为一种高效的数据结构,对于动态构建和管理菜单具有显著的优势,尤其是在内存有限的环境中。 首先,让我们理解链表的...

    Delphi Edit右键系统菜单加自定义菜单项

    "Delphi Edit右键系统菜单加自定义菜单项" 是一个典型的增强用户界面交互的例子。在这个话题中,我们将深入探讨如何在Delphi中的TEdit控件上添加自定义的右键菜单,同时保持原有的系统菜单功能。 首先,我们要理解...

    头部超级菜单导航-鼠标放上去显示二级菜单

    在网页设计中,头部超级菜单导航是一种常见的交互模式,它能有效地组织大量链接,提高用户在网站中的导航效率。这种设计通常应用于大型网站或电子商务平台,以提供清晰、直观的层级结构,帮助用户快速找到所需信息。...

    labview菜单响应设计

    菜单结构为: 系统(启动、退出)操作(升温、降温)、帮助 菜单行为如下: 1)当VI初始运行时,升温和降温两个菜单项处于无效(Disable)状态,当用户点击启动菜单项后,这两个菜单变为使能(Enable)状态,同时启动...

    顶级菜单和右键自绘菜单的混合

    在Windows应用程序开发中,设计用户友好的交互界面是至关重要的,而菜单系统是其中不可或缺的一部分。本主题将深入探讨如何实现“顶级菜单和右键自绘菜单的混合”,这是一个高级的UI技术,允许开发者创建更加个性化...

    js树形菜单加右键菜单

    在IT行业中,树形菜单和右键菜单是两种常见的用户界面元素,它们为用户提供了一种组织和交互数据的有效方式。本文将深入探讨这两种菜单的概念、实现原理以及它们在实际项目中的应用,特别是如何在JavaScript环境下...

    C#实现和开始菜单一样漂亮的菜单

    在C#编程环境中,开发一款类似Windows开始菜单的漂亮菜单是一项常见的需求,尤其对于桌面应用开发者来说。C# 2005版本提供了丰富的UI设计工具和类库,使得实现这样的功能变得相对容易,对比VC++(Visual C++),其...

    js右键菜单,菜单项由js动态添加,纯js调用

    本文将深入探讨如何使用JavaScript实现右键菜单,特别是如何动态添加菜单项,并在菜单项中添加图标、文本以及处理点击事件。此外,我们还将讨论在不同浏览器(如IE、Firefox和Chrome)中的兼容性问题。 首先,右键...

Global site tag (gtag.js) - Google Analytics