资源在Windows编程中的应用
学习目的 掌握菜单和对话框资源的创建和使用. 编写程序: 设计一个窗口应用程序, 其中有一个VC菜单, 该菜单下有"显示", "隐藏", "退出"选项; 当选择"显示"选项时, 窗口中显示一个对话框, 在对话框中显示"我们一起来学习VC++"; 当选择"隐藏"按钮时,对话框消失;选择"退出"时, 退出应用程序; 并为该程序加载图标 1.菜单资源设计
在资源中新建一个菜单资源
添加相应的菜单并设置属性 2.对话框资源设计
在资源中新建一个对话框资源
设置对话框属性并添加文字 3.编写菜单响应代码 程序主要代码如下: #include <windows.h> #include "7_9.h"
long WINAPI WndProc(HWND hWnd,UINT iMessage, WPARAM wParam,LPARAM lParam); BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM); //对话框处理函数
HWND hDlg; //定义对话框句柄 HINSTANCE hInst; //定义应用程序实例句柄
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) { MSG Message; //定义消息变量 HWND hWnd; //定义窗口句柄 WNDCLASS WndClass; //定义窗口类 WndClass.cbClsExtra=0; //无窗口类扩展 WndClass.cbWndExtra=0; //无窗口实例扩展 WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));//背景为白色 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); //光标为为箭头 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //采用缺省图标 WndClass.hInstance=hInstance; //当前实例 WndClass.lpfnWndProc=WndProc; //消息处理函数 WndClass.lpszClassName="DlgInstance";//窗口类名称 WndClass.lpszMenuName="Menu"; //定义菜单为Menu WndClass.style=0; //缺省窗口风格
if(!RegisterClass(&WndClass)) //注册窗口. { MessageBeep(0); //注册失败发出警告声. return FALSE; }
hWnd=CreateWindow("DlgInstance", //窗口类名称 "7_9", //标题栏名称 WS_OVERLAPPEDWINDOW, //窗口样式.有标题栏和最大最小化按钮 CW_USEDEFAULT, //窗口左上角坐标 0, CW_USEDEFAULT, //采用自定义的高度和宽度 0, NULL, //无父窗口 NULL, //无菜单 hInstance, //当前应用实例句柄 NULL); //指向传递给窗口的参数的指针
ShowWindow(hWnd,nCmdShow); //显示窗口 UpdateWindow(hWnd); //刷新用户区 hInst=hInstance; //将应用程序句柄传递给全局变量
while(GetMessage(&Message,0,0,0)) { if(!IsDialogMessage(hDlg,&Message)) //若是对话框消息,发往对话框处理函数 { TranslateMessage(&Message); //消息循环 DispatchMessage(&Message); } } return Message.wParam; }
long WINAPI WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) { switch(iMessage) { case WM_CREATE: hDlg=CreateDialog(hInst,"Show",hWnd,(DLGPROC)DlgProc); break; (续前表) case WM_COMMAND: switch(LOWORD(wParam)) { case IDM_SHOW: //hDlg=CreateDialog(hInst,"Show",hWnd,(DLGPROC)DlgProc); ShowWindow(hDlg,SW_SHOW); break; case IDM_HIDE: //DestroyWindow(hDlg); ShowWindow(hDlg,SW_HIDE); break; case IDM_EXIT: DestroyWindow(hDlg); SendMessage(hWnd,WM_DESTROY,0,0); break; } break; case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd,iMessage,wParam,lParam)); } return 0; }
//对话框处理函数 BOOL CALLBACK DlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_INITDIALOG: return 1; } return 0; } 编译并调试程序,程序运行结果见第三部分 4. 为程序加载图标
设计图标并在应用程序中加载 在定义窗口类时加载图标: WndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON)); |
程序运行结果运行结果如下图:
程序运行后点击"菜单",显示菜单项
点击"显示"菜单,显示对话框 |
问题与改进: 1.最初显示与隐藏对话框直接使用: hDlg=CreateDialog(hInst,"Show",hWnd,(DLGPROC)DlgProc); 与 DestroyWindow(hDlg); 创建与销毁对话框以达到对话框的显示与隐藏效果,这样可以达到预期效果; 后面为了提高程序效率,改为在窗口创建时创建对话框,并在"显示"与"隐藏"菜单下使用 ShowWindow(hDlg,SW_SHOW); ShowWindow(hDlg,SW_HIDE); 来直接显示与隐藏对话框。 改进后可以提高对话框的加载速度(对于较大的对话框资源更为有效)并且可以保持对话框的状态,隐藏之后再显示对话框状态不会改变(对于在对话框中的文本框或者选框之类的控件有很重要的意义) 2. 创建图标资源之后要注意使用 WndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON)); 将图标设置为程序图标。 3.注意区别主窗口消息和对话框的消息 if(!IsDialogMessage(hDlg,&Message)) //若是对话框消息,发往对话框处理函数 { TranslateMessage(&Message); //消息循环 DispatchMessage(&Message); } |