zoukankan      html  css  js  c++  java
  • windows资源文件(.rc)是如何变成窗口控件的

        在Visual C++使用资源来创建对话框,菜单,以及一些自定义控件,实际是为了减少基于Win32 SDK编程开发人员在编写Application时创建大量窗口,和控件(实际上也是窗口)的痛苦(大量使用CreateWindow,还要设置其中的参数,有些参数,初始化显示位置X, Y,窗口(或控件)的宽度和高度等,使用CreateWindow来设置非常不直观,只能凭经验来设置合理的位置和大小)。

        如下图所示,倘若我们用编程的方式来实现如下对话框,肯定是可以的但是太麻烦了,这个对话框有好多个控件和资源,如:菜单,组合框,文本输入框,按钮,同时还要设置这些控件自身的若干个性质,还有对话框本身的许多性质,非常麻烦,使用资源这一概念,则大大简化了我们的编程,我们可以使用,可视化的工具,来编辑这些窗口和控件。

    /////////////////////////////////////////////////////////////////////////////

    //

    // Dialog

    //

    MYDIALOG DIALOG DISCARDABLE  0, 0, 200, 126

    STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU

    CAPTION "Dialog"

    MENU IDM_MENU

    FONT 10, "System"

    BEGIN

        DEFPUSHBUTTON   "计算圆的面积",IDOK,133,56,57,14

        EDITTEXT        IDC_EDIT1,54,38,40,14,ES_AUTOHSCROLL

        GROUPBOX        "请输入圆的直径",IDC_STATIC,16,22,111,40

        EDITTEXT        IDC_EDIT2,54,86,40,14,ES_AUTOHSCROLL

        GROUPBOX        "圆的面积:",IDC_STATIC,16,71,110,40

    END

     

     

    /////////////////////////////////////////////////////////////////////////////

    //

    // Menu

    //

    IDM_MENU MENU

    BEGIN

        POPUP "&File"

        BEGIN

            MENUITEM "&Open",                       IDM_FILE_OPEN

            MENUITEM "&New",                        IDM_FILE_NEW

        END

        POPUP "&Edit"

        BEGIN

            MENUITEM "&Cut",                        IDM_EDIT_CUT

            MENUITEM "C&opy",                       IDM_EDIT_COPY

            MENUITEM "&Paste",                      IDM_EDIT_PASTE

        END

        POPUP "&Help"

        BEGIN

            POPUP "&View"

            BEGIN

                MENUITEM "Content1",                    IDM_VIEW_CONTENT1

                MENUITEM "Context2",                    IDM_VIEW_CONTEXT2

            END

        END

    END

        使用Visual C++中自带的资源编辑器实际上就是创建一个资源描述文件(.rc文件)该文件中记录了我们通过可视化工具来创建(实际上只是一个可视化表现而已,正真的窗口和控件的创建是在Application使用该资源时)的窗口和控件的大量参数,这些参数将有操作系统来维护,当我们的Application需要资源时,由操作系统根据这些参数来创建窗口和控件。

        但是有一个问题:这些窗口和控件都是由系统帮我们创建的,所以我们无法直接获得它们的句柄(Handle),这样我们就没有办法使用许多SDK API来和这些窗口及控件来交互(如像:我们打算向上图所示的对话框中的文本输入框发送一条WM_GETTEXT消息来获得当前文本框的内容,这是就需要知道该文本输入框控件的窗口句柄(因为要使用SendMessage函数,该函数的第一个参数就是,目的窗口的句柄)),为了解决这个问题,Windows采用了一种控件ID的策略,控件ID:唯一地标示了一个窗口或控件,它(控件ID)是由我们(Programer)来设置的,这些控件ID,系统当然也是可见的,当系统创建控件时,系统将这些ID和其所对应的窗口的句柄(因为是系统创建的窗口,系统当然应该维护着这些窗口的句柄)一一对应起来,这样当我们的Application需要,某一个控件的句柄时就可以使用,一个约定好的API来通过控件ID来查询其对应的句柄,这个API就是HWND WINAPI GetDlgItem(__in_opt HWND hDlg, __in int nIDDlgItem);这个API的第一个参数,要求我们传入,我们所要查询的控件属于哪一个窗口实际上就是父窗口(常常是对话框)句柄,想一下该句柄如何得来,狠简单啊,少年,我们在使用对话框的时候,肯定注册了对话框窗口过程

    INT_PTR WINAPI DialogBox(

      __in_opt  HINSTANCE hInstance,

      __in      LPCTSTR lpTemplate,

      __in_opt  HWND hWndParent,

      __in_opt  DLGPROC lpDialogFunc

    );

    注意第四个参数,实际上就是对话框窗口过程

    INT_PTR CALLBACK DialogProc(

      __in  HWND hwndDlg,

      __in  UINT uMsg,

      __in  WPARAM wParam,

      __in  LPARAM lParam

    );

    注意第一个参数,这就是对话框的句柄啊,所以,可以在处理WM_COMMAND等消息的时候可以直接使用它

    ,以及要查询的控件ID,就可以得到该控件的句柄了,这样就可以调用大量的API函数来和控件进行交互了!!!!!

     

    另一个API

    int WINAPI GetDlgCtrlID(

      __in  HWND hwndCtl

    );不用说了吧,看MSDN,在加上前面的论述,自然会用了。

  • 相关阅读:
    SQL: 返回刚插入记录的ID 及 output 更新记录时得到更新记录的ID值 .
    asp.net 用伪静态修改webconfig配置文件 .
    Asp.Net : 捕捉和记录网站中出现的所有未处理错误,抛出详细的页面来源和访问ip,调用的接口方法及异常实例(记事本日志,系统日志及数据库日志)
    js闭包(转载) (jquery ajax 异步 多循环运用 )
    c# enum 枚举名称和ID 互换获取.................
    WCF :服务开发与调用的完整示例
    关于DataSet 、 DataTable 、 ArrayList 、 IList 、Array
    Expression Tree不完全入门
    WF4 Beta2:IExecutionProperty的使用
    Groovy 1.8.9, 2.0.7 和 2.1.1 发布
  • 原文地址:https://www.cnblogs.com/a-ray-of-sunshine/p/3416065.html
Copyright © 2011-2022 走看看