资源在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); } |
资源在Windows编程中的应用的更多相关文章
- 资源在windows编程中的应用----菜单
资源在Windows编程中的应用 资源 加速键.位图.光标.对话框.菜单.字符串.工具条 1.菜单的创建 菜单由以下组成部分: (1)窗口主菜单条 (2)下拉式菜单框 (3)菜单项热键标识 (4)菜单 ...
- 第七章 资源在Windows编程中的应用 P157 7-8
资源在基于SDK的程序设计中的应用实验 一.实验目的 1.掌握各种资源的应用及资源应用的程序设计方法. 二.实验内容及步骤 实验任务 1.熟悉菜单资源的创建过程: 2.熟悉位图资源的创建: 3.熟 ...
- Windows编程中的若干难点 - Windows程序设计(SDK)007
Windows编程中的若干难点 让编程改变世界 Change the world by program 一个窗口的生与死 我记得有童鞋会问:如果我的程序需要在关闭前让用户判断是否确定要关闭窗口,我应该 ...
- windows编程中的数据类型
在windows编程中,有许多奇怪的数据类型,初学者不知道这些代表什么,下面就把一些数据类型列出如下: ATOM 原子(原子表中的一个字符串的参考) BOOL 布尔变量 BOOLEAN 布尔变量 BY ...
- Windows编程中UNICODE和_UNICODE定义问题
Windows编程中UNICODE和_UNICODE定义问题 先转一篇文章: 初学Windows SDK编程时碰到过这个问题,相信很多初学Windows编程的人也都碰到过,后来慢慢搞明白些了,但有时别 ...
- Windows 编程中恼人的各种字符以及字符指针类型
在Windows编程中,很容易见到这些数据类型:LPSTR,LPTSTR,LPCTSTR... 像很多童鞋一样,当初在学Windows编程的时候,对着些数据类型真的是丈二和尚,摸不着头脑,长时间不用就 ...
- Windows编程中char*转LPCWSTR解决的方法总结
Windows编程中常常涉及到的一个问题是字符串之间的转换,开发过程总是遇到编译器提示无法格式转换的问题.于是自己总结了几种解决的方法. 1.通过T2W转换宏 char* szStr = " ...
- Windows编程中各种操作文件的方法
windows编程中文件操作有以下几种常见方法:1.C语言中文件操作.2.C++语言中的文件操作.3.Win32 API函数文件操作.4.MFC CFile类文件操作.5.MFC CFileDialo ...
- Windows编程中回调函数的使用心得(MFC篇)
回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定 ...
随机推荐
- keepalive 原理讲解
keepalive 我们说到keepalive的时候,需要先明确一点,这个keepalive说的是tcp的还是http的. tcp的keepalive是侧重在保持客户端和服务端的连接,一方会不定期发送 ...
- jzoj5805
#include<bits/stdc++.h> using namespace std; int x,n,pp,ct[10000]; long double f[210][(1<&l ...
- Union Find-547. Friend Circles
There are N students in a class. Some of them are friends, while some are not. Their friendship is t ...
- 【zookeeper】Apache curator的使用及zk分布式锁实现
上篇,本篇主要讲Apache开源的curator的使用,有了curator,利用Java对zookeeper的操作变得极度便捷. 其实在学之前我也有个疑虑,我为啥要学curator,撇开涨薪这些外在的 ...
- Flask从入门到精通之flask扩展
Flask被设计成可扩展形式,因此并没有提供一些重要的功能,比如数据库和用户认证,所以开发者可以自由选择最适合程序的包,或者按需求自行开发.社区成员开发了大量不同用途的扩展,如果这还不能满足需求,你还 ...
- Centos出现-bash: unzip: command not found的解决办法
利用unzip命令解压缩的时候,出现-bash: unzip: command not found的错误. unzip——命令没有找到,其原因肯定是没有安装unzip. 利用一句命令就可以解决了. ...
- struts+spring+hibernate两张表字段名一样处理方法
在利用struts2+spring+hibernate(利用Hibernate进行分页查询)三大框架进行开发项目的时候,出现一个问题:居然要进行关联查询的十几张表中有两张表的字段一样,并且这两张表中的 ...
- 【BZOJ3456】轩辕朗的城市规划 EGF+多项式求ln
我们构造$f(i)$和$g(i)$. 其中$f(x)$表示由$x$个节点构成的无向简单连通图的个数. $g(x)$表示有$x$个节点构成的无向简单图(不要求连通)的个数. 显然,由$x$个节点构成的无 ...
- Docker容器(三)
一.创建容器 容器是Docker另一个核心的概念,简单来说,容器是镜像的一个运行实例,所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层 1.1. 新建容器 使用docker crea ...
- 一元运算符 +,可用于将变量转换为数字;如果变量不能转换,它仍然会是一个数字,但值为 NaN (不是一个数字)
一元运算符,可用于将变量转换为数字: var y = "5"; var x = + y; console.log(typeof y);//string 类型 console.log ...






