版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2023/4/101面向对象与可视化
程序设计
--VisualC++编程
主讲教师:
唐龙教授
(计算机科学与技术系)
黄维通博士
(计算机与信息管理中心)
清华大学
2001年2月2023/4/102第七章
资源在Windows编程中的应用2023/4/103内容提要菜单与加速键资源的应用位图资源及其应用对话框资源及其应用图标资源及其应用2023/4/104Windows编程可用的资源可用的资源类型菜单加速键位图对话框图标…...资源使用的目的——便于应用程序与用户之间的交互。创建和编辑资源的工具——资源编辑器。2023/4/105§7.1.
菜单与加速键
资源及其应用2023/4/1061.菜单与加速键资源的作用菜单是窗口的重要组成部分,使用户直观地了解和使用程序的功能。加速键可使菜单的操作更灵活快捷。菜单组成:主菜单下拉式菜单框菜单项热键标识菜单项加速键标识菜单项分隔线选中的标识2023/4/1072.菜单的创建过程创建过程——菜单定义和加载菜单在资源描述文件中定义菜单名MENU[,选项]{菜单项列表}用以标识菜单所具有的载入特性资源描述文件中使用定义菜单项关键字:POPUPMENUITEM2023/4/108POPUP语句定义弹出式菜单定义形式为:
POPUP“菜单项名”[,选项];在菜单项名中加符号“&”可定义该菜单项的热键。例如:
POPUP“编辑(&E)”;该菜单项使用Alt+E键作为热键。弹出式菜单项还可包含子菜单。菜单项的常用选项及其说明见下表。2023/4/109MENUIEM语句用于定义菜单项定义形式为:
MENUITEM“菜单项名”菜单项标识(ID)[,选项]ID为菜单项标识应用程序通过此标识值确认每一个菜单项消息标识值可为0-65535之间的任一整数每个菜单项的标识必须唯一的创建菜单中的水平分隔符的语句:
MENUITEMSEPARATOR;WM_COMMAND消息的字参数wParam中,包含所选菜单项的标识2023/4/1010[实例]
在“Menu”的窗口中创建一个“文件”菜单,含有“新建”、“打开”、“关闭”、“保存”、“另存为”及“退出”等菜单项,均使用热键;并在“退出”项前加分隔线。#include<windows.h>#include“Menu.h”∥菜单定义MenuMENUMOVEABLE ∥Menu为窗口菜单的名称{
POPUP“文件(&F)”∥定义“文件”弹出式菜单{
MENUITEM “新建(&N)”,IDM_NEW
MENUITEM “打开(&O)”,IDM_OPEN
MENUITEM “关闭(&C)”,IDM_CLOSEMENUITEM “保存(&S)”,IDM_SAVEMENUITEM “另存为(&A)”,IDM_SAVEAS
MENUITEM SEPARATOR
∥分隔线
MENUITEM “退出(&X)”,IDM_EXIT
}}Menu.h
定义了标识所对应的数值:…#defineIDM_NEW10#defineIDM_OPEN11#defineIDM_CLOSE12#defineIDM_SAVE13#defineIDM_SAVEAS14#defineIDM_EXIT15…2023/4/10112.菜单的创建过程(续)加载菜单资源三种方法在窗口类中加载菜单在创建窗口时加载菜单动态加载菜单在窗口类中加载菜单窗口类的定义中加相应语句…WNDCLASSwndclass;…wndclass.lpszMenuName=lpszMenuName;…2023/4/1012动态加载菜单调用函数SetMenu动态地加载菜单
BOOLSetMenu(HWNDhwnd,HMENUhmenu);
//Hwnd为窗口句柄
//hmenu为菜单句柄同一应用程序中,动态实现多种不同的菜单操作界面在创建窗口时加载菜单调用函数LoadMemu加载菜单
HMENULoadMemu(hInstance,lpszMenuName);
//hInstance为当前程序的实例句柄,
//lpszMenuName为窗口菜单名
例如:
hmenu=LoadMenu(hlnstance,"Menu");
hwnd=CreateWindow(…,hmenu,…,);2023/4/10133.菜单项的操作激活或禁止菜单项(指定该项的初始状态);设置或取消选中标志(“√”);增加菜单项;删除菜单项;修改菜单项;…...2023/4/10141.激活或禁止菜单项创建菜单时,调用函数EnableMenuItem指定其初始状态
DWORDEnableMenuItem( HMENUhmenu, UlNTwIDEnableItem,//被禁止或激活的菜单项标识
UINTdwEnable) //菜单项操作标识MF_BYCOMMAND 以ID值标识菜单项MF_ENABLED 激活菜单项 MF_BYPOSITION 以位置标识菜单项MF_GRAYED 禁止菜单项并使其变灰显示MF_DISABLED 禁止菜单项据dwEnable决定取菜单项ID值或在菜单中位置。例如,禁止弹出式菜单“文件”中的“打开”项的形式如下:EnableMenuItem(hmenu,IDM_OPEN,MF_BYCOMMAND|MF_DISABLED);相应于ID值指明的菜单项被禁止2023/4/10152.设置或取消选中(“√”)标志在资源描述文件中设置菜单项的为CHECKED调用函数CheckMenuItem设置或取消选中标志DWORDCheckMenultem(
HMENUhmen, UINTwIDCheckItem, //所操作的菜单项标识。
UINTdwCheck) //操作标识据dwCheck的取该菜单项的ID值或在菜单中位置。MF_BYCOMMAND 以ID值标识菜单项MF_CHECKED 添加选中标志
MF_BYPOSITION 以位置标识菜单项MF_UNCHECKED 删除选中标志2023/4/10163.增加菜单项两种形式:尾部增加/菜单中插入在菜单的尾部增加菜单项
调用函数AppendMenu加新菜单项BOOL
AppendMenu(HMENUhmenu,UINTdwFlags,//新菜单项的类型标识或其他信息UINTdwIDNewItem,//菜单项的标识LPCTSTRlpNewItem//菜单项内容,取决与dwFlags);通常是插入项的ID值;若加入弹出式菜单,则为其句柄。2023/4/10173.增加菜单项在菜单中插入菜单项调用函数InsertMenu加新菜单项BOOLlnsertMenu(HMENUhmenu, UINTwPosition,//下一个菜单项的ID值或插入的位置
UINTdwFlag,//新菜单项的信息
UINTdwIDNweltem,//新菜单项的ID标识
LPCTSTRlpNewltem//菜单项的内容);取决于dwFlagdwFlag对wPosition的解释:
MF_BYCOMMAND为插入位置的下一个菜单项的ID值
MF_BYPOSITION为插入的位置号2023/4/1018[实例2]在弹出式菜单“文件”的“退出”项之前,加入新的菜单项“打印”的语句如下::lnsertMenu( hmenu, IDM_EXIT, MF_BYCOMMAND|MF_ENABLED,
IDM_PRINT,
“打印(&P)” );[实例1]在弹出式菜单“文件”的末尾,增加一项“关于”的语句如下::
AppendMenu(hmenu, MF_ENABLED, IDM_ABOUT,
“关于(&A)” );2023/4/10194.删除菜单项调用函数DeleteMenu
删除菜单项。
BOOLDeleteMenu( HMENUhmenu, UINTwPosition,//要删除菜单项的位置
UINTdwFlag);//对wPosition的解释若删除的菜单项含有弹出式菜单则同时被删除。例如,删除弹出式“文件”菜单中的“另存为”项,可用如下语句:
DeleteMenu(hmenu,IDM_SAVEAS,MF_BYCOMMAND);2023/4/10205.修改菜单项
调用函数ModifyMenu可修改菜单中的某个项
BOOLModifyMenu( HMENUhmenu, UINTwPosition, //指定需修改的菜单项位置
UINTdwFlag, UINTdwIDNweItem,//一般为修改后菜单项的标识
LPCTSTRlpNewItem);//一般为修改后的菜单项名
例如,修改弹出式菜单“文件”中“打开”项为“加载”项。可用如下语句:ModifyMenu(hmenu,IDM_OPEN,MF_BYCOMMAND, IDM_LOAD,“加载(&L)”);2023/4/10214.动态地创建菜单动态菜单可节省系统资源,分两步骤创建。调用函数Createmenu创建空的弹出式菜单
hmenu
=
CreateMenu
(void);调用函数AppendMenu或InsertMenu在该菜单中加入菜单项;
AppendMenu
( hmenu, //已有的菜单句柄
MF_POPUP, //创建的新弹出式菜单句柄
(UINT)hmenuPopup,//该弹出式菜单的名字
lpszTitie );2023/4/1022
例如,在窗口菜单中,动态创建弹出式菜单“编辑”的过程如下:…HMENUhmenu,//主窗口菜单句柄hPopupmenu;//创建新的菜单句柄…//定义菜单句柄hPopumenu:CreateMenul;...//将弹出式菜单加入到菜单中AppendMenu(hmenu,MF_POPUP,(UINT)hmenuPopup,“编辑(&E)”);...2023/4/10235.加速键资源加速键是伴随菜单的一种常用的资源。创建加速键的步骤:在资源描述文件中定义加速键资源;加载加速键资源;翻译加速键。2023/4/1024加速键定义的格式加速键表名
ACCELERATORS{
加速键的定义}其中,加速键的定义为::键名,加速键标识(ID),[类型][NOINVERT]
[ALT][SHIFT][CONTROL]在资源描述文件中定义加速键资源与该菜单项标识相同该键为标准键/虚拟键使用加速键时,菜单项非高亮度显示。组合键的组合方式2023/4/1025与Ctrl键组合的加速键——“^char”,id例如,“文件”菜单中“保存”项的加速键可定义为:
“^S”,IDM_SAVE加速键有两种形式使用虚拟键作为加速键——nCode,idVIRTKEY可用VK_DELETE,
VK_F1等虚拟键。例如,将F1键定义为“帮助”菜单项的加速键,其形式如下:
VK_F1,IDM_HEILP,VIRKEY2023/4/1026资源描述文件定义加速键实例://对名为“
Menu”的窗口菜单项的加速键定义:#include<windows.h>#include"Menu.h"…∥菜单定义…MenuACCELERATORS∥定义加速键表“
Menu”{
“^N”,IDM_NEW
“^O”,IDM_OPEN
“^S”,IDM_SAVE}2023/4/1027加载加速键资源通过函数LoadAccelerators加载加速键资源,其形式为:…HACCELhAccel;…hAccel=LoadAccelerators(hInstance, //为当前程序实例句柄lpAcceIName //为加速键表名);2023/4/1028翻译加速键加速键可快捷切换菜单项,应用程序在消息循环中必须完成加速键消息到菜单消息的翻译。while(GetMessage(&Msg,NULL,0,0)){if(!TranslateAccelerators(hwnd,hAccel,&Mag)){ TranslateMessage(&Msg);
DispatchMessage(&Msg);
}}2023/4/1029函数TranslateAccelerators是翻译操作的核心intTranslateAccelerators( HWNDhwnd, //为窗口句柄
HACCELhAccel, //为加速键表句柄
lpMSGlpMsg //为指向MSG结构的指针);函数TranslateAccelerators的作用——对照加速键表,将相关按键消息WM_KEYDOWN和WM_KEYUP
翻译成WM_COMMAND
或WM_SYSCOMMAND的消息。特点——WM_COMMAND或WM_SYSCOMMAND消息直接发往窗口,而不在消息队列中等待。。2023/4/10306.创建菜单资源实例【例7-1】创建一个通用的窗口菜单的构架,用户可通过选择“文件”弹出式菜单中的“创建统计计算菜单项”动态地创建主菜单中的“统计计算”菜单项。2023/4/1031一个基本的菜单构架动态的创建“统计计算”下拉菜单的界面2023/4/1032程序的实现步骤如下:(3)调用函数DrawMenuBar重新显示改变后的窗口主菜单。
BOOLDrawMenuBar(HWNDhwnd)
(1)调用函数GetMenu获取窗口主菜单句柄
intGetMenu(HWNDhwnd);(2)应用程序建立新菜单、加入菜单项并插入到主菜单的指定位置。在创建新的弹出式菜单后,应用程序还通过调用函数EnableMenuItem禁止“创建统计计算菜单项”并将其暗淡显示。2023/4/1033程序在响应“文件”弹出式菜单中的“退出”项时还使用了函数SendMessage向窗口发送消息:LONGSendMessage(HWNDhwnd,UINTMsg,DWORDdwParam,LONGlParam)其中:Msg为发送的消息;dwParam和lParam均为消息的附加信息。创建“统计计算”菜单项后,可通过选择“文件”下拉菜单中的“删除统计计算菜单项”删除创建的“统计计算”菜单项。应用程序调用函数DeleteMenu实现删除该项,并调用函数EnableMenuItem恢复“创建统计计算菜单项”的属性。2023/4/1034
//菜单示例.c
#include<windows.h> #include<string.h> #include<stdlib.h> #include<stdio.h> #defineIDM_NEW10 #defineIDM_OPEN11 #defineIDM_CLOSE12 #defineIDM_SAVE13 #defineIDM_SAVEAS14 #defineIDM_ADDPRINTMENU 15 #defineIDM_DELPRINTMENU 16 #defineIDM_EXIT17 #defineIDM_CUT18 #defineIDM_COPY19 #defineIDM_PASTE20 #defineIDM_DELETE21 #defineIDM_HELP22 #defineIDM_LINE23 #defineIDM_RECT24 #defineIDM_RRECT25 #defineIDM_ELLIP262023/4/1035HMENUhmenu,hprintmenu;//定义菜单句柄LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(…………){
HWNDhwnd;MSGMsg;HACCELhAccel;WNDCLASSwndclass;charlpszMenuName[]="Menu";charlpszClassName[]="菜单";charlpszTitle[]="My_Menu_Example";wndclass.style=0;
……wndclass.lpszClassName=lpszClassName;if(!RegisterClass(&wndclass)){MessageBeep(0);returnFALSE;}hwnd=CreateWindow(……,…….);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);hAccel=LoadAccelerators(hInstance,lpszMenuName);
while(GetMessage(&Msg,NULL,0,0))
{//截获加速键消息
if(!TranslateAccelerator(hwnd,hAccel,&Msg)){TranslateMessage(&Msg);DispatchMessage(&Msg);}
}
returnMsg.wParam;
}加载加速键资源截获加速键消息2023/4/1036LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage, WPARAMwParam,LPARAMlParam){
switch(message)
{
caseWM_COMMAND: //处理菜单消息
switch(LOWORD(wParam))
{caseIDM_NEW:
break;
caseIDM_OPEN:break;
caseIDM_SAVE:break;
caseIDM_SAVEAS:break;
caseIDM_CLOSE:break;
caseIDM_ADDPRINTMENU:
hmenu=GetMenu(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,"统计计算(&C)");
EnableMenuItem(hmenu,IDM_ADDPRINTMENU,MF_GRAYED); EnableMenuItem(hmenu,IDM_DELPRINTMENU,MF_ENABLED);
DrawMenuBar(hwnd);//重新显示窗口菜单
break;增加菜单项添加弹出式统计计算菜单将创建的弹出式菜单插入主菜单中改变“统计计算”菜单项的属性2023/4/1037
caseIDM_DELPRINTMENU://从主菜单中删除弹出式统计计算菜单
DeleteMenu(hmenu,2,MF_BYPOSITION);//删除统计计算菜单项
EnableMenuItem(hmenu,IDM_ADDPRINTMENU,MF_ENABLED); EnableMenuItem(hmenu,IDM_DELPRINTMENU,MF_GRAYED);
DrawMenuBar(hwnd); //重新显示窗口菜单break;
caseIDM_EXIT://选择“退出”时,发出WM_DESTROY消息
SendMessage(hwnd,WM_DESTROY,0,0);break;
caseIDM_CUT:
break;
caseIDM_COPY: break;
caseIDM_PASTE: break;
caseIDM_DELETE:break;
}break;改变“文件”菜单中有关“统计计算”菜单项的属性
caseWM_DESTROY: PostQuitMessage(0);break;default:returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}对应于WM_COMMAND菜单消息处理删除弹出式统计计算菜单2023/4/1038本例菜单资源文件中的部分内容MENUMENUDISCARDABLEBEGINPOPUP"文件(&F)"
BEGINMENUITEM"新建(&N)\tCtrl+N",IDM_NEWMENUITEM"打开(&O)\tCtrl+O",IDM_OPENMENUITEM"关闭(&C)",IDM_CLOSEMENUITEMSEPARATORMENUITEM"保存(&S)\tCtrl+S",IDM_SAVEMENUITEM"另存为(&A)",IDM_SAVEASMENUITEMSEPARATORMENUITEM"创建统计计算菜单项(&P)\tCtrl+P",IDM_ADDPRINTMENUMENUITEM"删除统计计算菜单项(&D)\tCtrl+D",IDM_DELPRINTMENU,GRAYEDMENUITEMSEPARATORMENUITEM"退出(&X)",IDM_EXITENDPOPUP"编辑(&E)"BEGIN
MENUITEM"剪切(&T)\tCtrl+X",IDM_CUTMENUITEM"复制(&C)\tCtrl+C",IDM_COPYMENUITEM"粘贴(&P)\tCtrl+V",IDM_PASTEMENUITEM
"删除(&D)\tDel",IDM_DELETEENDMENUITEM"帮助(&H)", IDM_HELPEND2023/4/1039本例中的加速键MENUACCELERATORSMOVEABLEPUREBEGIN
"^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,ASCIIVK_DELETE,IDM_DELETE,VIRTKEYEND2023/4/1040§7.2.
位图资源及其应用2023/4/10411.位图概念位图——描述每个象素属性的图像信息。在内存中操作以提高刷新速度。获取内存设备环境,调用函数CreateCompatibleDC。
Hdcmem=CreateCompatibleDC(hdc);调用函数SelectObject将位图文件选入内存设备环境,才可操作位图。操作位图束后,须调用函数DeleteDC释放内存设备环境。2023/4/10422.位图的操作过程定义一个位图句柄HBITMAPhBm;加载或创建LoadBitMap加载位图并获得位图的句柄
hBm=LoadBitMap(hinstance,lpszname);
CreateCompatibleBitmap创建位图hBm=CreateCompatibleBitmap(hdc,nWidth,nHeight);应用程序在响应消息WM_CREATE处理中,获取内存设备环境,完成加载或创建。Hdcmem=CreateCompatibleDC(hdc);位图名称2023/4/10432.位图的操作过程(续)选入内存设备环境
SelectObject(hdcmem,hBm);输出——
函数BitBlt将位图从内存设备环境拷贝到设备环境中。BooLBitBlt(HDChdcDest, //目的设备环境句柄
intXdest,intYdest,//目的设备显示位图的基点
intWidth,intnHeitght,//用于显示位图区域的高和宽
HDChdcScr, //源设备环境句柄
intXScr,intYscr, //源设备中位图的左上角坐标
DWORDdwRop //位图显示方式)
dwRop操作码说明见教材p152表7-52023/4/1044应用程序通过响应消息WM_CREATE完成加载或创建位图操作
caseWM_CREATE:
…hdc=GetDC(hwnd); //获取设备环境
hdcmem=CreateCompatibleDC(hdc); //获取内存设备环境
… //进行一系列操作
ReleaseDC(hwnd,hdc); //释放设备环境调用函数GetObject可获取对象的信息并将其拷贝到缓冲区内。
intGetObject(HANDLEhObject, //对象句柄intnCount, //拷贝到缓冲区的字节数LPVOIDlpObject) //接收信息的缓冲区地址在输出位图前,可调用函数GetObject获取位图的尺寸等信息GetObject(hbitmap,sizeof(BITMAP),(LPVOID)&bm);数据结构BITMAP含有位图的高度,宽度等信息2023/4/1045本例的资源文件如下:
pic7_2BITMAPpic7_2.bmp //定义位图资源3.位图操作实例【例7-2】调用一幅图片,显示在用户窗口区。2023/4/1046#include<windows.h> #include<string.h>#include<stdlib.h>#include<stdio.h>LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);HDChdc,hdcmem; //设备环境句柄和内存设备环境句柄HBITMAPhBm; //位图句柄BITMAPbm; //BITMAP结构
TypedefstructtagBITMAP{LONGbmType;LONGbmWidth;
//宽度
LONGbmHeight;
//高度
LONGbmWidthBytes;
//每行字节数
WORDbmPlanes;
//位面数
WORDbmBitsPixel;
//每象素的bit数
LPVOIDbmBits}BITMAP;2023/4/1047intWINAPIWinMain(……,……,){
HWNDhwnd;
MSGMsg;
WNDCLASSwndclass;;charlpszClassName[]="位图";charlpszTitle[]="Example_For_BitMap";
wndclass.style=0;
……wndclass.lpszClassName=lpszClassName;
if(!RegisterClass(&wndclass)) {MessageBeep(0); returnFALSE;}
hwnd=CreateWindow(……,……,……);
hBm=LoadBitmap(hInstance,"pic7_2");
GetObject(hBm,sizeof(BITMAP),(LPVOID)&bm);//取位图尺寸
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
returnMsg.wParam;}加载位图2023/4/1048LRESULTCALLBACKWndProc(……,……,……,……){PAINTSTRUCTps;switch(message){caseWM_CREATE: hdc=GetDC(hwnd); //获取设备环境hdcmem=CreateCompatibleDC(hdc); //获取内存设备环境
ReleaseDC(hwnd,hdc); //释放设备环境
break;
caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); SelectObject(hdcmem,hBm); //将位图选入内存设备环境
BitBlt(hdc,180,80,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY); EndPaint(hwnd,&ps); //释放设备环境
break;
caseWM_DESTROY: DeleteObject(hBm); //释放位图
PostQuitMessage(0); break;
default: returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}将内存设备环境中的位图拷贝到设备环境中。2023/4/1049§7.3.
对话框资源及其应用2023/4/10501.对话框及其功能对话框是一种弹出式窗口,直接交互的工具。模式对话框非模式对话框模式对话框——关闭对话框前,不允许切换到其他窗口。非模式对话框——允许切换到其他窗口。对话框资源通常有如下功能:发送消息,如警告或提示消息;接收输入,如用户输入的消息;提供消息,如常见的“关于”对话框。2023/4/10512.模式对话框的编程方法模式对话框的编程包括下列操作:定义对话框资源;显示对话框;构造对话框消息;关闭对话框处理函数。2023/4/10521.定义对话框资源资源描述文件中定义对话框对话框名DIALOG[载入特性选项]X,Y,Width,Height[设置选项]{
对话框的控件定义}位置及外型尺寸与菜单资源相同常用的有标题和样式,即:CAPTION;STYLE()。可用组合式,例如含标题栏的弹出式对话框:
STYLEDS_MODALFRAME|WS_POPUP|WS_CAPTION2.显示对话框调用DialogBox函数在窗口中显示对话框
intDialogBox(
HINSTANCEhInstance, //当前应用程序的实例句柄
LPCTSTRlpszDialogName,//对话框资源的名称
HWNDhwndParent,//拥有该对话框的窗口句柄
WNDPROClpDialogFunc);//对话框处理函数的地址2023/4/10533.构造对话框消息处理函数
BOOLCALLBACKDlgProc(…,…,…,…){
switch(message)
{caseWM_INITDIALOG:return1; caseWM_COMMAND
switch(LOWORD(wParam)){case…;break;case…;break;
… }
break;}
return0;}对应WN_INITDIALOG消息,
完成初始化处理。对应WM_COMMAND消息,按消息字参数(wParam)的低位字节确定相应的处理。对话框消息处理函数与主窗口函数有相似的参数,但处理内容。2023/4/10544.关闭对话框调用函数EndDialog可关闭对话框EndDialog(hdlg,nResult);
调用MessageBox生成消息框——模态对话框的特殊形式。intMessageBox(
HWNDhwnd,
//拥有消息框的窗口
LPCTSTRlpszText,
//消息框中显示的字符串
LPCTSTRlpszCaption,//标题字符串
DWORDdwType);
//指定消息框的内容标识可组合用5.消息框2023/4/10553.模态对话框应用实例【例7-3】含有标题栏、系统菜单、简要信息及一个按钮控件的对话框//7_3.cpp#include<windows.h>#include"7_3.h"HINSTANCEhInst;LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);BOOLCALLBACK
DlgProc(HWND,UINT,WPARAM,LPARAM);2023/4/1056intWINAPIWinMain(……,……,……,……){HWNDhwnd;MSGMsg; HACCELhAccel;WNDCLASSwndclass;charlpszMenuName[]="Menu";charlpszClassName[]="模态对话框";charlpszTitle[]="模态对话框样例";
wndclass.style=0;
……
wndclass.lpszClassName=lpszClassName;
if(!RegisterClass(&wndclass)){MessageBeep(0);returnFALSE;}hwnd=CreateWindow(……,……,……);
ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);hInst=hInstance;hAccel=LoadAccelerators(hInst,lpszMenuName);while(GetMessage(&Msg,NULL,0,0)){if(!TranslateAccelerator(hwnd,hAccel,&Msg)){TranslateMessage(&Msg);DispatchMessage(&Msg);}
}
returnMsg.wParam;
}
2023/4/1057LRESULTCALLBACKWndProc(……,……,……,……){switch(message){caseWM_COMMAND:switch(LOWORD(wParam)){caseIDM_NEW:break;caseIDM_OPEN:
MessageBox(hwnd,"文件已经打开!","文件打开",MB_OK);break;caseIDM_SAVE:
MessageBox(hwnd,"文件保存成功!","文件保存",MB_OK);break;caseIDM_SAVEAS:break;caseIDM_CLOSE:break;caseIDM_EXIT:SendMessage(hwnd,WM_DESTROY,0,0);break;caseIDM_CUT:break;caseIDM_COPY:break;caseIDM_PASTE:break;caseIDM_DELETE:break;caseIDM_ABOUT:
DialogBox(hInst,"About",hwnd,(DLGPROC)DlgProc);break;}break;
caseWM_DESTROY:PostQuitMessage(0);break;
default:returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}创建对话框创建消息框2023/4/1058BOOLCALLBACKDlgProc(……,……,……,……)//对话框窗口处理函数
{
switch(message){
caseWM_INITDIALOG:
//对话框初始化
return1;
caseWM_COMMAND:
//处理对话框消息
switch(LOWORD(wParam))
{
caseIDOK://关闭对话框
EndDialog(hdlg,0);return1;
}
break;
caseWM_CLOSE:
EndDialog(hdlg,0);return1;}return0;}2023/4/1059//本例的资源程序代码如下:#include<windows.h>#include"7_3.h"MenuMENUDISCARDABLE{POPUP"文件(&F)"{MENUITEM"新建(&N)\tCtrl+N",IDM_NEWMENUITEM"打开(&O)\tCtrl+O",IDM_OPENMENUITEM"关闭(&C)",IDM_CLOSEMENUITEMSEPARATORMENUITEM"保存(&S)\tCtrl+S",IDM_SAVEMENUITEM"另存为(&A)",IDM_SAVEASMENUITEMSEPARATORMENUITEM"退出(&X)",IDM_EXIT}POPUP"编辑(&E)"{MENUITEM"剪切(&T)\tCtrl+X",IDM_CUTMENUITEM"复制(&C)\tCtrl+C",IDM_COPYMENUITEM"粘贴(&P)\tCtrl+V",IDM_PASTEMENUITEM"删除(&D)\tDel",IDM_DELETE}POPUP"帮助(&H)"{MENUITEM"关于(&A)...",IDM_ABOUT}}2023/4/1060MenuACCELERATORS
{
"^N",IDM_NEW"^O",IDM_OPEN"^S",IDM_SAVE"^X",IDM_CUT"^C",IDM_COPY"^V",IDM_PASTE
VK_DELETE,IDM_DELETE,VIRTKEY
}AboutDIALOG10,10,100,50STYLEWS_POPUP|WS_CAPTION|WS_SYSMENUCAPTION"关于"FONT18,"楷体"//对话框中的文本字体类型及大小
{CTEXT"Windows模态对话框",-1,13,10,80,10DEFPUSHBUTTON"确定",IDOK,35,30,30,12
}2023/4/10614.非模态对话框的编程方法非模式对话框与模态对话框的编程较类似,但略有差别,包括下列操作:定义对话框样式;创建对话框函数;构造对话框消息息循环部分的处理;关闭对话框处理函数。2023/4/10621.定义对话框样式非模态对话框的定义一般形式如下:
STYLE
WS_POPUP|WS_CAPTION|WS_VISIBLE
调用函数CreateDialog创建非模态对话框
HWNDCreateDialog(HINSTANCEhInstance,//当前应用程序实例句柄
LPCTSTRlpszDialogName,//对话框名
HWNDhwndParent, //拥有该对话框的窗口句柄
WNDPROClpDialogFunc); //对话框处理函数地址应有此项,否则无法显示。应有标题,以便窗口间切换。2.创建对话框函数2023/4/10633.消息循环部分的处理调用函数DestroyWindow关闭非模态对话框。DOOLDestroyWindow(HWNDhdlg)消息循环中必须能截获发往非模态对话框的消息,并送到相应的对话框处理函数去处理。其消息循环一般形式::while(GetMessage(&Msg,NULL,0,0)){if(!IsDialogMessage(hdlg,&Msg)){TranslateMessage(&Msg);
DispatchMessage(&Msg);}}若为发往非模态对话框的消息,则发送到DlgProc处理。4.关闭对话框的函数2023/4/10645.非模态对话框应用实例【例7-4】不关闭“关于”窗口,仍可操作“文件”下拉菜单,如选其中的“创建”选项,即可弹出“创建”窗口。//7-4.cpp#include<windows.h>#include"7-4.h"HWNDhdlg;//对话框句柄HINSTANCEhInst;LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);BOOLCALLBACKDlgProc(HWND,UINT,WPARAM,LPARAM);2023/4/1065intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInst, LPSTRlpszCmdLine,intnCmdShow){HWNDhwnd;MSGMsg;HACCELhAccel;WNDCLASSwndclass;charlpszMenuName[]="Menu";charlpszClassName[]="非模态对话框";charlpszTitle[]="非模态对话框演示程序";wndclass.style=0;
……wndclass.lpszClassName=lpszClassName;
if(!RegisterClass(&wndclass)){MessageBeep(0);returnFALSE;}hwnd=CreateWindow(……,……,……,……); ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);hInst=hInstance;hAccel=LoadAccelerators(hInst,lpszMenuName);while(GetMessage(&Msg,NULL,0,0)){if(!IsDialogMessage(hdlg,&Msg)){if(!TranslateAccelerator(hwnd,hAccel,&Msg)) {TranslateMessage(&Msg);DispatchMessage(&Msg);}}}returnMsg.wParam;}截获非模态对话框的消息,并发送到DlgProc处理。2023/4/1066LRESULTCALLBACKWndProc(……,……,……,……){switch(message){caseWM_COMMAND:switch(LOWORD(wParam)){caseIDM_NEW:
MessageBox(hwnd,"文件创建成功!","文件创建",MB_OK);break;caseIDM_OPEN:
MessageBox(hwnd,"文件打开成功!","文件打开",MB_OK);break;caseIDM_SAVE:
MessageBox(hwnd,"文件保存成功!","文件保存",MB_OK);break;caseIDM_SAVEAS:break;caseIDM_CLOSE:break;caseIDM_EXIT:SendMessage(hwnd,WM_DESTROY,0,0);break;caseIDM_ABOUT:hdlg=CreateDialog(hInst,"About",hwnd,(DLGPROC)DlgProc);
break;}break;caseWM_DESTROY:PostQuitMessage(0);break;default:returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}创建非模态对话框。2023/4/10676.通用对话框资源Windows系统提供了一系列常用的通用对话框,例如“颜色”、“打开”、“保存”等,这些对话框模板在COMMDLG.h中。创建通用对话框的两个步骤:填充对话框模板结构;调用函数显示对话框。2023/4/10681.填充对话框模板数据结构系统通用对话框模板数据结构有如下所列:OPENFILENAME
打开文件对话框模板数据结构CHOOSECOLOR
选择颜色对话框模板数据结构CHOOSEFONT
选择字体对话框模板数据结构PRINTDLG
打印对话框模板数据结构PAGESETUPDLG页面设置对话框模板数据结构FINDREPLACE
查找对话框模板数据结构
其中最常用的是OPENFILENAME,
OPEN和SAVEAS对话框,都使用该结构完成定义。2023/4/1069OPENFILENAME数据结构的定义如下:typedefstructtagOPENFILENAME{DWORDiStructSize; //本数据结构的长度
HWNDhwndOwner; //所在的窗口句柄
HANDLEhInstance; //对话框模板句柄
LPCSTRlpstrFilter; //初始文件过滤器标识字符串
LPSTRlpstrCustomFilter;//客户过滤器的标识字符串
DWORDnMaxCustFilter; //客户过滤器缓冲区的大小
DWORDnFilterIndex; //文件过滤器正文串的索引值
LPSTRlpstrFile; //文件名列表框中文件的指针
DWORDnMaxFile; //文件名列表缓冲区的大小
LPSTRlpstrFileTitle; //选定文件名的指针
DWORDnMaxFileTitle; //选定文件名缓冲区的大小
2023/4/1070LPCSTRlpstrInitialDir; //对话框初始文件目录文件的指针
LPCSTRlpstrTitle; //对话框的标题
DWORDFlags; //对话框的标志
UINTnFileOffset; //从路径名到文件名的偏移
UINTnfiIeExtension;//从路径名到文件扩展名的偏移
LPCSTRlpstrDefExt; //缺省扩展名的指针
LPARAMlCustData; //应用程序自定义的数据,将其传给相应lpfnHook确定的钩子函数
UINT(CALLBACK*lpfnHook)(HWND,UINT,WPARAM,LPARM)LPCSTRlpTemplateName; //对话模板的标签}OPENFILENAME;2023/4/10712.调用函数显示对话框用以显示通用对话框的API函数: 。
ChooseFont 显示“字体”对话框
ChooseColor 显示“颜色”对话框
FindText 显示“查找”对话框
GetOpenFileName显示“文件”对话框
GetSaveFileName 显示“保存”对话框
PageSetupDlg 显示“页面设置”对话框
PrintDlg 显示“打印”对话框
ReplaceText
显示“替换”对话框 例如,调用GetOpenFileName显示“OPEN”对话框:
GetOpenFileName(&ofn);
//ofn为OPENFILENAME结构。2023/4/10722.通用对话框应用实例【例7-5】用“打开文件”对话框。2023/4/10732.通用对话框应用实例(续)程序在响应WM_CREATE过程中完成OPENFILENAME结构的初始化,当选择“打开”菜单项时,设置(Flag)为:OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY并调用函数GetOpenFileName显示对话框。当选择“另存为”菜单项时,设置(Flag)为:OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT并调用函数GetSaveFileName显示对话框。2023/4/1074#include<windows.h>#include<commdlg.h>#include<stdio.h>#include<stdlib.h>#include"7-5.h”OPENFILENAMEofn;//定义一个OPENFILENAME结构HINSTANCEhInst;LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);BOOLCALLBACKDlgProc(HWND,UINT,WPARAM,LPARAM);2023/4/1075intWINAPIWinMain(……,……,……,……){HWNDhwnd;MSGMsg;HACCELhAccel;WNDCLASSwndclass;charlpszMenuName[]="Menu";charlpszClassName[]="通用对话框";charlpszTitle[]="通用对话框样例";
wndclass.style=0;
……wndclass.lpszClassName=lpszClassName;
if(!RegisterClass(&wndclass)) {MessageBeep(0);returnFALSE;}hwnd=CreateWindow(……,……,……,……);ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);hInst=hInstance;hAccel=LoadAccelerators(hInst,lpszMenuName);while(GetMessage(&Msg,NULL,0,0)){if(!TranslateAccelerator(hwnd,hAccel,&Msg)){TranslateMessage(&Msg);DispatchMessage(&Msg);}}returnMsg.wParam;}2023/4/1076LRESULTCALLBACKWndProc(……,……,……,……){staticcharszFilter[]="TextFiles(*.TXT)\0*.txt\0"\"AllFiles(*.*)\0*.*\0\0";staticcharlpstrFileName[]="";switch(message){caseWM_CREATE: //初始化对话框结构
ofn.lStructSize =sizeof(OPENFILENAME);ofn.hwndOwner =hwnd;ofn.hInstance =NULL;ofn.lpstrFilter =szFilter;
……ofn.Flags=0;
……ofn.lCustData=0;ofn.lpfnHook=NULL;ofn.lpTemplateName=NULL;break;2023/4/1077caseWM_COMMAND:switch(LOWORD(wParam)){caseIDM_NEW: break;caseIDM_OPEN: //设置“打开”对话框
ofn.lpstrFile=lpstrFileName;
ofn.Flags=OFN_FILEMUSTEXIST| OFN_PATHMUSTEXIST|OFN_HIDEREADONLY;ofn.lpstrTitle="打开";
GetOpenFileName(&ofn);//显示“文件”对话框
caseIDM_SAVEA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玻璃退火工安全宣传能力考核试卷含答案
- 6.4频数与频率 教学设计(2024-2025学年浙教版七年级数学下册)
- 《多彩的生活》教案-2025-2026学年苏少版(新教材)小学美术三年级下册
- 2025年内蒙古自治区公需课学习-绿色信贷政策与实施案例970
- 2026年考研专业课外国文学史
- 内镜清洗消毒消毒剂质量控制
- 2026年及未来5年中国直销银行行业发展监测及投资战略规划研究报告
- 2026年四川希望汽车职业学院单招综合素质考试题库附参考答案详解(预热题)
- 2026年四川化工职业技术学院单招职业技能考试题库完整参考答案详解
- 2026年四川化工职业技术学院单招职业技能考试题库参考答案详解
- 冀教版六年级下册数学全册单元知识小结
- 职业技术学校兽医临床诊疗技术教案
- 公共政策导论全套教学课件
- 渔业资源调查与评估
- 食管癌中医护理方案
- 妇女儿童权益法律知识讲座
- 奥迪A6L使用说明书
- 多联机安装全过程经典技术指导手册
- 智慧供应链管理PPT完整全套教学课件
- 医院课件:《规范医疗服务收费行为培训》
- GB/T 32017-2019水性墨水圆珠笔和笔芯
评论
0/150
提交评论