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

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

     

    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文件指示连接程序如何产生最终的可执行文件。

    各个文件里的内容

    比如这样一个计算圆面积的对话框程序,其IDIDD_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



  • 相关阅读:
    [面试没答上的问题1]http请求,请求头和响应头都有什么信息?
    模拟进度条发现的彩蛋
    实现JavaScript forEach
    JavaScript实现动画效果
    Contents Of My Blogs
    阅读笔记-拍出好照片的30个构图基本功
    阅读笔记-李鸿章传
    阅读笔记-人性的弱点
    阅读笔记-XWord:未来进化
    阅读笔记-活法
  • 原文地址:https://www.cnblogs.com/shine-lee/p/3967097.html
Copyright © 2011-2022 走看看