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程序的入口。当用户执行一个程序时,操作系统为程序分配地址空间,并加载程序,调用入口函数执行程序。

/*****
*其他内容,如程序如何运行的细节以及消息的处理机制等,就不列写在此了(我也没仔细看@[email protected]),可参看“参考”或检索其他资料
*****/

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, 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文件,如下:


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

遗留的问题

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

参考

  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
时间: 2024-07-30 13:50:41

Win32对话框程序(1)的相关文章

Win32对话框程序(2)

接着Win32对话框程序(1)来写 ,解决遗留的问题,即理解函数及其调用关系.文章中有些地方是自己的推断,因此肯定有叙述不准确甚至错误的地方,请指正,感谢~ *******************************正文分割************************************ WinMain函数 Win32对话框程序(1)中说了WinMain是应用程序的入口,其输入参数有四个,根据MSDN上的叙述: 输入变量声明 说明 HINSTANCE    hInstance 此应用

Creating Dialogbased Win32 Application (4) / 创建基于对话框的Win32应用程序(四)Edit Control的应用、Unicode转ANSI、自动滚动 / Win32, VC++, Windows

创建基于对话框的Win32应用程序(四)——Edit Control的应用.Unicode转ANSI.自动滚动 之前的介绍中,我们用到了Button.Static Text.Checkbox这三个控件.这一节中我们将学习使用Edit Control(编辑框)控件,其中还包括Unicode转ANSI的方法.文本框自动滚动的功能等. 24.首先切换到Reasource View(Ctrl+Shift+E),找到待修改的主窗体,并从Toolbox(Ctrl+Atl+X)中添加Edit Control控

Creating Dialogbased Win32 Application (1) / 创建基于对话框的Win32应用程序(一)新建窗体 / Win32, VC++, Windows

创建基于对话框的Win32应用程序(一) —— 新建窗体 1.新建一个Visual C++的Empty Project.  2.在Solution Explorer中右键Add New Item,添加 .cpp 文件,并提供Win32应用程序的入口点函数.  3.在Solution Explorer或 Resources View 中右键Add Resource,选择Dialog.并在修改相关内容. 4.切换到 .cpp文件中,创建回调函数(Dlg_Proc),并在入口点函数中调用DialogB

Creating Dialogbased Win32 Application (2) / 创建基于对话框的Win32应用程序(二)Button的应用、新建子窗体 / Win32, VC++, Windows

创建基于对话框的Win32应用程序(二) —— Button的应用.新建子窗体 可以发现上一节创建的窗体中,点击OK和Cancel两个按钮是没有任何反应的.现在我们来为他们添加退出对话框的功能. 6.首先定义宏替换如下: 7.再在回调函数(Dlg_Proc)中调用响应消息的函数(Dlg_OnCommand)如下: 8.由于HANDLE_WM_COMMAND是在windowsx.h头文件中定义的,故添加其引用. 9.接下来定义刚才调用的消息响应函数(Dlg_OnCommand)如下: 其中IDOK

【mfc】基本对话框程序——加法器

都说好了是vc6的mfc,这个加法器当然不同于数电与单片机的加法器,^_^开个玩笑, 正式转入正题, 前两篇mfc,甚至连mfc都不是,仅仅是win32程序,都只不过是一个普通的弹窗程序而已, 这次继续为大家带来的简单的win32程序, 不过已经有基本功能了,能够实现两个编辑框里面的数据相加. 一.基本目标 创建如下程序: 有两个系统自带的按钮,原为"确定"与"取消",现在改为"计算"与"关闭" "计算"按

【mfc】对于对话框程序的优化与为程序创建图表

本文是继上一篇<[mfc]Helloworld>(点击打开链接)所写出来的对话框进行了的优化, 这次要把这个对话框程序做得更加好. 一.基本目标 1.为这个对话框程序加上自己的图标,如下图: 2.不再是仅有一个让用户点击的对话框了,而且在用户点击确定与取消按钮之后能够进行判断 比如,用户点击了确定,则弹出用户点击了确定的提示 如果用户点击了取消,则弹出用户点击取消的提示 二.制作过程 1.首先像<[mfc]Helloworld>(点击打开链接)中,先新建一个简单的Win32工程,然

用VS2012或VS2013在win7下编写的程序在XP下运行就出现“不是有效的win32应用程序

解决方法1: 链接器->系统->子系统->控制台或windows?后面的"最低版本"是5.01 解决办法2: 解决"不是有效的win32应用程序"问题 帅宏军 用VC2013编译了一个程序,在Windows 8.Windows 7(64位.32位)下都能正常运行.但在Win XP,Win2003下运行时,却报错不能运行,具体错误信息为"指定的可执行文件不是有效的 Win32 应用程序". ? ? ? ? ?一.问题分析 ? ?

%1不是有效的 win32应用程序(64位转换32位)

phpmyadmin打开时候显示 HTTP500内部服务器错误,用火狐浏览器显示的是%1不是有效的 win32应用程序.谷歌一下,终于找出问题,原来是windows2003 64位的操作系统和32位IIS的问题..最终找到解决方法如下: 要运行 32 位版本的 ASP.NET 2.0,请按照以下步骤操作:1. 单击"开始",单击"运行",键入 cmd,然后单击"确定". 2. 键入以下命令启用 32 位模式: cscript %SYSTEMDRI

ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。

from matplotlib import pyplot as pltfrom sklearn.datasets import load_irisimport numpy as np data=load_iris()feature_names=data['featrue_names']target=data['target']for t.marker,c in zip(xrange(3),">ox","rgb"):    plt.scatter(featur