您好,欢迎访问三七文档
第12章菜单和键盘加速键在Windows应用程序中可以使用几种不同类型的资源加速键位图对话框和菜单等这些资源可以使用VC提供的资源编辑器来实现创建和编辑资源的使用,方便了应用程序与用户之间的交互菜单是Windows图形用户界面中窗口的重要组成部分菜单可使用户直观地了解并使用应用程序所提供的功能加速键可使菜单的操作更灵活快捷两种资源往往密不可分窗口主菜单条下拉式菜单框菜单项热键标识菜单项加速键标识菜单项分隔线选中与否的标识12.1菜单与加速键资源创建菜单过程分为定义和加载两个步骤1.定义菜单选项说明DISCARDABLE当不再需要菜单时可丢弃FIXED将菜单保存在内存中的固定位置LOADONCALL需要时加载菜单MOVEABLE菜单在内存中可移动PRELOAD立即加载菜单菜单项是菜单的组成部分。应用程序在资源描述文件中使用关键字POPUP和MENUITEM定义菜单项菜单名MENU[,选项]{菜单项列表}菜单在资源描述文件中定义用以标识菜单所具有的载入特性菜单定义结构菜单名MENU关键字载入特性选项菜单项12.1.1菜单的创建过程POPUP语句定义弹出式菜单,其形式为:POPUP“菜单项名”[,选项];在菜单项名中加入符号“&”可定义该菜单项的热键。例如:POPUP“编辑(&E)”;该菜单项使用Alt+E键作为热键。菜单项的常用选项及其说明见下表。选项说明MENUBARBREAK菜单项纵向分隔标志CHECKED显示选中标志INACTIVE禁止一个菜单项GRAYED禁止一个菜单项并使其变灰显示POPUP定义的弹出式菜单项还包含子菜单MENUITEM语句用于定义菜单项,其形式为:MENUITEM“菜单项名”菜单项标识(ID)[,选项]每个菜单项的标识必须唯一应用程序通过此标识值确认每一个菜单项消息标识值可为0到65535之间的任一整数ID为菜单项标识WM_COMMAND消息中字参数wParam中包含选中菜单项的标识使用下面的语句可创建菜单中的水平分隔符:MENUITEMSEPARATOR;[例]在“Menu”的窗口中创建一个“文件”菜单。该菜单含有“新建”、“打开”、“关闭”、“保存”、“另存为”及“退出”等菜单项。菜单项均使用热键;并且“退出”项与其他菜单项之间用分隔线分开。#includewindows.h#include“Menu.h”∥菜单定义MenuMENUMOVEABLE∥Menu为窗口菜单的名称{POPUP“文件(&F)”∥定义“文件”弹出式菜单{MENUITEM“新建(&N)”,IDM_NEWMENUITEM“打开(&O)”,IDM_OPENMENUITEM“关闭(&C)”,IDM_CLOSEMENUITEM“保存(&S)”,IDM_SAVEMENUITEM“另存为(&A)”,IDM_SAVEASMENUITEMSEPARATOR∥分隔线MENUITEM“退出(&X)”,IDM_EXIT}}Menu.h定义了菜单项标识所对应的数值:…#defineIDM_NEW10#defineIDM_OPEN11#defineIDM_CLOSE12#defineIDM_SAVE13#defineIDM_SAVEAS14#defineIDM_EXIT15…2.加载菜单资源…WNDCLASSwndclass;…wndclass.lpszMenuName=lpszMenuName;1.在窗口类中加载菜单应用程序需先调用函数LoadMemu加载菜单HMENULoadMemu(hInstance,//当前程序的实例句柄lpszMenuName//窗口菜单名);如:hmenu=LoadMenu(hlnstance,Menu);hwnd=CreateWindow(…,hmenu,…,);2.在创建窗口时加载菜单3.动态加载菜单应用程序获取菜单句柄后,可通过SetMenu动态地加载菜单BOLLSetMenu(//HWND为窗口句柄,HMENU为菜单句柄HWNDhwnd,HMENUhmenu);在应用程序中加载菜单有三种方法可在同一个应用程序中实现多种不同的菜单操作界面菜单操作禁止或激活菜单项(指定该菜单项的初始状态)设置或取消选中标志(“√”)增加、删除或修改菜单项等操作12.1.2菜单项的操作创建菜单时,可以调用函数EnableMenuItem改变其初始状态DWORDEnableMenuItem(HMENUhmenu,UlNTwIDEnableItem,//被禁止或激活的菜单项标识UINTdwEnable)//dwEnable为菜单项操作标识MF_BYCOMMAND以ID值标识菜单项MF_ENABLED激活菜单项MF_BYPOSITION以位置标识菜单项MF_GRAYED禁止菜单项并使其变灰显示MF_DISABLED禁止菜单项菜单项的ID值/在菜单中位置例如,禁止弹出式菜单“文件”中的“打开”项的形式如下:EnableMenuItem(hmenu,IDM_OPEN,MF_BYCOMMAND|MF_DISABLED);1.禁止或激活菜单项(1)在资源描述文件中设置菜单项的为CHECKED(2)调用函数CheckMenuItem设置或取消选中标志DWORDCheckMenultem(HMENUhmen,UINTwIDCheckItem,//设置或取消选中标志的菜单项标识UINTdwCheck)//操作标识据dwCheck的取值,可为该菜单项的ID值或为该菜单项在菜单中位置MF_BYCOMMAND表明以ID值标识菜单项MF_CHECKED添加选中标志MF_BYPOSITION表明以位置标识菜单项MF_UNCHECKED删除选中标志2.设置或取消选中(“√”)标志两种形式:尾部增加/菜单中插入(a)在菜单的尾部增加菜单项可调用函数AppendMenuBOOLAppendMenu(HMENUhmenu,//新菜单项的类型标识或其他信息UINTdwFlags,UINTdwIDNewItem,//菜单项的标识菜单项内容,取决与dwFlags参数LPCTSTRlpNewItem)//1.通常是插入项的ID值;2.若加入的是弹出式菜单,则为此菜单句柄(b)在菜单中插入菜单项调用函数InsertMenuBOOLlnsertMenu(HMENUhmenu,UINTwPosition,//菜单项插入的位置//新菜单项的信息及对wPosition的解释UINTdwFlag,UINTdwIDNweltem,//菜单项的ID标识//菜单项的内容LPCTSTRlpNewltem)dwFlagMF_BYCOMMAND:wPosition为插入位置的下一个菜单项的ID值MF_BYPOSITION:wPosition为插入的位置号3.增加菜单项例如:在弹出式菜单“文件”的“退出”项之前加入新的菜单项“打印”的语句lnsertMenu(hmenu,IDM_EXIT,MF_BYCOMMAND|MF_ENABLED,IDM_PRINT,“打印(&P)”);例如在弹出式菜单“文件”的末尾增加一项“关于”的形式如下:AppendMenu(hmenu,MF_ENABLED,IDM_ABOUT,“关于(&A)”);应用程序可调用函数DeleteMenu删除菜单项BOOLDeleteMenu(HMENUhmenu,UINTwPosition,//要删除菜单项的位置UINTdwFlag);//对wPosition的解释例如,删除弹出式“文件”菜单中的“另存为”项的形式如下:DeleteMenu(hmenu,IDM_SAVEAS,MF_BYCOMMAND)若删除的菜单项含有弹出式菜单则同时被删除。4.删除菜单项调用函数ModifyMenu可修改菜单中的某个项BOOLModifyMenu(HMENUhmenu,UINTwPosition,//指定需修改的菜单项位置UINTdwFlag,UINTdwIDNweItem,//一般为修改后菜单项的标识LPCTSTRlpNewItem);//一般为修改后的菜单项名例如修改弹出式菜单“文件”中“打开”项为“加载”项的语句如下:ModifyMenu(hmenu,IDM_OPEN,MF_BYCOMMAND,IDM_LOAD“加载(&L)”);5.修改菜单项1.调用函数createmenu创建空的弹出式菜单HMENUCreateMenu(void)2.调用函数AppendMenu或InsertMenu在该菜单中加入菜单项AppendMenu(hmenu,//已有的菜单句柄MF_POPUP,//创建的新弹出式菜单句柄(UINT)hmenuPopup,//该弹出式菜单的名字lpszTitie);动态地创建菜单可使系统资源更加节省,创建菜单分两个步骤:12.1.3菜单的动态创建例如,在窗口菜单中动态创建弹出式菜单“编辑”的过程如下:…HMENUhmenu,//主窗口菜单句柄hPopupmenu;//创建新的菜单句柄…定义菜单句柄hPopumenu:CreateMenul;…//在弹出式菜单中增加菜单项AppenMenu(hPopupmenu,MF_STRWG,IDM_COPY,“复制(&E)”);//将弹出式菜单加入到菜单中AppendMenu(lmenu,MF_POPUP,(UINT)hmenuPopup,“编辑(&E)”);常伴随菜单使用的一种非常有用的资源创建加速键的步骤1.在资源描述文件中定义加速键资源2.加载加速键资源3.翻译加速键加速键定义的格式为:键名,加速键标识(ID),[类型][NOINVERT][ALT][SHIFT][CONTROL]组合键的组合方式使用加速键时,菜单项不高亮度显示标识该键为标准键还是虚拟键与所表示的菜单项标识相同的标识值12.1.4加速键资源常用的加速键有两种形式:①“^char”,id与Ctrl键组合的加速键。例如“文件”菜单中“保存”项的加速键可定义为:“^S”,IDM_SAVE②nCode,idVIRTKEY使用虚拟键作为加速键。如VK_F1,VK_DELETE等。例如将F1键定义为“帮助”菜单项的加速键,其形式如下:VK_F1,IDM_HELP,VIRKEY下面是资源描述文件对名为“Menu”的窗口菜单项的加速键定义:#includewindows.h#includeMenu.h…∥菜单定义∥加速键表定义MenuACCELERATORS∥加速键表名为“Menu”{“^N”,IDM_NEW“^O”,IDM_OPEN“^S”,IDM_SAVE}1.加载加速键资源通过函数LoadAccelerators加载加速键资源,其形式为:…HACCELhAccel;…hAccel=LoadAccelerators(hInstance,//hInstance为当前程序实例句柄lpAcceIName//lpAccelName为加速键表名);2.翻译加速键使用加速键可实现菜单项快捷切换,应用程序在消息循环中必须完成加速键消息到菜单消息的翻译。while(GetMessage(&Msg,NULL,0,0)){if(!TranslateAccelerators(hwnd,hAccel,&Mag)){TranslateMessage(&Msg);DispatchMessage(&Msg);}}函数TranslateAccelerators是翻译操作的核心intTranslateAccelerators(HWNDhwnd,//为窗口句柄HACCELhAccel,//为加速键表句柄lpMSGlpMsg//为指向MSG结构的指针)函数TranslateAccelerators的作用是对照加速键表,将相关的按键消息WM_KEYDOWN和WM_KEYUP翻译成WM_COMMAND或WM_SYSCOMMAND的消息。其特点是将翻译后的WM_COMMAND或WM_SYSCOMMAND消息直接发往窗口,而不在消息队列中等待【例12-1】菜单资源及其创建。本例创建一个通用的窗口菜单的构架,用户可通过选择“文件”弹出式菜单中的“创建统计计算菜单项”动态
本文标题:VC++第12章
链接地址:https://www.777doc.com/doc-2866006 .html