第7章资源在Windows编程中的应用_第1页
第7章资源在Windows编程中的应用_第2页
第7章资源在Windows编程中的应用_第3页
第7章资源在Windows编程中的应用_第4页
第7章资源在Windows编程中的应用_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第7 7章章 资源在资源在windowswindows编程中的应用编程中的应用 在在windows应用程序中可以使用几种不同类型的资源应用程序中可以使用几种不同类型的资源 加速键加速键 位图位图 对话框对话框 和菜单等和菜单等 这些资源可以使用这些资源可以使用vcvc提供的资源编辑器来实现创建和编辑提供的资源编辑器来实现创建和编辑 资源的使用,方便了应用资源的使用,方便了应用 程序与用户之间的交互程序与用户之间的交互 菜单是菜单是windows 图形用户界面中图形用户界面中 窗口的重要组成窗口的重要组成 部分部分 菜单可使用户直观菜单可使用户直观 地了解并使用应用地了解并使用应用 程序所提供

2、的功能程序所提供的功能 加速键可使加速键可使 菜单的操作菜单的操作 更灵活快捷更灵活快捷 两种资源往往密不可分两种资源往往密不可分 窗口主菜单条窗口主菜单条 下拉式菜单框下拉式菜单框 菜单项热键标识菜单项热键标识 菜单项加速键标识菜单项加速键标识 菜单项分隔线菜单项分隔线 选中与否的标识选中与否的标识 7.1菜单与加速键资源菜单与加速键资源 创建菜单过程分为定义和加载两个步骤创建菜单过程分为定义和加载两个步骤 1. 定义菜单定义菜单 选选 项项说说 明明 discardable当当不不再再需需要要菜菜单单时时可可丢丢弃弃 fixed将将菜菜单单保保存存在在内内存存中中的的固固定定位位置置 lo

3、adoncall需需要要时时加加载载菜菜单单 moveable菜菜单单在在内内存存中中可可移移动动 preload立立即即加加载载菜菜单单 菜单项是菜单菜单项是菜单 的组成部分。的组成部分。 应用程序在资应用程序在资 源描述文件中源描述文件中 使用关键字使用关键字 popup和和 menuitem 定义菜单项定义菜单项 菜单名菜单名menu ,menu ,选项选项 菜单项列表菜单项列表 菜单在资源描菜单在资源描 述文件中定义述文件中定义 用以标识菜用以标识菜 单所具有的单所具有的 载入特性载入特性 菜单菜单 定义定义 结构结构 菜单名菜单名 menu关键字关键字 载载 入入 特特 性性 选选

4、项项 菜单项菜单项 7.1.1菜单的创建过程菜单的创建过程 popup语句定义弹出式菜单,其形式为:语句定义弹出式菜单,其形式为: popup“popup“菜单项名菜单项名” ,选项,选项 ; 在菜单项名中加入符号在菜单项名中加入符号“menuitem separator; 例例 在在“menu”的窗口中创建一个的窗口中创建一个“文件文件”菜单。该菜单含有菜单。该菜单含有“新建新建”、“打开打开” 、“关闭关闭”、“保存保存”、“另存为另存为”及及“退出退出”等菜单项。菜单项均使用热键;并等菜单项。菜单项均使用热键;并 且且“退出退出” 项与其他菜单项之间用分隔线分开。项与其他菜单项之间用分隔

5、线分开。 #include #include #include “menu.h”#include “menu.h” 菜单定义菜单定义 menu menu moveable menu menu moveable menumenu为窗口菜单的名称为窗口菜单的名称 popup“popup“文件文件(wndclass wndclass; wndclass.lpszmenuname=lpszmenunamewndclass.lpszmenuname=lpszmenuname; ; 1. 在窗口类在窗口类 中加载菜单中加载菜单 应用程序需先调用函数应用程序需先调用函数loadmemu加载菜单加载菜单 hm

6、enu loadmemu hmenu loadmemu ( ( hinstance,/hinstance,/当前程序的实例句柄当前程序的实例句柄 lpszmenunamelpszmenuname/窗口菜单名窗口菜单名 ) ); 如:如: hmenu=loadmenu(hlnstancehmenu=loadmenu(hlnstance,menu),menu); hwnd=createwindow( hwnd=createwindow( ,hmenuhmenu, , ,);,); 2. 在创建在创建 窗口时窗口时 加载菜单加载菜单 3. 动态加动态加 载菜单载菜单 应用程序获取菜单句柄后,可通过应

