《第7章_资源在Windows编程中的应用.ppt》由会员分享,可在线阅读,更多相关《第7章_资源在Windows编程中的应用.ppt(53页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第7章章资源在资源在Windows编程中编程中的应用的应用加速键加速键对话框对话框位图位图资源光标光标菜单菜单工具条工具条字符串字符串17.1菜单和加速键资源及其应用 菜单由以下组成部分:菜单由以下组成部分:(1)窗口主菜单条窗口主菜单条(2)下拉式菜单框下拉式菜单框(3)菜单项热键标识菜单项热键标识(4)菜单项加速键标识菜单项加速键标识(5)菜单项分隔线菜单项分隔线27.1.1菜单的创建过程菜单的创建过程(1)(1)定义菜单定义菜单菜单在资源描述文件中的定义形式为:菜单在资源描述文件中的定义形式为:menuID MENU,menuID MENU,载入特性载入特性选项选项菜单项列表菜单项列表
2、 字符串,或字符串,或165535之之间的整数间的整数选选 项项说说 明明DISCARDABLE DISCARDABLE 当不再需要菜单时可丢弃当不再需要菜单时可丢弃FIXEDFIXED 将菜单保存在内存中的固定位置将菜单保存在内存中的固定位置LOADONCALLLOADONCALL需要时加载菜单需要时加载菜单MOVEABLEMOVEABLE菜单在内存中可移动菜单在内存中可移动PRELOADPRELOAD立即加载菜单立即加载菜单POPUP语句语句MENUITEM语句语句3POPUP语句定义弹出式菜单,其形式为:语句定义弹出式菜单,其形式为:POPUP POPUP 菜单项名菜单项名,选项,选项;
3、在菜单项名中加入符号在菜单项名中加入符号“&”,以定义热键,以定义热键定义弹出式菜单项定义弹出式菜单项“编辑编辑”的形式如下:的形式如下:POPUP“POPUP“编辑(编辑(&E E)”;选选 项项说说 明明MENUBARBREAKMENUBARBREAK菜单项纵向分隔标志菜单项纵向分隔标志CHECKEDCHECKED显示选中标志显示选中标志INACTIVEINACTIVE禁止一个菜单项禁止一个菜单项GRAYEDGRAYED禁止并变灰显示禁止并变灰显示4MENUITEM用于定义菜单项,其形式为:用于定义菜单项,其形式为:MENUITEM MENUITEM 菜菜单单项项名名菜菜单单项项标标识识(
4、IDID),选项选项 ID为为菜菜单单项项标标识识,在在WM_COMMAND消消息息中中字字参参数数wParam中中包包含含选选中中菜菜单单项项的的标标识识。每每个个菜菜单单项项的的标标识识必必须须唯唯一一,标标识识值值常常在在头文件中定义。头文件中定义。如:创建菜单中的水平分隔符:如:创建菜单中的水平分隔符:MENUITEMSEPARATOR5该菜单在资源描述文件中的定义如下:该菜单在资源描述文件中的定义如下:#include#includeMenu.h菜单定义菜单定义My_menuMENUMOVEABLEPOPUP POPUP 文件(文件(&F F)MENUITEM MENUITEM 新建
5、(新建(&N N),IDM_NEWIDM_NEW MENUITEM MENUITEM 打开(打开(&O O),IDM_OPENIDM_OPEN MENUITEM MENUITEM 关闭(关闭(&C C),IDM_CLOSEIDM_CLOSE MENUITEM MENUITEM 保存(保存(&S S),IDM_SAVEIDM_SAVE MENUITEM MENUITEM 另存为(另存为(&A A),IDM_SAVEASIDM_SAVEAS MENUITEM MENUITEM SEPARATOR SEPARATOR MENUITEMMENUITEM“退出(退出(&X X)”,IDM_EXITIDM
6、_EXIT 6menu.h menu.h 文文件件中中定定义义了了菜菜单单项项标标识识所所对对应应的的数值:数值:#define IDM_NEW define IDM_NEW 1010#define IDM_OPEN#define IDM_OPEN 1111#define IDM_CLOSE#define IDM_CLOSE 1212#define IDM_SAVE#define IDM_SAVE 1313#define IDM_SAVEAS#define IDM_SAVEAS 1414#define IDM_EXIT#define IDM_EXIT 15157(2)加载菜单资源加载菜单资源在
7、窗口类中加载菜单在窗口类中加载菜单在创建窗口时加载菜单在创建窗口时加载菜单动态加载菜单动态加载菜单WNDCLASSwndclass;wndclass.lpszMenuName=lpszMenuName;HWNDhwnd;HMENUhmenu;hmenu=LoadMenu(hlnstance,My_menu);hwnd=CreateWindow(,hmenu,););hmenu2=LoadMenu(hlnstance,Menu2);SetMenu(hwnd,hmenu2);87.1.2操作菜单项 1禁止或激活菜单项禁止或激活菜单项BOOL EnableMenuItemBOOL EnableMen
8、uItem(HMENU hmenu,(HMENU hmenu,UlNT wIDEnableItem,/UlNT wIDEnableItem,/被禁止或激活的菜单项标识被禁止或激活的菜单项标识 UINT dwEnableUINT dwEnable)据据dwEnable的取值,可为的取值,可为菜单项的菜单项的ID值,也为该菜值,也为该菜单项在菜单中位置单项在菜单中位置标标识识说说明明MF_BYCOMMAND以以ID值标识菜单项值标识菜单项MF_ENABLED激活菜单项激活菜单项MF_BYPOSITION 表明以位置标识菜单项表明以位置标识菜单项MF_GRAYED禁止菜单项并使其变灰显示禁止菜单项并
9、使其变灰显示MF_DISABLED禁止菜单项禁止菜单项92.2.设置或取消选中标志设置或取消选中标志DWORD CheckMenuItemDWORD CheckMenuItem(HMENU HMENU hmenuhmenu,UINT wIDCheckItem,UINT wIDCheckItem,/菜单项标识菜单项标识UINT dwCheckUINT dwCheck/操作标识操作标识)标标识识说说明明MF_CHECKED添加选中标志添加选中标志MF_UNCHECKED 删除选中标志删除选中标志103.3.增加菜单项增加菜单项(1)(1)在菜单的尾部增加菜单项在菜单的尾部增加菜单项BOOL App
10、endMenuBOOL AppendMenu(HMENU hmenu,(HMENU hmenu,UINT dwFlags,UINT dwFlags,/新加入的菜单项类型标识新加入的菜单项类型标识 UINT dwIDNewItem,UINT dwIDNewItem,/新加入菜单项的新加入菜单项的IDID LPCTSTR lpNewItem LPCTSTR lpNewItem/新加入的菜单项内容新加入的菜单项内容)例如在例如在“文件文件”菜单的末尾增加一项菜单的末尾增加一项“关于关于”:AppendMenu(hmenu,MF_ENABLED,IDM_ABOUT,“AppendMenu(hmenu,
11、MF_ENABLED,IDM_ABOUT,“关于关于(&(&A)“)A)“);11(2)(2)在菜单中插入菜单项在菜单中插入菜单项调用函数调用函数InsertMenu在菜单中插入新的菜单在菜单中插入新的菜单BOOL InsertMenuBOOL InsertMenu(HMENU hmenu,(HMENU hmenu,/菜单句柄菜单句柄UINT wPosition,UINT wPosition,/指定新菜单项插入的位置指定新菜单项插入的位置UINT dwFlag,UINT dwFlag,/新加入的菜单项的信息新加入的菜单项的信息UINT dwIDNweItem,UINT dwIDNweItem,
12、/新加入的菜单项的标识新加入的菜单项的标识LPCTSTR lpNewItemLPCTSTR lpNewItem/新插入的菜单项的内容新插入的菜单项的内容)例例如如,在在“文文件件”菜菜单单的的“退退出出”项项之之前前加加入入“打打印印”菜单项;菜单项;InsertMenu(hmenu,IDM_EXIT,InsertMenu(hmenu,IDM_EXIT,MF_BYCOMMAND|MF_ENABLED,MF_BYCOMMAND|MF_ENABLED,IDM_PRINT,IDM_PRINT,打印(打印(&P P)););124.4.删除菜单项删除菜单项调用函数调用函数DeleteMenu Dele
13、teMenu 删除菜单项:删除菜单项:BOOL DeleteMenuBOOL DeleteMenu(HMENU hmenu,HMENU hmenu,UINT wPosition,/UINT wPosition,/要删除的菜单项的位置要删除的菜单项的位置UINT dwFlagUINT dwFlag /对对wPositionwPosition的解释的解释 )例如,删除例如,删除“文件文件”菜单中的菜单中的“另存为另存为”菜单项:菜单项:DeleteMenu(hmenu,IDM_SAVEAS,MF_BYCOMMAND)DeleteMenu(hmenu,IDM_SAVEAS,MF_BYCOMMAND)
14、135.5.修改菜单项修改菜单项调用函数调用函数ModifyMenu修改菜单中的某个项;修改菜单中的某个项;BOOL ModifyMenu BOOL ModifyMenu(HMENU hmenu,(HMENU hmenu,UINT wPosition,UINT wPosition,/指定需修改的菜单项位置指定需修改的菜单项位置 UINT dwFlag,UINT dwFlag,UINT dwIDNweItem,UINT dwIDNweItem,/修改后菜单项的标识修改后菜单项的标识 LPCTSTR lpNewItemLPCTSTR lpNewItem/修改后的菜单项名修改后的菜单项名)例例如如:
15、修修改改“文文件件”菜菜单单中中“打打开开”项项为为“加加载载”项:项:ModifyMenu(hmenu,IDM_OPEN,MF_BYCOMMANModifyMenu(hmenu,IDM_OPEN,MF_BYCOMMAND,D,IDM_LOAD,IDM_LOAD,加载加载(&(&L)L);147.1.3 动态地创建菜单 动动态态地地创创建建菜菜单单可可以以使使系系统统资资源源更更加加节节省省,在应用程序中动态创建菜单分两个步骤:在应用程序中动态创建菜单分两个步骤:1调用函数调用函数CreateMenu创建空的弹出式菜单创建空的弹出式菜单HMENUCreateMenu(void)2调调用用函函数
16、数AppendMenu或或InsertMenu在在该该菜单中加入菜单项。菜单中加入菜单项。157.1.4加速键资源加速键资源加速键资源是常伴随菜单使用的一种非常有用加速键资源是常伴随菜单使用的一种非常有用的资源的资源(1)在资源描述文件中定义加速键资源在资源描述文件中定义加速键资源加速键名加速键名ACCELERATORS加速键标识(加速键标识(ID),),类型类型NOINVERT/使用加速键时,菜单项不高亮显示使用加速键时,菜单项不高亮显示ALTSHIFTCONTROL/组合键的组合方式组合键的组合方式16常用的加速键有两种形式:常用的加速键有两种形式:“char”,id例例如如:“文文件件”
17、菜菜单单中中“保保存存”项项的的加加速速键键可可定定义义为:为:“S”,IDM_SAVEnCode,idVIRTKEY使用虚拟键作为加速键。使用虚拟键作为加速键。例例如如将将F1键键定定义义为为“帮帮助助”菜菜单单项项的的加加速速键键,其其ID标识为标识为IDM_HELP,其形式如下:其形式如下:VK_F1,IDM_HELP,VIRTKEY172加载加速键资源加载加速键资源调用函数调用函数LoadAccelerators加载加速键资源:加载加速键资源:HACCEL hAccelHACCEL hAccel;hAccel=LoadAcceleratorshAccel=LoadAccelerator
18、s(hInstance,hInstance,/当前程序实例句柄当前程序实例句柄 lpAcceINamelpAcceIName/lpAccelName/lpAccelName为加速键表名为加速键表名);183翻译加速键翻译加速键翻译操作经常在应用程序的消息循环中进行翻译操作经常在应用程序的消息循环中进行:while(GetMessage(&Msg,NULL,0,0)if(!TranslateAccelerator(hwnd,hAccel,&Mag)TranslateMessage(&Msg);DispatchMessage(&Msg);函函数数TranslateAcceleratorTransl
19、ateAccelerator是是翻翻译译操操作作的的核核心心。其其作作用用是是对对照照加加速速键键表表,将将相相关关的的按按键键消消息息WM_KEYDOWNWM_KEYDOWN和和WM_KEYUP WM_KEYUP 翻翻译译成成WM_COMMAND WM_COMMAND 或或WM_SYSCOMMANDWM_SYSCOMMAND消消息息。其其特特点点是是将将翻翻译译后后的的消消息息直直接接发发往往窗窗口口,不不在在消息队列中等待。消息队列中等待。197.1.5 创建菜单资源实例【例【例7-1】创建一个窗口菜单的构架,单击】创建一个窗口菜单的构架,单击“创创建统计计算菜单项建统计计算菜单项”动态地
20、创建动态地创建“统计计算统计计算”菜单,之后,菜单,之后,“创建统计计算菜单项创建统计计算菜单项”变变成不可操作,而原先不可操作的成不可操作,而原先不可操作的“删除统计删除统计计算菜单计算菜单项项”变成可操作,执行变成可操作,执行“删删除统计计算菜单项除统计计算菜单项”菜单菜单命令删除命令删除“统计计算统计计算”菜菜单。单。20#include windows.h include windows.h#include 7_1.h#include 7_1.hHMENU hmenu,haddmenu;/HMENU hmenu,haddmenu;/定义菜单句柄定义菜单句柄LRESULT CALLBAC
21、K WndProc(HWND,UINT,WPARAM,LPARAM);LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(int WINAPI WinMain()ShowWindow(hwnd,nCmdShow);ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);UpdateWindow(hwnd);hAccel=LoadAccelerators(hInstance,lpszMenuName);hAccel=LoadAccelerators(hInstance,lpsz
22、MenuName);while(GetMessage(&Msg,NULL,0,0)while(GetMessage(&Msg,NULL,0,0)/在消息循环中截获加速键消息在消息循环中截获加速键消息if(!TranslateAccelerator(hwnd,hAccel,&Msg)if(!TranslateAccelerator(hwnd,hAccel,&Msg)TranslateMessage(&Msg);TranslateMessage(&Msg);DispatchMessage(&Msg);DispatchMessage(&Msg);return Msg.wParam;return Ms
23、g.wParam;21LRESULT CALLBACK WndProc()switch(message)case WM_COMMAND:switch(LOWORD(wParam)case IDM_ADDMENU:/在主菜单中添加弹出式菜单在主菜单中添加弹出式菜单 hmenu=GetMenu(hwnd);/获取主菜单句柄获取主菜单句柄 haddmenu=CreateMenu();/动态创建菜单动态创建菜单 /在创建的菜单中增加菜单项在创建的菜单中增加菜单项 AppendMenu(haddmenu,MF_ENABLED,IDM_qiuhe,求和求和);AppendMenu(haddmenu,MF_
24、ENABLED,IDM_fangcha,“方差方差”);AppendMenu(haddmenu,MF_ENABLED,IDM_pinjunzhi,平均值平均值);AppendMenu(haddmenu,MF_ENABLED,IDM_junfanggen,均方根均方根);/将创建的弹出式菜单插入主菜单中将创建的弹出式菜单插入主菜单中 InsertMenu(hmenu,2,MF_POPUP|MF_BYPOSITION,(UINT)haddmenu,统计计算统计计算(&C);/相应改变菜单中有关绘图统计计算菜单项的属性相应改变菜单中有关绘图统计计算菜单项的属性 EnableMenuItem(hmen
25、u,IDM_ADDMENU,MF_GRAYED);EnableMenuItem(hmenu,IDM_DELMENU,MF_ENABLED);DrawMenuBar(hwnd);/重新显示窗口菜单重新显示窗口菜单 break;22 case IDM_DELMENU:DeleteMenu(hmenu,2,MF_BYPOSITION);/删除统计计算菜单项删除统计计算菜单项 /相应改变相应改变“文件文件”菜单中有关统计计算菜单项的属性菜单中有关统计计算菜单项的属性 EnableMenuItem(hmenu,IDM_ADDMENU,MF_ENABLED);EnableMenuItem(hmenu,ID
26、M_DELMENU,MF_GRAYED);DrawMenuBar(hwnd);/重新显示窗口菜单重新显示窗口菜单 break;case IDM_EXIT:SendMessage(hwnd,WM_DESTROY,0,0);break;break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd,message,wParam,lParam);return 0;23本例程的头文件如下:本例程的头文件如下:#define IDM_ADDMENUdefine IDM_ADDMENU 15 15#defin
27、e IDM_DELMENU#define IDM_DELMENU 16 16#define IDM_EXIT 17#define IDM_EXIT 17#define IDM_HELP 22#define IDM_HELP 22#define IDM_qiuhe 23#define IDM_qiuhe 23#define IDM_fangcha 24#define IDM_fangcha 24#define IDM_pinjunzhi 25#define IDM_pinjunzhi 25#define IDM_junfanggen 26#define IDM_junfanggen 2624本例
28、程用到的资源文件源代码如下:本例程用到的资源文件源代码如下:#include c:prog_book7_17_1.h#include windows.hMENU MENU DISCARDABLE BEGIN POPUP 文件文件(&F)BEGIN MENUITEM 创建统计计算菜单项创建统计计算菜单项(&P)t Ctrl+P,IDM_ADDMENU MENUITEM 删除统计计算菜单项删除统计计算菜单项(&D)t Ctrl+D,IDM_DELMENU,GRAYED MENUITEM SEPARATOR MENUITEM 退出退出(&X),IDM_EXIT END MENUITEM 帮助帮助(&
29、H),IDM_HELPENDMENU ACCELERATORS MOVEABLE PURE BEGIN P,IDM_ADDMENU,ASCII D,IDM_DELMENU,ASCII END257.2位图资源及其应用位图资源及其应用267.2.1位图概念位图概念位位图图是是一一种种数数字字化化的的图图形形表表示示形形式式,位位图图中中的的每每个个像像素素点点由由位位图图文文件件中中的的一一位位或或多多位位数数据据表表示示。整整个个位位图图的信息被细化为每个像素点的属性值。的信息被细化为每个像素点的属性值。位位图图数数据据量量一一般般较较大大,为为了了提提高高显显示示刷刷新新速速度度,位位图图操
30、操作作须须在在内内存存中中进行。进行。277.2.2位图的操作过程位图的操作过程位图操作过程:位图操作过程:定义位图句柄:定义位图句柄:HBITMAP hBm;HBITMAP hBm;加载加载或或创建创建 hBm=LoadBitmap(hInstance,lpszName)hBm=CreateCompatibleBitmap(hdc,nWidth,nHeight)选入内存设备环境选入内存设备环境 SelectObject(hdcmem,hBm);输出输出 BOOL BitBlt (HDC hdcDest,/目的设备环境句柄目的设备环境句柄 int XDest,int YDest,int nWi
31、dth,int nHeitght,/位图基点及高宽位图基点及高宽 HDC hdcSrc,int nXSrc,int nYsrc,/源设备环境句柄及位图基点源设备环境句柄及位图基点 DWORD dwRop /标识位图显示方式标识位图显示方式)28在在输输出出位位图图之之前前,经经常常需需调调用用函函数数GetObjectGetObject获取位图的尺寸:获取位图的尺寸:GetObject(hBitmap,/为位图句柄为位图句柄 sizeof(BITMAP),/BITMAP结构的大小结构的大小(LPVOID)&bm/BITMAP结构的地址结构的地址)应应用用程程序序调调用用函函数数GetObjec
32、t后后,将将指指定定位位图图的的信息写入信息写入BITMAP结构中(结构见教材)结构中(结构见教材)297.2.3位图操作实例位图操作实例【例【例7-2】本例调用一幅坦克的图片,并在用户窗口区】本例调用一幅坦克的图片,并在用户窗口区上显示上显示 LRESULT CALLBACK WndProc()PAINTSTRUCT ps;switch(message)case WM_CREATE:hdc=GetDC(hwnd);/获取设备环境句柄获取设备环境句柄 hdcmem=CreateCompatibleDC(hdc);/内存设备环境句柄内存设备环境句柄ReleaseDC(hwnd,hdc);/释放设
33、备环境句柄释放设备环境句柄 case WM_PAINT:hdc=BeginPaint(hwnd,&ps);SelectObject(hdcmem,hBm);/将位图选入内存设备环境将位图选入内存设备环境30/将内存设备环境中的位图拷贝到设备环境中将内存设备环境中的位图拷贝到设备环境中 BitBlt(hdc,180,80,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);EndPaint(hwnd,&ps);/释放设备环境句柄释放设备环境句柄 break;case WM_DESTROY:DeleteObject(hBm);/释放位图释放位图 PostQuitM
34、essage(0);break;default:return DefWindowProc(hwnd,message,wParam,lParam);return 0;本例的资源文件如下:本例的资源文件如下:pic7BITMAPpic7_2.bmp/定义位图资源定义位图资源 317.3对话框资源及其应用对话框资源及其应用对话框是一个弹出式窗口,它一般用于对话框是一个弹出式窗口,它一般用于用户输入或与用户进行交互活动的场合用户输入或与用户进行交互活动的场合对对话话框框模式模式非模式非模式允许允许用户在该对话框与应用程用户在该对话框与应用程序其他窗口之间的切换,非模序其他窗口之间的切换,非模式对话框从
35、式对话框从WinMainWinMain函数的消息函数的消息循环中接收输入循环中接收输入不允许不允许用户在关闭对话框用户在关闭对话框之前切换到应用程序的其之前切换到应用程序的其他窗口他窗口327.3.1模式对话框的编程方法模式对话框的编程方法1定义对话框资源定义对话框资源一般的形式为:一般的形式为:对话框名对话框名 DIALOG 载入特性选项载入特性选项 X,Y,Width,Height设置选项设置选项对话框的控件定义对话框的控件定义 样式选项决定了对话框的外样式选项决定了对话框的外型特点,样式见表型特点,样式见表7-67-6CHECKBOX、ICON、COMBOBOXLISTBOX、DEFPU
36、SHBUTTON、PUSHBUTTON、RADIOBUTTON、GROUPBOX、EDIT、SCROLLBAR静态文本控件静态文本控件332调用函数调用函数DialogBox显示对话框显示对话框 调用调用DialogBox函数在窗口中显示对话框:函数在窗口中显示对话框:int DialogBox (HINSTANCE hInstance,LPCTSTR lpszDialogName,/对话框资源的名称对话框资源的名称 HWND hwndParent,/拥有该对话框的窗口句柄拥有该对话框的窗口句柄 DLGPROC lpDialogFunc /对话框处理函数的地址对话框处理函数的地址 )343构造
37、对话框消息处理函数构造对话框消息处理函数对话框消息处理函数的一般形式为:对话框消息处理函数的一般形式为:BOOL CALLBACK DlgProc(HWND hDlg,)switch(message)case WM_INITDIALOG:return 1;case WM_COMMAND switch(LOWORD(wParam)case break;break;return 0;35在在对对话话框框消消息息处处理理函函数数中中主主要要常常处处理理以以下下两两类消息:类消息:(a)WM_ INITDIALOG 消息消息 对对话话框框在在响响应应消消息息WM_ INITDIALOG 消消息息时时完
38、完成成其其初初始始化化操操作作,在在功功能能上上与与主主窗窗口口函数的函数的WM_COMMAND消息相似。消息相似。(b)WM_COMMAND消息消息 对话框在响应消息对话框在响应消息WM_COMMAND时,时,通过查看消息字参数(通过查看消息字参数(wParam)中的低位中的低位字节,与控件标识(字节,与控件标识(ID)相比较,以确定相比较,以确定产生交互请求的控件并据此转入相应的处产生交互请求的控件并据此转入相应的处理过程进行处理。理过程进行处理。364关闭对话框关闭对话框 调用函数调用函数EndDialog可以关闭对话框:可以关闭对话框:BOOL EndDialog(HWND hdlg,
39、INT_PTR nResult)Windows消息框是模态对话框的一种特殊形式,应消息框是模态对话框的一种特殊形式,应用程序可通过调用函数用程序可通过调用函数MessageBox生成一些简单但生成一些简单但又常用的消息框:又常用的消息框:int MessageBox(HWND hwnd,/拥有消息框的窗口拥有消息框的窗口 LPCTSTR lpszText,/消息框中显示的字符串消息框中显示的字符串 LPCTSTR lpszCaption,/作为标题的字符串作为标题的字符串 DWORD dwType/指定消息框的内容指定消息框的内容)37dwType常用标识及其说明常用标识及其说明MB_CANC
40、ELTRYCONTINUE含有含有Cancel、Try Again和和Continue按钮的消息框按钮的消息框MB_ICONEXCLAMATION,MB_ICONWARNING含有惊叹号图标的消息框含有惊叹号图标的消息框MB_ICONQUESTION含有问号图标的消息框含有问号图标的消息框MB_ICONSTOP,MB_ICONERROR,MB_ICONHAND含有停止图标的消息框含有停止图标的消息框MB_OK含有一个含有一个OK按钮的消息框按钮的消息框MB_OKCANCEL含有含有OK和和CANCEL按钮的消息框按钮的消息框MB_RETRYCANCEL 含有含有RETRY和和CANCEL按钮的
41、消息框按钮的消息框MB_YESNO含有含有YES和和NO按钮的消息框按钮的消息框MB_YESNOCANCEL 含含YES、NO和和CANCEL按钮的消息框按钮的消息框387.3.2模态对话框应用实例模态对话框应用实例39LRESULT CALLBACK WndProc(,)switch(message)case WM_COMMAND:switch(LOWORD(wParam)case IDM_OPEN:MessageBox(hwnd,文件已经打开!文件已经打开!,文件打开文件打开,MB_OK);break;case IDM_SAVE:MessageBox(hwnd,文件保存成功!文件保存成功!
42、,文件保存文件保存,MB_OK);break;case IDM_EXIT:SendMessage(hwnd,WM_DESTROY,0,0);break;case IDM_ABOUT:/创建对话框创建对话框 DialogBox(hInst,About,hwnd,(DLGPROC)DlgProc);break;break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd,message,wParam,lParam);return 0;40BOOL CALLBACK DlgProc(HWND hdlg
43、,)switch(message)case WM_INITDIALOG:/初始化对话框初始化对话框 return 1;case WM_COMMAND:/处理对话框消息处理对话框消息switch(LOWORD(wParam)case IDOK:/关闭对话框关闭对话框 EndDialog(hdlg,0);return 1;break;case WM_CLOSE:EndDialog(hdlg,0);return 1;return 0;41本例的资源程序代码如下:本例的资源程序代码如下:#include#include 7_3.h Menu MENU DISCARDABLE POPUP 文件文件(&F
44、)MENUITEM 打开打开(&O)t Ctrl+O,IDM_OPEN MENUITEM SEPARATOR MENUITEM 保存保存(&S)t Ctrl+S,IDM_SAVE MENUITEM SEPARATOR MENUITEM 退出退出(&X),IDM_EXIT POPUP 帮助帮助(&H)MENUITEM 关于关于(&A).,IDM_ABOUT 42 Menu ACCELERATORS O,IDM_OPEN S,IDM_SAVE About DIALOG 10,10,100,50 STYLE WS_POPUP|WS_CAPTION|WS_SYSMENU CAPTION 关于关于 FO
45、NT 18,楷楷体体 /对对话话框框中中的的文文本本字字体体类类型型及及大大小小 CTEXT Windows模态对话框模态对话框,-1,13,10,80,10 DEFPUSHBUTTON 确定确定,IDOK,35,30,30,12 437.3.3非模态对话框的编程方法非模态对话框的编程方法非非模模态态对对话话框框在在对对话话框框的的定定义义、对对话话框框的的创创建建及及消消息息处理上与模态对话框略有差别,方法如下处理上与模态对话框略有差别,方法如下:1 1 定义对话框样式定义对话框样式 非模态对话框的定义一般形式如下:非模态对话框的定义一般形式如下:STYLE WS_POPUP|WS_CAPT
46、ION|STYLE WS_POPUP|WS_CAPTION|WS_VISIBLEWS_VISIBLE 样式中应包含样式中应包含WS_VISIBLEWS_VISIBLE,否则无法在屏幕上显示否则无法在屏幕上显示2 2 创建对话框函数创建对话框函数 非模态对话框的创建由函数非模态对话框的创建由函数CreateDialogCreateDialog完成完成:HWND CreateDialog(HINSTANCE hInstance,/当前应用程序实例句柄当前应用程序实例句柄 LPCTSTR lpszDialogName,/对话框名对话框名 HWND hwndParent,/拥有该对话框的窗口句柄拥有该
47、对话框的窗口句柄 DLGPROC lpDialogFunc )/对话框处理函数地址对话框处理函数地址443消息循环部分的处理消息循环部分的处理由由于于非非模模态态对对话话框框并并不不禁禁止止应应用用程程序序向向其其他他窗窗口口发发送送消消息息,因因此此,在在WinMain函函数数的的消消息息循循环环中中必必须须包包含含截截获获发发往往非非模模态态对对话话框框的的消消息息,并并将将其其发发往往相相应应的的对对话话框框处处理理函函数数进进行行处处理理。其其消消息息循循环环过过程程的的一般形式为:一般形式为:while(GetMessage(&Msg,NULL,0,0)if(!IsDialogMes
48、sage(hdlg,&Msg)TranslateMessage(&Msg);DispatchMessage(&Msg);457.3.4非模态对话框应用实例非模态对话框应用实例【例【例7-4】在在“关于关于”窗口不关闭的前提下,窗口不关闭的前提下,仍可以对仍可以对“文件文件”下拉菜单进行操作,如选下拉菜单进行操作,如选“文件文件”菜单中的菜单中的“创建创建”选项,即可弹出选项,即可弹出“创建创建”窗口窗口 46LRESULT CALLBACK WndProc(,)switch(message)case WM_COMMAND:switch(LOWORD(wParam)case IDM_NEW:Me
49、ssageBox(hwnd,文件创建成功!文件创建成功!,文件创建文件创建,MB_OK);break;case IDM_OPEN:MessageBox(hwnd,文文 件件 打打 开开 成成 功功!,文文 件件 打打 开开,MB_OK);break;case IDM_SAVE:MessageBox(hwnd,文文 件件 保保 存存 成成 功功!,文文 件件 保保 存存,MB_OK);break;case IDM_EXIT:SendMessage(hwnd,WM_DESTROY,0,0);break;case IDM_ABOUT:hdlg=CreateDialog(hInst,About,hwn
50、d,(DLGPROC)DlgProc);break;47BOOL CALLBACK DlgProc(HWND hdlg,)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 0;本例题的资源文件与本例题的资源文件与上例类