专栏首页本立2道生Win32对话框程序(1)

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中只包含一个函数

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文件中有这样一段代码:

IDD_MAIN DIALOG DISCARDABLE  0, 0, 187, 98
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "如鹏网 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,8
END

看样子是对话框内容的定义,如对话框大小、各个控件的信息(位置、名称……)、标题、字号等。

由开发环境生成的resource.h文件,如下:

//{{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定义了各控件的信息,至于文件中的其他内容应该也类似。

遗留的问题

源代码的解释,以及函数调用关系、执行过程等       

参考

  1. 如鹏网C语言也能干大事http://rupeng.com/forum/forum-52-1.html
  2. Win32编程入门 http://www.cnblogs.com/whyandinside/archive/2010/08/28/1811584.html
  3. Win32开发http://www.cnblogs.com/whyandinside/archive/2009/09/05/1561082.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 人脸识别损失函数疏理与分析

    两张人脸图像,分别提取特征,通过计算特征向量间的距离(相似度)来判断它们是否来自同一个人。选择与问题背景相契合的度量方式很重要,人脸识别中一般有两种,欧氏距离和...

    李拜六不开鑫
  • 远程桌面MATLAB启动失败问题解决

    远程桌面打开MATLAB会报错,解决办法,打开matlab的licenses路径,如matlab/R2017b/licenses/,路径下存有license文件...

    李拜六不开鑫
  • im2col:将卷积运算转为矩阵相乘

    如何将卷积运算转为矩阵相乘?直接看下面这张图,以下图片来自论文High Performance Convolutional Neural Networks fo...

    李拜六不开鑫
  • python smtplib在linux上发送邮件失败解决方式

    之后放在linux上却 /usr/local/python3/lib/python3.7/socket.py

    陈灬大灬海
  • 学界 | 斯坦福数据科学Phd新课放出阅读清单,你读过哪些?

    大数据文摘
  • 专访携程商旅邱斐:博弈中的大猪如何利用数据驱动业务?

    携程商旅亚太区CMO 邱斐 【数据猿导读】 阿里在企业商旅服务方面的不断加码,给中国商旅市场格局带来了怎样的影响?在大数据时代,商旅管理企业如何利用数据驱动业务...

    数据猿
  • 总结机器学习优质学习文章Top50!

    在过去一年里,我们每个月都会给大家推荐一些优质的、最新的机器学习研究成果或机器学习技术文章,很多文章是从近千篇文章中评选出来的。综合考虑这些文章的更新时间、文章...

    AI科技大本营
  • Java 反射详解

    反射(Reflection)能够让运行于 JVM 中的程序检测和修改运行时的行为。

    Yano_nankai
  • 修复 iPhone X H5 底部安全区域定位按钮下内容穿透 BUG

    今日,开发了一个 h5 项目,其中有部分页面使用了底部按钮,采用的是相对于浏览器窗口定位的样式制作的。

    FungLeo
  • 性能测试篇 :Jmeter监控服务器性能

    jmeter也可以像loadrunner一样监控服务器CPU、内存等性能参数,不过需要安装一些插件

    软件测试君

扫码关注云+社区

领取腾讯云代金券