7、用程序获取菜单句柄后,可通过setmenu动态地加载菜单动态地加载菜单 boll setmenuboll setmenu ( ( / hwnd / hwnd为窗口句柄,为窗口句柄,hmenuhmenu为菜单句柄为菜单句柄 hwnd hwnd,hwnd hwnd, hmenu hmenu hmenu hmenu) ); 在应在应 用程用程 序中序中 加载加载 菜单菜单 有三有三 种方种方 法法 可在同一个应用可在同一个应用 程序中实现多种程序中实现多种 不同的菜单操作界面不同的菜单操作界面 菜单菜单 操作操作 禁止或激活菜单项禁止或激活菜单项(指定该菜单项的初始状态) 设置或取消选中标志设置或取

8、消选中标志(“” ) 增加、删除或修改菜单项等操作增加、删除或修改菜单项等操作 7.1.2菜单项的操作菜单项的操作 创建菜单时,可以调用函数创建菜单时,可以调用函数enablemenuitem改变其初始状态改变其初始状态 dword enablemenuitem( hmenu hmenu, ulnt widenableitem, /被禁止或激活的菜单项标识被禁止或激活的菜单项标识 uint dwenable) /dwenable为菜单项操作标识为菜单项操作标识 mf_bycommand以以id值标识菜单项值标识菜单项 mf_enabled激活菜单项激活菜单项 mf_byposition以位置标

9、识菜单项以位置标识菜单项 mf_grayed禁止菜单项并使其变灰显示禁止菜单项并使其变灰显示 mf_disabled禁止菜单项禁止菜单项 菜单项的菜单项的id值值/在菜单中位置在菜单中位置 例如,禁止弹出式菜单例如,禁止弹出式菜单“文件文件”中的中的“打开打开”项的形式如下:项的形式如下: enablemenuitem(hmenuenablemenuitem(hmenu,idm_open, mf_bycommand|mf_disabled),idm_open, mf_bycommand|mf_disabled); 1. 禁止或激活菜单项禁止或激活菜单项 (1) 在资源描述文件中设置菜单项的为在

10、资源描述文件中设置菜单项的为checked (2) 调用函数调用函数checkmenuitem设置或取消选中标志设置或取消选中标志 dword checkmenultemdword checkmenultem( ( hmenu hmenhmenu hmen, , uint widcheckitemuint widcheckitem,/,/设置或取消选中标志的菜单项标识设置或取消选中标志的菜单项标识 uint dwcheckuint dwcheck) ) / /操作标识操作标识 据据dwcheckdwcheck的取值,可为的取值,可为 该菜单项的该菜单项的idid值或为该值或为该 菜单项在菜单中

11、位置菜单项在菜单中位置 mf_bycommandmf_bycommand表明以表明以idid值标识菜单项值标识菜单项 mf_checkedmf_checked添加选中标志添加选中标志 mf_bypositionmf_byposition表明以位置标识菜单项表明以位置标识菜单项 mf_uncheckedmf_unchecked删除选中标志删除选中标志 2. 设置或取消选中设置或取消选中(“ ” )标志标志 两种形式:两种形式:尾部增加尾部增加 / 菜单中插入菜单中插入 (a)在菜单的尾部增加菜单项在菜单的尾部增加菜单项 可调用函数可调用函数appendmenu bool appendmenubo

12、ol appendmenu( ( hmenu hmenuhmenu hmenu, , /新菜单项的类型标识或其他信息新菜单项的类型标识或其他信息 uint dwflagsuint dwflags, , uint dwidnewitemuint dwidnewitem,/,/菜单项的标识菜单项的标识 菜单项内容菜单项内容, ,取决与取决与dwflagsdwflags参数参数 lpctstr lpnewitemlpctstr lpnewitem)/)/ 1.通常是插入项的通常是插入项的id值;值; 2.若加入的是弹出式菜单,则为此菜单句柄若加入的是弹出式菜单,则为此菜单句柄 (b)在菜单中插入菜单

