控件类与控件资源到底是一种什么样的关系?
我在资源中添加了一个按钮控件是否说明在程序中其实是分配了一个按钮类的空间。在添加一个控件之后可以利用DDX_Control(pDX, IDC_BUTTTON1, m_button)将控件资源与一个控件对象想关联,这个关联过程的实质是什么呢?在不关联资源与对象的情况下我们仍然可以通过CButton *pButton = (CButton*)GetDlgItem(IDC_BUTTON1);来获取该控件资源的指针?

解决方案 »

  1.   

    DDX绑定的过程,就是把HWND与CWnd对象绑定了,由CWnd对象控制其行为,响应其消息,这个对象一直存在,除非你显式的消毁。
    GetDlgItem可以得到临时的CWnd对象,来控制其行为。用完后这个临时的对象就释放了。
    其实就是生存期的问题,DDX绑定的,你必须显式消毁,或父对象不存在了,他才消毁。
    而GetDlgItem得到临时的对象,函数执行完了,自然就消毁了。
      

  2.   

    以下是我的理解,欢迎高人斧正.1, 控件类与控件资源没有必然关系。
        你可以添加一个控件资源,而没有必要非要使用控件类。    比如你可以在对话框中添加一个 COMBOBOX 控件。用下面的方法向列表中添加一个文本。
        ::SendMessage (hWndCombo, CB_ADDSTRING, 0, (LPARAM)(LPSTR)_T("string"));    你还可以这样取出COMBOBOX控件当前选择项的文本。
        int nSel = -1;
        if (CB_ERR != (nSel = ::SendMessage (hWndCombo, CB_GETCURSL,0,0)))
            ::SendMessage (hWndCombo, CB_GETLBTEXT, nSel, (LPARAM)szBuffer);
    2, 你在资源中添加一个按钮,如果使用MFC,则会产生一个按钮类的实例,并且分配存储空间。3, 关联的实质就是消息传递,就象在1中说明的那样。DDX 实现了1中类似的情况。4, DDX 关联只影响到你关联的变量, 与GetDlgItem 没有关系。不知道这样解释你能明白吗
      

  3.   


    有点不明白呢,你说GetDlgItem可以得到临时的CWnd对象是什么意思?用GetDlgItem函数得到是一个指针的嘛,你的意思是这个指针指向的是一个临时变量?按照3楼的意思添加一个按钮控件是分配了内存的
      

  4.   

    控件类与控件资源到底是一种什么样的关系?
    =========================
    控件是系统提供的一种内置的窗口类,而控件类只是MFC对它的一种封装。我在资源中添加了一个按钮控件是否说明在程序中其实是分配了一个按钮类的空间。在添加一个控件之后可以利用DDX_Control(pDX, IDC_BUTTTON1, m_button)将控件资源与一个控件对象想关联,这个关联过程的实质是什么呢?
    ============================
    对话框在创建的过程中会根据你提供的对话框资源模板生成相应的控件,所以在资源中加了一个控件,在运行过程中才会动态生成相关的控件,至于内部是不是会产生按钮类,我觉得MFC应该是会这样的。至于DDX_Control(pDX, IDC_BUTTTON1, m_button)关联变量只不过是将HWND句柄与CWnd对象绑定在一起而已,当然其中也做了一些别的工作,我觉得不用细究。在不关联资源与对象的情况下我们仍然可以通过CButton *pButton = (CButton*)GetDlgItem(IDC_BUTTON1);来获取该控件资源的指针?
    =============、
    这个当然可以啊!你可以将GetDlgItem也理解为是一个将HWND句柄与CButton绑定的过程。
      

  5.   


    按钮并不归它的父窗口“所有”,实际上它是进程级别的。在系统看来,它和它的父窗口是没有区别的,系统定义出它们的父子关系,只是为了使消息传递的路径更清晰。WINDOWS 并不是依靠CDialog, CButton, CComboBox,...类来维持一个窗口程序的运作。而是依靠它定义的一系列消息。即使没有MFC,WINDOWS程序照样会运行得很好。MFC 将WINDOWS API 用C++的方式进行了封装。在窗口初始化的时候,系统会根据资源文件中的资源信息创建父窗口和它的子控件。这些子控件对象和它的父窗口对象一样,保存在进程的地址空间中。默认的,无论父窗口还是它的子控件,系统都提供了默认的处理方法。你可以根据你的需要将你的代码“插入”到系统处理的间隙中,这就是WINDOWS编程。当你使用 MFC 将你的代码 “插入” 到系统处理的间隙中时,你可能会有处理按钮的需求。这时候你可能会想到用DDX定义一个CONTROL类型来关联到由系统生成的Button上。如果你没有这个需求,就不需要用DDX来关联一个按钮了。系统会用它自已的方法来维护Button的运作。我只是奇怪,你为什么会觉得父类中非得要用按钮的实例呢?它只是一个C++类而已。只是程序了解CButton是干什么的,系统根本就不知道CButton是什么东东。
      

  6.   

    还有一点必须要明确,CButton 是一个C++ 类。 可以这样定义一个CButton的实例。
    CButton m_btn;m_btn 是CButton 的实例,只是一个C++类的实例, m_btn 在运行时已经被分配了内存,但它和按钮是没有任何关系的。只有当m_btn.m_hWnd 指向进程中一个子窗口地址时,这个实例才有意义,整个CButton类的操作几乎都是围绕着这个m_hWnd进行的。也就是说即使没有m_btn, 子窗口也是存在的,并且由系统维护。
      

  7.   

    就临时的对象指针,你跟踪会发现是CTempWnd
      

  8.   

    我对windows编程的东西不了解啊,听了各位大牛的解释 好像稍微有点明白了哈哈.
    是不是这样一个理啊:
    (1)我们在资源里面添加的控件其实是纯windows编程的东西,而CButton这类是MFC的东西,这两个东西本来是没有联系在一起的,而我们通过一个DDX_Control(pDX, IDC_BUTTTON1, m_button)操作的话就是为了将两者联系起来,便于我们以MFC的形式操作。
    (2)其实Button这类MFC的东西在进行动态创建的时候,看上去没有和资源联系起来,实质在调用creat函数的时候是和资源联系起来了的,只是没有明确的展示给我们看而已因此,一个纯MFC控件类是没有任何意义的,当他和相关的资源联系起来以后才变的有意义,不知道我们说的对不对啊
      

  9.   

    每一个控件就是一个特殊的数据结构struct,针对这个数据结构struct,预先定义了一系列的操作。于是,一个class就诞生了。