资源在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篇)
回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定 ...
随机推荐
- Redis的快照
博客链接:http://www.cnblogs.com/zhenghongxin/p/8669913.html redis 本地持久化到硬盘有两种方式,一是快照(snapshotting),二是只追加 ...
- flask之flask_sqlalchemy
一. 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL ...
- 使用Navicat 创建mysql存储过程,实现日期加流水号序列
目的:使用Navicat 创建mysql存储过程,实现格式为8位日期(年月日)+5位流水号序列. 步骤: 1.打开Navicat 登录数据库,点击导航栏上的函数,如下图: 2.点击新建函数,选择“过程 ...
- javascript浅拷贝深拷贝理解记录
javascript的深拷贝和浅拷贝问题几乎是面试必问的问题.好记性不如烂笔头,特此来记录一下自己对深拷贝浅拷贝的理解. 顾名思义,拷贝就是copy复制,在js中可以浅而理解为对一个对象或者数组的复制 ...
- jsp页面,jstl标签中的数据在<%%>java中使用
可参考jsp的API隐式对象.. 这部分数据其实被保存在page域中,但jsp中如果使用java代码需要在特定的标签中<%%>,在这个标签中可使用的只有pageContext对象,所以可以 ...
- 前端小例子 基础js css html练习
前情提要: 学前端也有一阵了,个人感觉前端还是重要的. html 学习教程 https://www.cnblogs.com/baili-luoyun/p/10466040.html css 教程 js ...
- Python初体验(一)—【配置环境变量】【变量】【input】【条件语句】【循环语句】
写在前面的: 作为一个控制专业的女研究生,不知道每天在研究什么,但总归逃脱不了码代码的命运.之前也学习过一些C语言.C++,基础嘛,稍稍微有一些.本不想走上码农的道路,天真烂漫的过此生(白日梦过程中. ...
- 【lintcode】834. Remove Duplicate Letters
题目描述: Given a string which contains only lowercase letters, remove duplicate letters so that every l ...
- POJ 2247
#include<iostream> #include<algorithm> #include<vector> #include<string> #in ...
- 第6章—渲染web视图—使用Apache Tiles视图定义布局
使用Apache Tiles视图定义布局 Tiles是一个免费的开源模板Java应用程序的框架.基于复合模式简化的用户界面的构建.对于复杂的网站仍是最简单.最优雅的方式与任何MVC技术一起工作.S ...