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