资源在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篇)
回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定 ...
随机推荐
- SpingBoot的认识和基本使用
认识SpingBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程. -使用springboot以后,搭建一个spring应 ...
- 【转】目标检测之YOLO系列详解
本文逐步介绍YOLO v1~v3的设计历程. YOLOv1基本思想 YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这 ...
- Sticky Fingure安装教程
作者:小离 官方对应Sticky Finger Kali-Pi 的介绍: Sticky Fingers Kali-Pi – The pocket size, finger friendly, lean ...
- poj2488 A Knight's Journey
http://poj.org/problem?id=2488 题目大意:骑士厌倦了一遍又一遍地看到同样的黑白方块,于是决定去旅行. 世界各地.当一个骑士移动时,他走的是“日”字.骑士的世界是他赖以生存 ...
- WPF一步步开发XMPP IM客户端2:主窗体设计
UI设计方案: 在设计窗体UI之前,先要了解一些主要的接口和帮助类: 对于主窗的左侧列表,容器内的Item必须实现ILeftItem的接口,比如联系人.系统消息.群等,接口包含点击事件 public ...
- J05-Java IO流总结五 《 BufferedInputStream和BufferedOutputStream 》
1. 概念简介 BufferedInputStream和BufferedOutputStream是带缓冲区的字节输入输出处理流.它们本身并不具有IO流的读取与写入功能,只是在别的流(节点流或其他处理流 ...
- Seqlist L 与 Seqlist *L的区别
Seqlist L结构体变量,SeqlistInsert之后不可以带回新的插入数据. Seqlist *L 是传结构体指针 用SeqlistInsert之后可以有新的插入.
- R软件常用命令
1.getwd() 获取默认的目录 2.> mydata <- read.csv("1.csv") 读取1.csv文件中的数据,并赋值给一个mydata的对 ...
- R程序包
=== 数据基础操作 ===reshape2 横向.纵向做数据变换,例如把纵向堆叠在数据库中的证券行情数据转换成一个按照不同证券代码横向排列,按照时间纵向排列收盘价的数据表stringr 方便地用正则 ...
- 使用Hive UDF和GeoIP库为Hive加入IP识别功能
Hive是基于Hadoop的数据管理系统,作为分析人员的即时分析工具和ETL等工作的执行引擎,对于如今的大数据管理与分析.处理有着非常大的 意义.GeoIP是一套IP映射数据库,它定时更新,并且提供了 ...






