《第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/定义退出菜单
26、 POPUP 计算(&S)/定义弹出菜单 MENUITEM 计算总和(&S),IDM_SUM/定义计算总和菜单 MENUITEM 计算方差(&D),IDM_DEVIA/定义计算方差菜单 MENUITEM 计算均方差(&T),IDM_STDDEVIA/计算均方差菜单 POPUP 帮助(&H)/定义帮助弹出菜单 MENUITEM 计算总和帮助(&S),IDM_SUMHELP/计算总和帮助菜单 MENUITEM 计算方差帮助(&D),IDM_DEVIAHELP/计算方差帮助菜单 MENUITEM 计算均方差帮助(&T),IDM_STDDEVIAHELP/计算均方差帮助菜单 MENUITEM SEPA
27、RATOR/定义分割条 MENUITEM 关于(&A),IDM_ABOUT/定义关于菜单,在上例的基础上增加新功能。若在用户区内按下鼠标左键,则动态创建一个包括“删除计算总和”、“添加计算平均值”和“修改计算均方差”三个菜单项的弹出式菜单,由此菜单控制“计算”菜单中菜单项的删除、添加与修改。(要求新的弹出式菜单开始时不可用,按下右键后变为可用。),单击“修改计算均方差”菜单项后,“计算”菜单下的“计算均方差”项改为“线性拟合”,单击“添加计算平均值”菜单项后,“计算”菜单中添加上了“计算平均值”菜单项。,菜单项操作实例,long WINAPI WndProc(HWND hWnd,UINT iM
28、essage,UINT wParam,LONG lParam)static BOOL create=TRUE;switch(iMessage)case WM_LBUTTONDOWN:/按下鼠标左键后响应的消息 if(create=TRUE)hChildMenu=CreateMenu();hMenu=GetMenu(hWndMain);AppendMenu(hChildMenu,MF_GRAYED,IDM_DELETE,删除计算总和);AppendMenu(hChildMenu,MF_GRAYED,IDM_ADD,添加计算平均值);AppendMenu(hChildMenu,MF_GRAYED,
29、IDM_MODIFY,修改计算均方差);InsertMenu(hMenu,3,MF_POPUP|MF_BYPOSITION,(UINT)hChildMenu,修改菜单);DrawMenuBar(hWndMain);create=FALSE;break;,case WM_RBUTTONDOWN:if(create=FALSE)EnableMenuItem(hMenu,IDM_DELETE,MF_ENABLED|MF_BYCOMMAND);EnableMenuItem(hMenu,IDM_ADD,MF_ENABLED|MF_BYCOMMAND);EnableMenuItem(hMenu,IDM_M
30、ODIFY,MF_ENABLED|MF_BYCOMMAND);break;,case WM_COMMAND:if(wParam=IDM_DELETE)DeleteMenu(hMenu,IDM_SUM,MF_BYCOMMAND);else if(wParam=IDM_ADD)InsertMenu(hMenu,IDM_DEVIA,MF_BYCOMMAND|MF_ENABLED,IDM_AVERAGE,计算平均值);else if(wParam=IDM_MODIFY)ModifyMenu(hMenu,IDM_STDDEVIA,MF_BYCOMMAND,IDM_NIHE,线性拟合);else;brea
31、k;,case WM_DESTROY:PostQuitMessage(0);return 0;default:return(DefWindowProc(hWnd,iMessage,wParam,lParam);return 0;,1位图概念,为提高显示刷新速度,位图操作须在内存中进行。用于位图操作的设备环境为内存设备环境。用函数CreateCompatibleDC向系统申请获取内存设备环境。hdcmem=CreateCompatibleDC(hdc);,内存设备环境也有设备描述表。获取内存设备环境后,还要调用SelectObject将位图文件选入内存设备环境,才可在内存设备环境中操作位图,操作
32、位图结束后,应用程序须调用DeleteDC释放内存设备环境。DeleteDC(hdcmem);/hdcmem:内存设备环境句柄,7.2 位图资源及其应用,2.位图的操作过程,应用程序通过响应消息WM_CREATE完成加载或创建位图操作 case WM_CREATE:hdc=GetDC(hwnd);/获取设备环境 hdcmem=CreateCompatibleDC(hdc);/获取内存设备环境/进行一系列操作 ReleaseDC(hwnd,hdc);/释放设备环境,另外,在输出位图之前,经常要调用GetObject获取位图的尺寸函数GetObject的作用是获取指定对象的信息并将其拷贝到指定的缓
33、冲区内。int GetObject(HANDLE hObject,/对象句柄int nCount,/拷贝到缓冲区的字节数LPVOID lpObject/接收信息的缓冲区地址),【例7-2】位图操作示例。本例调用一幅图片,并在用户窗口区上显示。,本例的资源文件如下:forest BITMAP forest.bmp/定义位图资源,3.位图操作实例,1.#include#include 2.#include#include 3.LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);4.HDC hdc,hdcmem;/设备环境句柄和内存设备环境句柄5.HB
34、ITMAP hBm;/位图句柄6.BITMAP bm;/BITMAP结构7.int WINAPI WinMain(,)8.HWND hwnd;MSG Msg;WNDCLASS wndclass;9.char lpszClassName=位图;10.char lpszTitle=Example_For_BitMap;11.wndclass.style=0;12.13.wndclass.lpszClassName=lpszClassName;14.if(!RegisterClass(23.,LRESULT CALLBACK WndProc(,)PAINTSTRUCT ps;switch(messa
35、ge)case WM_CREATE:hdc=GetDC(hwnd);/获取设备环境hdcmem=CreateCompatibleDC(hdc);/获取内存设备环境ReleaseDC(hwnd,hdc);/释放设备环境 break;case WM_PAINT:hdc=BeginPaint(hwnd,对话框资源通常有如下功能:发送消息如警告消息、提示框消息接收输入如用户输入的消息提供消息如常见的“关于”对话框,不允许用户在关闭对话框之前切换到应用程序的其他窗口,允许用户在该对话框与应用程序其他窗口之间的切换,7.3 对话框资源及其应用,7.3.1 模式对话框的编程方法,对话框消息处理函数具有与主窗
36、口函数相似的参数,但两者存在不同,在对话框消息处理函数中常响应以下两类消息:(a)WN_ INITDIALOG 消息 完成其初始化操作,在功能上与主窗口函数的WM_COMMAND消息相似。(b)WM_COMMAND消息 通过查看消息字参数(wParam)中的低位字节,与控件标识(ID)相比较,以确定产生交互请求的控件并据此转入相应的处理过程处理。,消息框是模态对话框的特殊形式,调用MessageBox生成消息框int MessageBox(HWND hwnd,/拥有消息框的窗口 LPCTSTR lpszText,/消息框中显示的字符串 LPCTSTR lpszCaption,/作为标题的字符串
37、 DWORD dwType/指定消息框的内容),这些标识可以组合使用,【例7-3】该对话框含有标题栏、系统菜单、简要信息及一个按钮控件。,7.3.2 模态对话框应用实例,#include#include 7_3.hHINSTANCE hInst;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(,)HWND hwnd;MSG Msg;HACCEL hAccel;WNDCLASS wndclass;char lpsz
38、MenuName=Menu;char lpszClassName=模态对话框;char lpszTitle=模态对话框样例;wndclass.style=0;wndclass.lpszClassName=lpszClassName;if(!RegisterClass(,LRESULT CALLBACK WndProc(,)switch(message)case WM_COMMAND:switch(LOWORD(wParam)case IDM_NEW:break;case IDM_OPEN:MessageBox(hwnd,文件已经打开!,文件打开,MB_OK);break;case IDM_SA
39、VE:MessageBox(hwnd,文件保存成功!,文件保存,MB_OK);break;case IDM_SAVEAS:break;case IDM_CLOSE:break;case IDM_EXIT:SendMessage(hwnd,WM_DESTROY,0,0);break;case IDM_CUT:break;case IDM_COPY:break;case IDM_PASTE:break;case IDM_DELETE:break;case IDM_ABOUT:DialogBox(hInst,About,hwnd,(DLGPROC)DlgProc);break;break;case
40、WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd,message,wParam,lParam);return 0;,创建对话框,/对话框窗口处理函数BOOL CALLBACK DlgProc(,)switch(message)/初始化对话框 case WM_INITDIALOG:return 1;/处理对话框消息 case WM_COMMAND:switch(LOWORD(wParam)case IDOK:/关闭对话框 EndDialog(hdlg,0);return 1;break;case WM_CL
41、OSE:EndDialog(hdlg,0);return 1;return 0;,本例的资源程序代码如下:#include#include 7_3.h Menu MENU DISCARDABLE POPUP 文件(&F)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
42、MENUITEM 退出(&X),IDM_EXIT POPUP 编辑(&E)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 POPUP 帮助(&H)MENUITEM 关于(&A).,IDM_ABOUT,Menu ACCELERATORS N,IDM_NEW O,IDM_OPEN S,IDM_SAVE X,IDM_CUT C,IDM_COPY V,IDM_PASTE VK_DELETE,
43、IDM_DELETE,VIRTKEY About DIALOG 10,10,100,50 STYLE WS_POPUP|WS_CAPTION|WS_SYSMENU CAPTION 关于 FONT 18,楷体/定义对话框中的文本字体类型及大小 CTEXT Windows模态对话框,-1,13,10,80,10 DEFPUSHBUTTON 确定,IDOK,35,30,30,12,1 定义对话框样式 非模态对话框的定义一般形式如下:STYLE WS_POPUP|WS_CAPTION|WS_VISIBLE 非模态对话框允许与应用程序的其他窗口之间进行切换,因此标识该对话框内容的标题一般不可省略。,非模
44、态对话框编程方法,与模态对话框的编程较类似,但略有差别,2 创建对话框函数 HWND CreateDialog(HINSTANCE hInstance,/当前应用程序实例句柄 LPCTSTR lpszDialogName,/对话框名 HWND hwndParent,/拥有该对话框的窗口句柄 WNDPROC lpDialogFunc/对话框处理函数地址),无此项则无法在屏幕上显示,7.3.3 非模态对话框的编程方法,3 消息循环部分的处理 由于非模态对话框允许应用程序向其他窗口发送消息,因此,消息循环中必须具备截获发往非模态对话框的消息的能力,并送到相应的对话框处理函数进行处理。其消息循环过程的
45、一般形式为:while(GetMessage(,判断是否为发往非模态对话框的消息,若是,则将消息发送到WndProc进行处理,4 关闭对话框的函数 非模态对话框调用函数DestroyWindow关闭对话框:DOOL DestroyWindow(HWND hdlg),【例7-4】本例中,在“关于”窗口不关闭的前提下,仍可以对“文件”下拉菜单进行操作,如选“文件”下拉菜单中的“创建”选项,即可弹出“创建”窗口。,7.3.4 非模态对话框应用实例,#include#include 7-4.hHWND hdlg;/对话框句柄HINSTANCE hInst;LRESULT CALLBACK WndPro
46、c(HWND,UINT,WPARAM,LPARAM);BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)HWND hwnd;MSG Msg;HACCEL hAccel;WNDCLASS wndclass;char lpszMenuName=Menu;char lpszClassName=非模态对话框;char lpszTitle=非模态对话框演示程序;wndclass.st
47、yle=0;wndclass.lpszClassName=lpszClassName;if(!RegisterClass(,LRESULT CALLBACK WndProc(,)switch(message)case WM_COMMAND:switch(LOWORD(wParam)case IDM_NEW:MessageBox(hwnd,文件创建成功!,文件创建,MB_OK);break;case IDM_OPEN:MessageBox(hwnd,文件打开成功!,文件打开,MB_OK);break;case IDM_SAVE:MessageBox(hwnd,文件保存成功!,文件保存,MB_OK
48、);break;case IDM_SAVEAS:break;case IDM_CLOSE:break;case IDM_EXIT:SendMessage(hwnd,WM_DESTROY,0,0);break;case IDM_ABOUT:/调用函数CreateDialog创建非模态对话框 hdlg=CreateDialog(hInst,About,hwnd,(DLGPROC)DlgProc);break;break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd,message,wParam,
49、lParam);return 0;,/对话框窗口处理函数BOOL CALLBACK DlgProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam)switch(message)/初始化消息框 case WM_INITDIALOG:return 1;/处理消息框消息 case WM_COMMAND:switch(LOWORD(wParam)case IDOK:/关闭消息框 DestroyWindow(hdlg);return 1;break;case WM_CLOSE:DestroyWindow(hdlg);return 1;return
50、0;,【例7-5】编写一个窗口应用程序,其中有一个VC菜单项,该菜单下面有“显示”、“隐藏”、“退出”选项,当选择“显示”对话框时,窗口中显示一个对话框,在对话框中显示“我们一起来学习VC”,如下图所示。当选择“隐藏”选项时,对话框消失,选择“退出”选项时,退出应用程序的运行。,1.#include 2.#include 6_6.h3.Menu MENU DISCARDABLE/定义菜单条4.5.POPUP 文件(&F)/定义文件弹出菜单6.MENUITEM 显示,IDM_SHOW/定义显示菜单7.MENUITEM 隐藏,IDM_HIDE/定义隐藏菜单8.MENUITEM SEPARATOR/