13、项在菜单中插入菜单项 调用函数调用函数insertmenu bool lnsertmenubool lnsertmenu( ( hmenu hmenuhmenu hmenu, , uint wpositionuint wposition, /, /菜单项插入的位置菜单项插入的位置 /新菜单项的信息及对新菜单项的信息及对wpositionwposition的解释的解释 uint dwflaguint dwflag, , uint dwidnweltemuint dwidnweltem,/,/菜单项的菜单项的idid标识标识 /菜单项的内容菜单项的内容 lpctstr lpnewltemlpcts

14、tr lpnewltem) ) dwflag mf_bycommandmf_bycommand: wpositionwposition为插入位置的下一个菜单项的为插入位置的下一个菜单项的id值值 mf_bypositionmf_byposition: wpositionwposition为插入的位置号为插入的位置号 3. 增加菜单项增加菜单项 例如:例如: 在弹出式菜单在弹出式菜单“ 文件文件”的的“ 退出退出”项之前加入新的菜单项项之前加入新的菜单项“ 打印打印”的语句的语句 lnsertmenu (hmenulnsertmenu (hmenu, idm_exit, mf_bycommand

15、 |mf, idm_exit, mf_bycommand |mfenabledenabled, idm_printidm_print,“打印(打印( /uint dwflag); /对对wpositionwposition的解释的解释 例如,删除弹出式例如,删除弹出式“文件文件”菜单中的菜单中的“另存为另存为”项的形式如下:项的形式如下: deletemenu (hmenudeletemenu (hmenu, idm_saveas, mf_bycommand), idm_saveas, mf_bycommand) 若删除的菜若删除的菜 单项含有弹出式菜单单项含有弹出式菜单 则同时被删除。则同时

16、被删除。 4. 删除菜单项删除菜单项 调用函数调用函数modifymenu可可修改菜单中的某个项修改菜单中的某个项 bool modifymenubool modifymenu( ( hmenu hmenuhmenu hmenu, , uint wpositionuint wposition, ,/指定需修改的菜单项位置指定需修改的菜单项位置 uint dwflaguint dwflag, , uint dwidnweitemuint dwidnweitem, ,/一般为修改后菜单项的标识一般为修改后菜单项的标识 lpctstr lpnewitemlpctstr lpnewitem););/一

17、般为修改后的菜单项名一般为修改后的菜单项名 例如修改弹出式菜单例如修改弹出式菜单“文件文件”中中“打开打开”项为项为“加载加载”项的语句如下:项的语句如下: modifymenu(hmenumodifymenu(hmenu,idm_open,mf_bycommand,idm _load“,idm_open,mf_bycommand,idm _load“加载加载( /; /创建新的菜单句柄创建新的菜单句柄 定义菜单句柄 hpopumenu:createmenulhpopumenu:createmenul; ; /在弹出式菜单中增加菜单项在弹出式菜单中增加菜单项 appenmenu(hpopupm

18、enuappenmenu(hpopupmenu,mf_strwg,idm_copy,“,mf_strwg,idm_copy,“复制(复制( /; /定义菜单句柄定义菜单句柄 lresult callback wndproc(hwnd,uint,wparam,lparam);lresult callback wndproc(hwnd,uint,wparam,lparam); int winapi winmain(int winapi winmain() ) hwnd hwnd; msg msg; haccel haccel; wndclass wndclasshwnd hwnd; msg msg

19、; haccel haccel; wndclass wndclass; ; char lpszmenuname char lpszmenuname=menu;=menu; char lpszclassname = char lpszclassname = 菜单菜单; ; char lpsztitle= my_menu_example; char lpsztitle= my_menu_example; wndclass wndclass.style = 0; .style = 0; wndclass.lpszclassname wndclass.lpszclassname = lpszclass

20、name ; = lpszclassname ; if(!registerclass( return false; messagebeep(0); return false; hwnd = createwindow hwnd = createwindow( ( , , .);.); showwindow(hwnd,ncmdshow showwindow(hwnd,ncmdshow); ); updatewindow(hwndupdatewindow(hwnd); ); haccel=loadaccelerators(hinstance,lpszmenuname haccel=loadaccel

21、erators(hinstance,lpszmenuname);); while( getmessage( dispatchmessage( dispatchmessage(); return msg.wparamreturn msg.wparam; ; 加载加加载加 速键资速键资 源源 lresult callback wndproc(hwnd hwnd,uint message,lresult callback wndproc(hwnd hwnd,uint message, wparam wparam,lparam lparam) wparam wparam,lparam lparam)

22、switch(message)switch(message) case wm_command:case wm_command: / /处理菜单消息处理菜单消息 switch(loword(wparam)switch(loword(wparam) case idm_new:case idm_new: break; break; case idm_open: case idm_open:break;break; case idm_save:case idm_save:break;break; case idm_saveas:case idm_saveas:break;break; case idm

23、_close:case idm_close:break;break; case idm_addprintmenu:case idm_addprintmenu: hmenu=getmenu(hwnd hmenu=getmenu(hwnd); /); /获取主菜单句柄获取主菜单句柄 hprintmenu=createmenuhprintmenu=createmenu(); /(); /动态创建菜单动态创建菜单 appendmenu(hprintmenuappendmenu(hprintmenu,mf_enabled,idm_line,mf_enabled,idm_line,求和求和); ); ap

24、pendmenu(hprintmenu appendmenu(hprintmenu,mf_enabled,idm_rect,mf_enabled,idm_rect,方差方差);); appendmenu(hprintmenu appendmenu(hprintmenu,mf_enabled,idm_rrect,mf_enabled,idm_rrect,平均值平均值);); appendmenu(hprintmenu appendmenu(hprintmenu,mf_enabled,idm_ellip,“,mf_enabled,idm_ellip,“均方根均方根”);); insertmenu(

25、hmenu,2,mf_popup|mf_byposition,insertmenu(hmenu,2,mf_popup|mf_byposition, (uint)hprintmenu (uint)hprintmenu,统计计算统计计算( enablemenuitem(hmenuenablemenuitem(hmenu,idm_addprintmenu,mf_grayed); ,idm_addprintmenu,mf_grayed); enablemenuitem(hmenu enablemenuitem(hmenu,idm_delprintmenu,mf_enabled);,idm_delpri

26、ntmenu,mf_enabled); drawmenubar(hwnd drawmenubar(hwnd); /); /重新显示窗口菜单重新显示窗口菜单 break;break; 增加菜增加菜 单项单项 添加弹添加弹 出式统出式统 计计算计计算 菜单菜单 将创建的将创建的 弹出式菜弹出式菜 单插入主单插入主 菜单中菜单中 改变改变“统计统计 计算计算”菜单菜单 项的属性项的属性 case idm_delprintmenucase idm_delprintmenu: /: /从主菜单中删除弹出式统计计算菜单从主菜单中删除弹出式统计计算菜单 deletemenu(hmenu,2,mf_bypos

27、ition); /deletemenu(hmenu,2,mf_byposition); /删除统计计算菜单项删除统计计算菜单项 enablemenuitem(hmenuenablemenuitem(hmenu,idm_addprintmenu,mf_enabled);,idm_addprintmenu,mf_enabled); enablemenuitem(hmenuenablemenuitem(hmenu,idm_delprintmenu,mf_grayed);,idm_delprintmenu,mf_grayed); drawmenubar(hwnddrawmenubar(hwnd); )

28、; /重新显示窗口菜单重新显示窗口菜单 break;break; case idm_exitcase idm_exit: /: /选择选择“退出退出”时,发出时,发出wm_destroywm_destroy消息消息 sendmessage(hwnd,wm_destroy,0,0);sendmessage(hwnd,wm_destroy,0,0); break;break; case idm_cutcase idm_cut: : break;break; case idm_copycase idm_copy: : break;break; case idm_pastecase idm_paste

29、: : break;break; case idm_deletecase idm_delete:break;:break; break;break; 改变改变“文件文件” 菜单中有关菜单中有关 “统计计算统计计算” 菜单项的属性菜单项的属性 case wm_destroy:case wm_destroy: postquitmessage(0); break; postquitmessage(0); break; default: default: return defwindowproc(hwnd,message,wparam,lparam); return defwindowproc(hwn

30、d,message,wparam,lparam); return 0; return 0; 对应对应case wm_commandcase wm_command菜单消息菜单消息 本例菜单资源文件中的部分内容本例菜单资源文件中的部分内容 menu menu discardable menu menu discardable beginbegin popup popup 文件文件(/=“menu”;/定义菜单名定义菜单名 定义及加载菜单资源实例定义及加载菜单资源实例 资源文件资源文件 menu menu discardablemenu menu discardable/定义菜单条定义菜单条 pop

31、up popup 文件文件( static bool create=true; switch(imessage switch(imessage) ) case wm_lbuttondown:case wm_lbuttondown:/按下鼠标左键后响应的消息按下鼠标左键后响应的消息 if(create=true)if(create=true) hchildmenu=createmenu hchildmenu=createmenu();(); hmenu=getmenu(hwndmain hmenu=getmenu(hwndmain);); appendmenu(hchildmenu append

32、menu(hchildmenu,mf_grayed,idm_delete,mf_grayed,idm_delete,删除计算总和删除计算总和);); appendmenu(hchildmenu appendmenu(hchildmenu,mf_grayed,idm_add,mf_grayed,idm_add,添加计算平均值添加计算平均值);); appendmenu(hchildmenu appendmenu(hchildmenu,mf_grayed,idm_modify,mf_grayed,idm_modify,修改计算均方差修改计算均方差);); insertmenu(hmenu,3,mf

33、_popup|mf_byposition,(uint)hchildmenu,insertmenu(hmenu,3,mf_popup|mf_byposition,(uint)hchildmenu,修改菜单修改菜单);); drawmenubar(hwndmain drawmenubar(hwndmain);); create=false; create=false; break; break; case wm_rbuttondown: case wm_rbuttondown: if(create=false) if(create=false) enablemenuitem(hmenu enabl

34、emenuitem(hmenu,idm_delete,mf_enabled|mf_bycommand);,idm_delete,mf_enabled|mf_bycommand); enablemenuitem(hmenu enablemenuitem(hmenu,idm_add,mf_enabled|mf_bycommand);,idm_add,mf_enabled|mf_bycommand); enablemenuitem(hmenu enablemenuitem(hmenu,idm_modify,mf_enabled|mf_bycommand);,idm_modify,mf_enabled

35、|mf_bycommand); break; break; case wm_command:case wm_command: if(wparam if(wparam=idm_delete)=idm_delete) deletemenu(hmenu deletemenu(hmenu,idm_sum,mf_bycommand);,idm_sum,mf_bycommand); else if(wparam else if(wparam=idm_add)=idm_add) insertmenu(hmenuinsertmenu(hmenu,idm_devia,mf_bycommand|mf_enable

36、d,idm_average,idm_devia,mf_bycommand|mf_enabled,idm_average,计算平均值计算平均值);); else if(wparam else if(wparam=idm_modify)=idm_modify) modifymenu(hmenu modifymenu(hmenu,idm_stddevia,mf_bycommand,idm_nihe,idm_stddevia,mf_bycommand,idm_nihe,线性拟合线性拟合);); else ; else ; break; break; case wm_destroy:case wm_de

37、stroy: postquitmessage(0); postquitmessage(0); return 0; return 0; default:default: return(defwindowproc(hwnd,imessage,wparam,lparam return(defwindowproc(hwnd,imessage,wparam,lparam);); return 0;return 0; 1位图概念位图概念 为提高显示刷新速度,为提高显示刷新速度,位图操作位图操作须在须在内存内存中进行。用于位图中进行。用于位图 操作的设备环境为操作的设备环境为内存设备环境内存设备环境。用函数

38、。用函数createcompatibledc向向 系统申请获取内存设备环境。系统申请获取内存设备环境。 hdcmem = createcompatibledc(hdc);hdcmem = createcompatibledc(hdc); 内存设备环境也有设备描述表内存设备环境也有设备描述表。获取内存设备环境后,还要。获取内存设备环境后,还要 调用调用selectobject将位图文件选入内存设备环境,才可在内存设备将位图文件选入内存设备环境,才可在内存设备 环境中操作位图,操作位图结束后,应用程序须调用环境中操作位图,操作位图结束后,应用程序须调用deletedc释释 放内存设备环境。放内存设

39、备环境。 deletedc(hdcmemdeletedc(hdcmem););/hdcmem:/hdcmem:内存设备环境句柄内存设备环境句柄 7.2 位图资源及其应用位图资源及其应用 位位 图图 操操 作作 过过 程程 1.定义定义 2.加载加载或或创建创建 3.选入内存设备环境选入内存设备环境 4.输出输出 (1) 定义定义一个位图句柄:一个位图句柄:hbitmap hbm;hbitmap hbm; (2a) loadbitmap加载加载位图并获得位图的句柄位图并获得位图的句柄 hbm=loadbitmap(hinstance,lpsznamehbm=loadbitmap(hinstanc

40、e,lpszname);); lpszname lpszname为位图名称为位图名称 (2b)createcompatiblebitmap创建创建位图位图 hbm=createcompatiblebitmaphbm=createcompatiblebitmap (hdc,nwidth,nheight(hdc,nwidth,nheight) ); (3)selectobject将将位图选入内存设备环境位图选入内存设备环境中中 selectobject(hdcmem,hbm);selectobject(hdcmem,hbm); (4) 函数函数bitblt 将位图从内存设备环境拷贝到设备环境中,即

41、将位图从内存设备环境拷贝到设备环境中,即输出输出位图位图 boolbool bitblt bitblt ( ( hdc hdcdesthdc hdcdest, ,/目的设备环境句柄目的设备环境句柄 int xdest,int ydestint xdest,int ydest, ,/标识目的设备显示位图的基点标识目的设备显示位图的基点 int width,int nheitghtint width,int nheitght,/,/设备中用于显示位图区域的高和宽设备中用于显示位图区域的高和宽 hdc hdcscrhdc hdcscr, ,/源设备环境句柄源设备环境句柄 int xscr,int y

42、scrint xscr,int yscr, ,/标识源设备中位图的左上角坐标标识源设备中位图的左上角坐标 dword dwropdword dwrop) )/标识位图显示方式标识位图显示方式 2. 位图的操作过程位图的操作过程 应用程序通过响应消息应用程序通过响应消息wm_create完成加载或创建位图操作完成加载或创建位图操作 case wm_create:case wm_create: hdc=getdc(hwnd);hdc=getdc(hwnd);/获取设备环境获取设备环境 hdcmem=createcompatibledc(hdchdcmem=createcompatibledc(hd

43、c););/获取内存设备环境获取内存设备环境 /进行一系列操作进行一系列操作 releasedc(hwnd,hdc);releasedc(hwnd,hdc);/释放设备环境释放设备环境 另外,在输出位图之前,经常要调用另外,在输出位图之前,经常要调用getobject获取位图的尺寸获取位图的尺寸 函数函数getobject的作用是获取指定对象的信息并将其拷贝到指定的作用是获取指定对象的信息并将其拷贝到指定 的缓冲区内。的缓冲区内。 int getobjectint getobject ( ( handle hobjecthandle hobject, ,/对象句柄对象句柄 int ncount

44、int ncount, ,/拷贝到缓冲区的字节数拷贝到缓冲区的字节数 lpvoid lpobjectlpvoid lpobject/接收信息的缓冲区地址接收信息的缓冲区地址 ) ) 【例【例7-2】位图操作示例。本例调用一幅图片,并在用户窗口区上显示。】位图操作示例。本例调用一幅图片,并在用户窗口区上显示。 本例的资源文件如下:本例的资源文件如下: forest bitmap forest.bmpforest bitmap forest.bmp /定义位图资源定义位图资源 3. 位图操作实例位图操作实例 1. #include 1. #include #include #include 2.

45、#include stdlib2. #include .h#include stdio#include .h 3. lresult callback wndproc(hwnd,uint,wparam,lparam);3. lresult callback wndproc(hwnd,uint,wparam,lparam); 4. hdc hdc4. hdc hdc, , hdcmemhdcmem;/设备环境句柄和设备环境句柄和内存设备环境句柄内存设备环境句柄 5. hbitmap hbm;5. hbitmap hbm;/位图句柄位图句柄 6. bitmap bm;6. bitmap bm;/bi

46、tmap/bitmap结构结构 7. int winapi winmain7. int winapi winmain( (, ,),) 8. 8. hwnd hwndhwnd hwnd ; ; msg msgmsg msg ; ; wndclass wndclasswndclass wndclass ; ; 9. 9. char lpszclassnamechar lpszclassname = = 位图位图; 10. 10. char lpsztitle= example_for_bitmapchar lpsztitle= example_for_bitmap; 11. wndclass11

47、. wndclass.style = 0;.style = 0; 12. 12. 13. 13. wndclass.lpszclassname = lpszclassnamewndclass.lpszclassname = lpszclassname; ; 14. if( !registerclass( messagebeep(0) ;return false ;return false ; 16. hwnd = createwindow16. hwnd = createwindow( (, , ,) ;) ; 17. hbm=loadbitmap17. hbm=loadbitmap(hins

48、tance(hinstance, ,forest););/加载位图加载位图 18. getobject(hbm,sizeof(bitmap),(lpvoid)/);/获取位图尺寸获取位图尺寸 19. showwindow( hwnd, ncmdshow19. showwindow( hwnd, ncmdshow) ; ) ; updatewindow(hwndupdatewindow(hwnd); ); 20. while(getmessage( dispatchmessage( dispatchmessage( ) ; 22. return msg.wparam22. return msg.

49、wparam; ; 23. 23. lresult callback wndproc(lresult callback wndproc(, , , ,) ) paintstruct ps;paintstruct ps; switch(message)switch(message) case wm_create:case wm_create: hdc=getdc(hwnd);hdc=getdc(hwnd);/获取设备环境获取设备环境 hdcmem=createcompatibledc(hdc);hdcmem=createcompatibledc(hdc);/获取内存设备环境获取内存设备环境 re

50、leasedc(hwnd,hdc);releasedc(hwnd,hdc);/释放设备环境释放设备环境 break;break; case wm_paint:case wm_paint: hdc=beginpaint(hwnd,hdc=beginpaint(hwnd, selectobject(hdcmem,hbm);selectobject(hdcmem,hbm);/将位图选入内存设备环境将位图选入内存设备环境 /调用调用bitbltbitblt将内存设备环境中的位图拷贝到设备环境中将内存设备环境中的位图拷贝到设备环境中 bitblt(hdc,180,80,bm.bmwidth,bm.bmh

51、eight,hdcmem,0,0,srccopy);bitblt(hdc,180,80,bm.bmwidth,bm.bmheight,hdcmem,0,0,srccopy); endpaint(hwnd,endpaint(hwnd,/释放设备环境句柄释放设备环境句柄 break;break; case wm_destroy:case wm_destroy: deleteobject(hbm);deleteobject(hbm);/释放位图释放位图 postquitmessage(0);postquitmessage(0); break;break; default:default: retur

52、n defwindowproc(hwnd,message,wparam,lparam);return defwindowproc(hwnd,message,wparam,lparam); return 0;return 0; 对话框资源通常有如下功能:对话框资源通常有如下功能: l发送消息如警告消息、提示框消息发送消息如警告消息、提示框消息 l接收输入如用户输入的消息接收输入如用户输入的消息 l提供消息如常见的提供消息如常见的“关于关于”对话框对话框 一种弹出一种弹出 式窗口式窗口 对话框对话框 模式对话框模式对话框 非模式对话框非模式对话框 不允许不允许用户在关闭对用户在关闭对 话框之前切换

53、到应用话框之前切换到应用 程序的其他窗口程序的其他窗口 允许允许用户在该对话用户在该对话 框与应用程序其他框与应用程序其他 窗口之间的切换窗口之间的切换 7.3 对话框资源及其应用对话框资源及其应用 2. 显示对话框显示对话框 3. 构造对话框消息处理函数构造对话框消息处理函数 4. 关闭对话框关闭对话框 1. 定义对话框资源定义对话框资源 模式对话框模式对话框 的编程方法的编程方法 创建对话框首先应在应用程序的资源描述文件中定义对话框创建对话框首先应在应用程序的资源描述文件中定义对话框: 对话框名对话框名 dialogdialog载入特性选项载入特性选项 x,y,width,heightx,

54、y,width,height 设置选项设置选项 对话框的控件定义对话框的控件定义 1定义对话框资源定义对话框资源 对话框样式可用组合样式,下面定义了含标题栏的弹出式对话框:对话框样式可用组合样式,下面定义了含标题栏的弹出式对话框: style ds_modalframe | ws_popup | ws_captionstyle ds_modalframe | ws_popup | ws_caption 与菜单资源相同与菜单资源相同 位置及外型尺寸位置及外型尺寸 常用的有常用的有caption(标题标题) 和和style(样式样式) 7.3.1 模式对话框的编程方法模式对话框的编程方法 2 显示

55、对话框显示对话框 在定义对话框资源后,可调用在定义对话框资源后,可调用dialogbox函数在窗口中显示对话框函数在窗口中显示对话框 int dialogboxint dialogbox ( (hinstance hinstance,/当前应用程序的实例句柄当前应用程序的实例句柄 lpctstr lpszdialogname,/lpctstr lpszdialogname,/对话框资源的名称对话框资源的名称 hwnd hwndparent,/拥有该对话框的窗口句柄拥有该对话框的窗口句柄 wndproc lpdialogfunc)wndproc lpdialogfunc)/对话框处理函数的地址对

56、话框处理函数的地址 3 构造对话框消息处理函数构造对话框消息处理函数 对话框接收的消息都在相应的对话框消息处理函数中处理对话框接收的消息都在相应的对话框消息处理函数中处理 bool callback dlgprocbool callback dlgproc( (, , , ,) ) switch switch(messagemessage) case wm_initdialogcase wm_initdialog:return 1;return 1; case wm_commandcase wm_command switch (loword (wparam )switch (loword (w

57、param ) case case ;break;break; case case ;break;break; break;break; return 0;return 0; 对对话话框框处处理理函函数数 主主窗窗口口函函数数 函函数数的的返返回回值值 bool 值值 lresult 值值 wm_paint wm_destroy wm_create 不不需需处处理理 处处理理 未未定定义义处处理理过过程程 的的默默认认处处理理 若若收收到到此此消消息息,返返回回 false(return 0) 调调用用 defwindowproc 对话框消对话框消 息处理函息处理函 数数具有与具有与 主窗口函

58、主窗口函 数数相似的相似的 参数,但参数,但 两者存在两者存在 不同不同 在对话框消息处理函数中常响应以下两类消息:在对话框消息处理函数中常响应以下两类消息: (a)wn_ initdialogwn_ initdialog 消息消息 完成其初始化操作,在功能上与主窗口函数的完成其初始化操作,在功能上与主窗口函数的wm_commandwm_command消息消息 相似。相似。 (b)wm_commandwm_command消息消息 通过查看消息字参数(通过查看消息字参数(wparam)中的低位字节,与控件标识)中的低位字节,与控件标识 (id)相比较,以确定产生交互请求的控件并据此转入相应的处)

59、相比较,以确定产生交互请求的控件并据此转入相应的处 理过程处理。理过程处理。 4. 关闭对话框关闭对话框 调用函数调用函数enddialog可以关闭对话框可以关闭对话框 enddialog (hdlg,nresult) ;enddialog (hdlg,nresult) ; 消息框消息框是是模态对话框模态对话框的特殊形式,调用的特殊形式,调用messagebox生成生成消息框消息框 int messagebox int messagebox ( (hwnd hwnd,hwnd hwnd,/拥有消息框的窗口拥有消息框的窗口 lpctstr lpsztext,lpctstr lpsztext, /

60、消息框中显示的字符串消息框中显示的字符串 lpctstr lpszcaption,/lpctstr lpszcaption,/作为标题的字符串作为标题的字符串 dword dwtypedword dwtype/指定消息框的内容指定消息框的内容 ) ) 从对话框返回到从对话框返回到 dialogbox函数的值函数的值 对话框句柄对话框句柄 标标 识识说说 明明 m mb b_ _a ab bo or rt tr re et tr ry yi ig gn no or re e含含有有 a ab bo or rt t、r re et tr ry y 和和 i ig gn no or re e 按按钮

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论