Win32对话框程序(1)
之前学C语言是一直都是在控制台下面操作的,面对的都是黑框框,严重的打击了学习的兴趣。后来在TC下进行C语言课程设计,做了图形界面编程,但都是点线面画的……
中间隔了好长一段时间没有碰过C语言,最近才开始往起捡,找到了如鹏网的《C语言也能干大事》教程,惊喜的发现上手即是对话框程序,想坚持学下来,奈何老师对涉及原理的地方有所略过,对我这个喜欢刨根问底凡事都想问个“问什么”的人来说,用着一个自己不了解的东西那真是“浑身难受”,所以就想一边学着课程一边自己一探究竟(至少要心里有底)~
*************************我是正文分割线***************************
在“干大事”中,杨中科老师提供了对话框程序创建的向导http://rupeng.com/forum/thread-8798-1-1.html,只需按其一步步操作即可在file→new中创建Win32 DialogBased Application,并在视频中演示了其在VS2008中手动创建的过程。
我动手实践了一下 ,现将过程、体会以及疑问记录如下。
对话框程序结构
在VC6.0中,使用向导创建对话框程序后,文件视图中包含
|
Source Files |
Header Files |
Resource Files |
|
Main.cpp |
MainDlg.h |
icon1.ico |
|
MainDlg.cpp |
resource.h |
|
|
resource.rc |
StdAfx.h |
|
|
StdAfx.cpp |
Main.cpp中只包含一个函数
|
1
2
3
4
5
6
7
8
9
10
|
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ //Enable IPAddress、Calendar.etc InitCommonControls(); DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, Main_Proc); return 0;} |
MainDlg.cpp中包含四个函数:
|
函数名 |
参数 |
函数体主要内容 |
|
Main_Proc |
(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
switch(uMsg),HANDLE_MSG |
|
Main_OnInitDialog |
(HWND hwnd, HWND hwndFocus, LPARAM lParam) |
return |
|
Main_OnCommand |
(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) |
switch(ID),case |
|
Main_OnClose |
(HWND hwnd) |
EndDialog |
/*****
*因为并不清楚这些函数在干什么,我查阅了相关资料并总结,忽略了一些目前看来不需要了解的细节,需要了解时再去参考中查看。
*****/
Win32是如何运行的
Win32程序是基于消息的(message
based)、事件驱动的(event
driven)。当win32程序运行时,程序不断检测外部的触发(比如单击按钮、输入等),即是否发生事件,这些“输入”由操作系统捕捉后,以消息的形式进入程序中,然后根据不同的触发进行不同的处理。因此Win32程序只需完成三件事:
1.
定义窗口外观
2.
定义不同事件发生时程序如何处理(定义窗口处理函数)
3.
不断检测是否有新事件发生,并将其交给相应的处理函数处理
main函数是一般C程序的入口,WinMain是Windows程序的入口。当用户执行一个程序时,操作系统为程序分配地址空间,并加载程序,调用入口函数执行程序。
/*****
*其他内容,如程序如何运行的细节以及消息的处理机制等,就不列写在此了(我也没仔细看@_@),可参看“参考”或检索其他资料
*****/
Win32程序:资源和源代码
此外,在VC6.0中可见资源视图(ResourcceView)以及文件视图(FileView),文件视图下是源代码文件,据http://msdn.microsoft.com/zh-cn/library/7zxb70x7.aspx, 资源文件包括
1.
程序的资源脚本 (.rc) 文件
2.
资源模板 (.rct) 文件
3.
作为独立文件存在的个别资源如从 .rc 文件引用的位图、图标或光标文件
4.
由开发环境生成的头文件(如 Resource.h),它从 .rc 文件中引用
在VC6.0中默认没有.rc文件,需自己手动添加http://msdn.microsoft.com/zh-cn/library/vstudio/sxdy04be(v=vs.80).aspx
可见,Winows程序分为源程序和资源两部分。源程序经由C/C++编译器生成.obj文件;资源部分经由RC编译器,读取RC文件的描述后,将所有资源文件集中制作出一个.res文件,.res文件与.obj文件结合在一起,集成为一个完整的.exe可执行文件,该文件才是一个完整的Windows应用程序,流程图如下:

应用源程序编译链接生成可执行文件之后,会在项目文件夹下生成一个Debug/Release文件夹,在该文件夹下面可以找到.obj文件、.exe文件等,.def文件指示连接程序如何产生最终的可执行文件。
各个文件里的内容
比如这样一个计算圆面积的对话框程序,其ID为IDD_MAIN:

先看与资源相关的文件,resource.rc文件中有这样一段代码:
|
1
2
3
4
5
6
7
8
9
10
11
|
IDD_MAIN DIALOG DISCARDABLE 0, 0, 187, 98STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENUCAPTION "如鹏网 www.RuPeng.com 大学生计算机学习社区"FONT 10, "System"BEGIN DEFPUSHBUTTON "确定",IDC_OK,7,77,50,14 EDITTEXT IDC_EDITR,50,16,40,14,ES_AUTOHSCROLL EDITTEXT IDC_EDITS,49,37,40,14,ES_AUTOHSCROLL LTEXT "半径",IDC_STATIC,21,18,17,8 LTEXT "面积",IDC_STATIC,22,39,17,8END |
看样子是对话框内容的定义,如对话框大小、各个控件的信息(位置、名称……)、标题、字号等。
由开发环境生成的resource.h文件,如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//{{NO_DEPENDENCIES}}// Microsoft Developer Studio generated include file.// Used by resource.rc//#define IDD_MAIN 101#define IDR_DEFAULT1 103#define IDC_OK 1000#define IDC_EDITR 1004#define IDC_EDITS 1005// Next default values for new objects// #ifdef APSTUDIO_INVOKED#ifndef APSTUDIO_READONLY_SYMBOLS#define _APS_NEXT_RESOURCE_VALUE 104#define _APS_NEXT_COMMAND_VALUE 40001#define _APS_NEXT_CONTROL_VALUE 1006#define _APS_NEXT_SYMED_VALUE 101#endif#endif |
按照MSDN上的说法,上面的整数是“an integer value that specifies the resource identifier of the dialog box template”,而如IDD_OK等是各个控件的ID,IDD_MAIN是对话框的ID。下面的_APS的还不清楚是什么。
所以,resource.h中定义了对话框各个控件的唯一标记号,resource.rc定义了各控件的信息,至于文件中的其他内容应该也类似。
遗留的问题
源代码的解释,以及函数调用关系、执行过程等
参考
如鹏网C语言也能干大事http://rupeng.com/forum/forum-52-1.html
Win32编程入门 http://www.cnblogs.com/whyandinside/archive/2010/08/28/1811584.html
Win32开发http://www.cnblogs.com/whyandinside/archive/2009/09/05/1561082.html
Win32对话框程序(1)的更多相关文章
- Win32对话框程序(2)
接着Win32对话框程序(1)来写 ,解决遗留的问题,即理解函数及其调用关系.文章中有些地方是自己的推断,因此肯定有叙述不准确甚至错误的地方,请指正,感谢~ ********************* ...
- 如何让win32对话框居中显示
在编写win32对话框程序,如果是用visual studio建的win32对话框程序,默认是不居中显示的,about 对话框也是这样的,用资源编辑器打开,可以在属性里面设置居中center 为tur ...
- (转载)用VS2012或VS2013在win7下编写的程序在XP下运行就出现“不是有效的win32应用程序“
原文地址:http://www.vcerror.com/?p=1483 问题描述: 用VC2013编译了一个程序,在Windows 8.Windows 7(64位.32位)下都能正常运行.但在Win ...
- 给Win32 GUI程序增加控制台窗口的方法
给Win32 GUI程序增加控制台窗口的方法 2008年10月11日 星期六 下午 04:43 在Win32的GUI程序中,没有控制台窗口,我们输出调试信息时有些不方便,以往我的做法是使用Messag ...
- java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。
JNA 调用 dll 库时,保错: ///////////////// 通过 JNA 引入 DLL 库 //////////// /** * ID_FprCap.dll 负责指纹的采集, 指纹仪的初始 ...
- VC++ 对话框程序响应键盘消息的处理方法的说明(非常重要)
基于MFC对话框的应用程序在响应按键消息和热键方面都力不从心,CDialog类的消息循环中去掉了TranslateAccelerator函数,因此不能响应热键:同时由于对话框上可能有很多控件,且默认情 ...
- python ImportError: DLL load failed: %1 不是有效的 Win32 应用程序
导入的时候报出了 ImportError 在windows上安装python 的模块后,导入模块时报 python ImportError: DLL load failed: %1 不是有效的 Win ...
- 【转】WIN32 控制台程序
http://blog.csdn.net/houmin0036/article/details/7702236 win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运行的应用 ...
- 【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”
原文网址:http://www.cnblogs.com/Dageking/archive/2013/05/15/3079394.html VS2012编译出来的程序,在XP上运行,出现“.exe 不是 ...
随机推荐
- OpenGL执行渲染图片的主要操作步骤
一个用来执行图形渲染的OpenGL程序的主要步骤包括: 1.从OpenGL的几何图元中设置数据,用于构建形状: 2.使用不用的着色器(shader)对输入的图元数据进行进行计算,判断它们的位置.颜色以 ...
- laravel 5.4中手动创建分页
这里是参考的的链接https://blog.csdn.net/hxx_yang/article/details/51753134 use Illuminate\Pagination\LengthAwa ...
- MIP 脚本域名地址变更公告
尊敬的 MIP 开发者: MIP 团队为了解决 MIP-Cache 页面下 cookie 相互覆盖问题,增强站点品牌露出,在 2017 年 8 月将 MIP 的脚本域名和 MIP-Cache 页面域名 ...
- 【转】超酷的 mip-infinitescroll 无限滚动(无限下拉)
写在前面 无限滚动技术(又叫做无限下拉技术)被广泛应用于新闻类,图片预览类网站.对用户来讲,使用无限滚动的页面有源源不断的信息可以预览,增加用户在页面的停留时长.技术上原理也很简单,在页面加载时加载一 ...
- eShopOnContainers 知多少[6]:持久化事件日志
1. 引言 事件总线解决了微服务间如何基于集成事件进行异步通信的问题.然而只有事件总线正常运行,微服务之间基于事件的通信才得以运转. 而现实情况是,总有这样或那样的问题,导致事件总线不稳定或不可用,比 ...
- 我不是bug神(JVM问题排查)
Story background 回望2018年12月,这也许是程序员们日夜不得安宁的日子,皆因各种前线的系统使用者都需要冲业绩等原因,往往在这个时候会向系统同时写入海量的数据,当我们的应用或者数据库 ...
- nginx漏洞分析与升级修复
一 .此次漏洞分析 1 nginx HTTP/2漏洞 [nginx-announce] nginx安全公告(CVE-2018-16843,CVE-2018-16844)在nginx HTTP / 2实 ...
- JQuery --- 第一期 (初识jQuery, JQuery核心函数和工具方法)
个人学习笔记 初识jQuery 1.我的第一个JQuery <!DOCTYPE html> <html lang="en"> <head> & ...
- Web前端-Vue.js必备框架(五)
Web前端-Vue.js必备框架(五) 页面组件,商品列表组件,详情组件,购物车清单组件,结算页组件,订单详情组件,订单列表组件. vue-router 路由 vuex 组件集中管理 webpack ...
- GDAL读取的坐标起点在像素左上角还是像素中心?
目录 1. 问题 2. 结论 3. 例外 1. 问题 笔者在处理地理栅格数据的时候,总是会发生偏差半个像素的问题. 比如说通过ArcMap打开一张.tif,查看其地理信息:同时用记事本打开.tfw,比 ...