第7章资源在Windows编程中的应用.ppt
《第7章资源在Windows编程中的应用.ppt》由会员分享,可在线阅读,更多相关《第7章资源在Windows编程中的应用.ppt(76页珍藏版)》请在三一办公上搜索。
1、第7章 资源在Windows编程中的应用,在Windows应用程序中可以使用几种不同类型的资源,加速键位图对话框和菜单等,菜单是Windows图形用户界面中窗口的重要组成部分,菜单可使用户直观地了解并使用应用程序所提供的功能,加速键可使菜单的操作更灵活快捷,两种资源往往密不可分,7.1菜单与加速键资源,用以标识菜单所具有的载入特性,菜单定义结构,菜单名,MENU关键字,载 入 特 性 选 项,菜单项,7.1.1菜单的创建过程,POPUP语句定义弹出式菜单,其形式为:POPUP“菜单项名”,选项;在菜单项名中加入符号“&”可定义该菜单项的热键。例如:POPUP“编辑(&E)”;该菜单项使用Alt
2、+E键作为热键。菜单项的常用选项及其说明见下表。,POPUP定义的弹出式菜单项还包含子菜单,MENUITEM语句用于定义菜单项,其形式为:MENUITEM“菜单项名”菜单项标识(ID),选项,WM_COMMAND消息中字参数wParam中包含选中菜单项的标识,使用下面的语句可创建菜单中的水平分隔符:MENUITEM SEPARATOR;,例 在“Menu”的窗口中创建一个“文件”菜单。该菜单含有“新建”、“打开”、“关闭”、“保存”、“另存为”及“退出”等菜单项。菜单项均使用热键;并且“退出”项与其他菜单项之间用分隔线分开。,#include#include“Menu.h”菜单定义Menu M
3、ENU MOVEABLE Menu为窗口菜单的名称 POPUP“文件(&F)”定义“文件”弹出式菜单 MENUITEM“新建(&N)”,IDM_NEW MENUITEM“打开(&O)”,IDM_OPEN MENUITEM“关闭(&C)”,IDM_CLOSE MENUITEM“保存(&S)”,IDM_SAVE MENUITEM“另存为(&A)”,IDM_SAVEAS MENUITEM SEPARATOR 分隔线 MENUITEM“退出(&X)”,IDM_EXIT,2.加载菜单资源,WNDCLASS wndclass;wndclass.lpszMenuName=lpszMenuName;,1.在窗
4、口类中加载菜单,应用程序需先调用函数LoadMemu加载菜单 HMENU LoadMemu(hInstance,/当前程序的实例句柄 lpszMenuName/窗口菜单名);如:hmenu=LoadMenu(hlnstance,Menu);hwnd=CreateWindow(,hmenu,,);,2.在创建窗口时加载菜单,3.动态加载菜单,应用程序获取菜单句柄后,可通过SetMenu动态地加载菜单 BOLL SetMenu(/HWND为窗口句柄,HMENU为菜单句柄 HWND hwnd,HMENU hmenu);,在应用程序中加载菜单有三种方法,可在同一个应用程序中实现多种不同的菜单操作界面,
5、菜单操作,禁止或激活菜单项(指定该菜单项的初始状态)设置或取消选中标志(“”)增加、删除或修改菜单项等操作,7.1.2菜单项的操作,创建菜单时,可以调用函数EnableMenuItem改变其初始状态DWORD EnableMenuItem(HMENU hmenu,UlNT wIDEnableItem,/被禁止或激活的菜单项标识 UINT dwEnable)/dwEnable为菜单项操作标识,MF_BYCOMMAND以ID值标识菜单项MF_ENABLED激活菜单项MF_BYPOSITION以位置标识菜单项MF_GRAYED禁止菜单项并使其变灰显示MF_DISABLED禁止菜单项,菜单项的ID值/
6、在菜单中位置,例如,禁止弹出式菜单“文件”中的“打开”项的形式如下:EnableMenuItem(hmenu,IDM_OPEN,MF_BYCOMMAND|MF_DISABLED);,1.禁止或激活菜单项,(1)在资源描述文件中设置菜单项的为CHECKED(2)调用函数CheckMenuItem设置或取消选中标志,DWORD CheckMenultem(HMENU hmen,UINT wIDCheckItem,/设置或取消选中标志的菜单项标识UINT dwCheck)/操作标识,据dwCheck的取值,可为该菜单项的ID值或为该菜单项在菜单中位置,MF_BYCOMMAND表明以ID值标识菜单项M
7、F_CHECKED添加选中标志MF_BYPOSITION表明以位置标识菜单项MF_UNCHECKED删除选中标志,2.设置或取消选中(“”)标志,两种形式:尾部增加/菜单中插入,3.增加菜单项,例如:在弹出式菜单“文件”的“退出”项之前加入新的菜单项“打印”的语句lnsertMenu(hmenu,IDM_EXIT,MF_BYCOMMAND|MFENABLED,IDM_PRINT,“打印(&P)”);,例如在弹出式菜单“文件”的末尾增加一项“关于”的形式如下:AppendMenu(hmenu,MF_ENABLED,IDM_ABOUT,“关于(&A)”);,应用程序可调用函数DeleteMenu
8、删除菜单项 BOOL DeleteMenu(HMENU hmenu,UINT wPosition,/要删除菜单项的位置 UINT dwFlag);/对wPosition的解释 例如,删除弹出式“文件”菜单中的“另存为”项的形式如下:DeleteMenu(hmenu,IDM_SAVEAS,MF_BYCOMMAND),若删除的菜 单项含有弹出式菜单则同时被删除。,4.删除菜单项,调用函数ModifyMenu可修改菜单中的某个项BOOL ModifyMenu(HMENU hmenu,UINT wPosition,/指定需修改的菜单项位置UINT dwFlag,UINT dwIDNweItem,/一般
9、为修改后菜单项的标识LPCTSTR lpNewItem);/一般为修改后的菜单项名,例如修改弹出式菜单“文件”中“打开”项为“加载”项的语句如下:ModifyMenu(hmenu,IDM_OPEN,MF_BYCOMMAND,IDM _LOAD“加载(&L)”);,5.修改菜单项,1.调用函数createmenu创建空的弹出式菜单 HMENU CreateMenu(void),2.调用函数AppendMenu或InsertMenu在该菜单中加入菜单项 AppendMenu(hmenu,/已有的菜单句柄MF_POPUP,/创建的新弹出式菜单句柄(UINT)hmenuPopup,/该弹出式菜单的名字
10、lpszTitie);,动态地创建菜单可使系统资源更加节省,创建菜单分两个步骤:,7.1.3菜单的动态创建,例如,在窗口菜单中动态创建弹出式菜单“编辑”的过程如下:HMENU hmenu,/主窗口菜单句柄hPopupmenu;/创建新的菜单句柄,定义菜单句柄hPopumenu:CreateMenul;,/在弹出式菜单中增加菜单项AppenMenu(hPopupmenu,MF_STRWG,IDM_COPY,“复制(&E)”);,/将弹出式菜单加入到菜单中AppendMenu(lmenu,MF_POPUP,(UINT)hmenuPopup,“编辑(&E)”);,常伴随菜单使用的一种非常有用的资源,
11、创建加速键的步骤,1.在资源描述文件中定义加速键资源,2.加载加速键资源,3.翻译加速键,7.1.4加速键资源,常用的加速键有两种形式:“char”,id 与Ctrl 键组合的加速键。例如“文件”菜单中“保存”项的加速键可定义为:“S”,IDM_SAVE,nCode,id VIRTKEY 使用虚拟键作为加速键。如VK_F1,VK_DELETE等。例如将F1键定义为“帮助”菜单项的加速键,其形式如下:VK_F1,IDM_HELP,VIRKEY,下面是资源描述文件对名为“Menu”的窗口菜单项的加速键定义:#include#includeMenu.h菜单定义加速键表定义Menu ACCELERAT
12、ORS 加速键表名为“Menu”“N”,IDM_NEW“O”,IDM_OPEN“S”,IDM_SAVE,1加载加速键资源,通过函数LoadAccelerators加载加速键资源,其形式为:HACCEL hAccel;hAccel=LoadAccelerators(hInstance,/hInstance为当前程序实例句柄lpAcceIName/lpAccelName为加速键表名);,2翻译加速键,使用加速键可实现菜单项快捷切换,应用程序在消息循环中必须完成加速键消息到菜单消息的翻译。while(GetMessage(&Msg,NULL,0,0)if(!TranslateAccelerators
13、(hwnd,hAccel,&Mag)TranslateMessage(&Msg);DispatchMessage(&Msg);,函数TranslateAccelerators是翻译操作的核心int TranslateAccelerators(HWND hwnd,/为窗口句柄HACCEL hAccel,/为加速键表句柄lpMSG lpMsg/为指向MSG结构的指针),【例7-1】菜单资源及其创建。本例创建一个通用的窗口菜单的构架,用户可通过选择“文件”弹出式菜单中的“创建统计计算菜单项”动态地创建主菜单中的“统计计算”菜单项。图7-1是一个基本的菜单构架,图7-2是动态创建“统计计算”下拉菜单的
14、界面。,图7-1,图7-2,7.1.5 创建菜单资源实例,该程序的实现步骤如下:,(3)调用函数DrawMenuBar重新显示改变后的窗口主菜单。BOOL DrawMenuBar(HWND hwnd),(1)用GetMenu获取窗口主菜单句柄 int GetMenu(HWND hwnd);,(2)应用程序建立新菜单、加入菜单项并插入到主菜单的指定位置。在创建新的弹出式菜单后,应用程序还通过调用函数 EnableMenuItem禁止“创建统计计算菜单项”并将其暗淡显示。,函数SendMessage 在应用程序中经常使用,其功能是向窗口发送消息LONG SendMessage(HWND hwnd,
15、UINT Msg,DWORD dwParam,LONG lParam)其中:Msg为发送的消息;dwParam和lParam均为消息的附加信息。,创建“统计计算”菜单项后,可通过选择“文件”下拉菜单中的“删除统计计算菜单项”删除创建的“统计计算”菜单项。,应用程序调用函数DeleteMenu删除该菜单项,并调用函数EnableMenuItem恢复“创建统计计算菜单项”的属性。此外,该程序在响应“文件”弹出式菜单中的“退出”项时还使用了函数SendMessage。,/菜单示例.c#include#include#include#include#define IDM_NEW 10#define I
16、DM_OPEN 11#define IDM_CLOSE 12#define IDM_SAVE 13#define IDM_SAVEAS 14#define IDM_ADDPRINTMENU 15#define IDM_DELPRINTMENU 16#define IDM_EXIT 17#define IDM_CUT 18#define IDM_COPY 19#define IDM_PASTE 20#define IDM_DELETE 21#define IDM_HELP 22#define IDM_LINE 23#define IDM_RECT 24#define IDM_RRECT 25#d
17、efine IDM_ELLIP 26,HMENU hmenu,hprintmenu;/定义菜单句柄LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);,int WINAPI WinMain()HWND hwnd;MSG Msg;HACCEL hAccel;WNDCLASS wndclass;char lpszMenuName=Menu;char lpszClassName=菜单;char lpszTitle=My_Menu_Example;wndclass.style=0;wndclass.lpszClassName=lpszClassName;
18、if(!RegisterClass(,加载加速键资源,LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam),switch(message)case WM_COMMAND:/处理菜单消息 switch(LOWORD(wParam)case IDM_NEW:break;case IDM_OPEN:break;case IDM_SAVE:break;case IDM_SAVEAS:break;case IDM_CLOSE:break;case IDM_ADDPRINTMENU:hmenu=GetMen
19、u(hwnd);/获取主菜单句柄 hprintmenu=CreateMenu();/动态创建菜单 AppendMenu(hprintmenu,MF_ENABLED,IDM_LINE,求和);AppendMenu(hprintmenu,MF_ENABLED,IDM_RECT,方差);AppendMenu(hprintmenu,MF_ENABLED,IDM_RRECT,平均值);AppendMenu(hprintmenu,MF_ENABLED,IDM_ELLIP,“均方根”);InsertMenu(hmenu,2,MF_POPUP|MF_BYPOSITION,(UINT)hprintmenu,统计
20、计算(,增加菜单项,添加弹出式统计计算菜单,将创建的弹出式菜单插入主菜单中,改变“统计计算”菜单项的属性,case IDM_DELPRINTMENU:/从主菜单中删除弹出式统计计算菜单 DeleteMenu(hmenu,2,MF_BYPOSITION);/删除统计计算菜单项 EnableMenuItem(hmenu,IDM_ADDPRINTMENU,MF_ENABLED);EnableMenuItem(hmenu,IDM_DELPRINTMENU,MF_GRAYED);DrawMenuBar(hwnd);/重新显示窗口菜单break;case IDM_EXIT:/选择“退出”时,发出WM_DE
21、STROY消息SendMessage(hwnd,WM_DESTROY,0,0);break;case IDM_CUT:break;case IDM_COPY:break;case IDM_PASTE:break;case IDM_DELETE:break;break;,改变“文件”菜单中有关“统计计算”菜单项的属性,case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd,message,wParam,lParam);return 0;,对应case WM_COMMAND菜单消息,本例菜单资源文件中的部
22、分内容MENU MENU DISCARDABLE BEGIN POPUP 文件(&F)BEGIN MENUITEM 新建(&N)t Ctrl+N,IDM_NEW MENUITEM 打开(&O)t Ctrl+O,IDM_OPEN MENUITEM 关闭(&C),IDM_CLOSE MENUITEM SEPARATOR MENUITEM 保存(&S)t Ctrl+S,IDM_SAVE MENUITEM 另存为(&A),IDM_SAVEAS MENUITEM SEPARATOR MENUITEM 创建统计计算菜单项(&P)t Ctrl+P,IDM_ADDPRINTMENU MENUITEM删除统计计
23、算菜单项(&D)tCtrl+D,IDM_DELPRINTMENU,GRAYED MENUITEM SEPARATOR MENUITEM 退出(&X),IDM_EXIT END POPUP 编辑(&E)BEGIN MENUITEM 剪切(&T)t Ctrl+X,IDM_CUT MENUITEM 复制(&C)t Ctrl+C,IDM_COPY MENUITEM 粘贴(&P)t Ctrl+V,IDM_PASTE MENUITEM 删除(&D)t Del,IDM_DELETE END MENUITEM 帮助(&H),IDM_HELPEND,本例中的加速键MENU ACCELERATORS MOVEAB
24、LE PURE BEGIN N,IDM_NEW,ASCII O,IDM_OPEN,ASCII S,IDM_SAVE,ASCII P,IDM_ADDPRINTMENU,ASCII D,IDM_DELPRINTMENU,ASCII X,IDM_CUT,ASCII C,IDM_COPY,ASCII V,IDM_PASTE,ASCII VK_DELETE,IDM_DELETE,VIRTKEY END,创建一个菜单,其中有三个菜单项,分别为“文件”、“计算”和“帮助”,其中,“文件”菜单项包含“打开”、“保存”、“另存为”、“退出”等菜单选项;“计算”菜单包含“总和”、“方差”、“均方根”等菜单选项;“
25、帮助”菜单项包含“计算总和帮助”、“计算方差帮助”和“计算均方根帮助”以及“关于”等项。,WndClass.lpszMenuName=“Menu”;/定义菜单名,定义及加载菜单资源实例,资源文件Menu MENU DISCARDABLE/定义菜单条 POPUP 文件(&F)/定义弹出菜单 MENUITEM 打开(&O),IDM_NEW/定义打开菜单 MENUITEM 保存(&S),IDM_SAVE/定义保存菜单 MENUITEM 另存为(&A),IDM_SAVEAS/定义保存为菜单 MENUITEM SEPARATOR/定义分割条 MENUITEM 退出(&E),IDM_EXIT/定义退出菜单
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 资源 Windows 编程 中的 应用
链接地址:https://www.31ppt.com/p-2811850.html