新手问一个困扰很久很简单但是可能需要很长的解释的问题
1.我在对话框设计期加入的控件为何在该对话框类中没有显示为成员呢?
2.比如我加入了两个单选按钮(在一个group内),也把第一个选上了group属性。我想把它初始化选择第二个,我知道了两种方法:a通过classwizard添加(关联)一个int型变量,在构造函数里设置其为1,ok了。为何在CTDlg::OnInitDialog()里就不行呢?b通过classwizard添加(关联)一个button型类变量mm,在CTDlg::OnInitDialog()通过mm.setcheck(1)ok了,在构造函数里就运行出错。(是不是当时该类还未建立)
3.总结以上问题,我不明白的就是为何加入的控件不显示为类成员,比如与delphi一样,按道理应该是他的成员的啊?还有就是关联一个int或者别的类型的变量究竟是个什么原理呢?
最好可以提供详细的解释或者相关连接,谢谢!
谢谢您对初学者的帮助!感谢!

解决方案 »

  1.   

    构造函数里运行失败,是因为此时窗口尚未建立。可以在OnInitDialog函数里添加:((CButton*)GetDlgItem(IDC_CHECK1))->SetCheck(true);
      

  2.   

    你只是增加了一个资源ID,可以在ClassWizard中添加相应成员变量
      

  3.   

    同意楼上
    在VC里,对话框设计期加入的控件只是在.rc文件添加了一个资源ID,该ID和控件是关联的,但ID毕竟只是标识,不能直接通过ID修改属性,但可以通过获取ID关联控件去修改相应的属性,如bohut(●伯虎● /*等待小生命的降临*/) 的((CButton*)GetDlgItem(IDC_CHECK1))->SetCheck(true);//这里的IDC_CHECK1就是你添加控件时生成的ID
      

  4.   

    BOOL CTDlg::OnInitDialog()
    {
    ....
    m_iCheck = 1;
    UpdateData(FALSE):
    }
      

  5.   

    “a通过classwizard添加(关联)一个int型变量,在构造函数里设置其为1”
    这里必须调用UpdateData(FALSE);
      

  6.   

    个人认为:
    1.我在对话框设计期加入的控件为何在该对话框类中没有显示为成员呢?
    实际上已经添加为成员了,只是成员不是以显示的变量出现,而是以一个资源ID出现2.比如我加入了两个单选按钮(在一个group内),也把第一个选上了group属性。我想把它初始化选择第二个,我知道了两种方法:a通过classwizard添加(关联)一个int型变量,在构造函数里设置其为1,ok了。为何在CTDlg::OnInitDialog()里就不行呢?b通过classwizard添加(关联)一个button型类变量mm,在CTDlg::OnInitDialog()通过mm.setcheck(1)ok了,在构造函数里就运行出错。(是不是当时该类还未建立)
    a,int变量是对话框类的一个成员,该成员和控件是不同的类型,所以int和控件的映射实际只是控件的某个属性的映射,所以int变量赋值相当于在控件的某个属性赋值(跟设计期改变控件属性是等效的)。我认为在OnInitDialog里,用这种赋值方式也可以改变控件属性的,只是这时因为对话框已经表示出来了(也就是已经被画到桌面上了),必须调用重画函数,刷新一下对话框才能显示吧,你可以去试试看
    b.button型类变量mm是对话框类的一个成员,该成员和控件做了映射,访问该变量就相当于访问控件,而在构造函数时,对话框还没有被创建,相应的成员也还没有被创建,所以这时候访问就会出错。而OnInitDialog是对话框创建完之后用户所做的一些初始化处理,所以这时候访问该控件就没问题了。3.总结以上问题,我不明白的就是为何加入的控件不显示为类成员,比如与delphi一样,按道理应该是他的成员的啊?还有就是关联一个int或者别的类型的变量究竟是个什么原理呢?
    加入的控件实际上已经是类成员了,只是不是以变量的形式出现,而是以资源ID出现。添加关联的int或别的类型的变量什么的,实际上是添加新的成员,该成员之所以能和控件关联,是因为添加的时候VC自动做了映射,好像在什么DXX_CHANGE什么之类的地方,自己找找就知道了,如果是手工自己添加的变量,也可以在该地方自己做映射,所以,实际上新添加的int之类的变量是新的成员,但是做了映射之后,访问该变量就相当于访问控件一样。
      

  7.   

    还是来举例说明吧
    1、创建1个组框,2个单选按钮.
    注意两单选按钮要连续创建,以保证ID值连续,并在其中一个设置Group.
    组框ID:IDC_STATIC            Capition:SexSelect       //静态
    按钮ID:IDC_BOY_RADIO         Capition:boy             //单选按钮
            IDC_GIRL_RADIO        Capition:girl            //单选按钮2、连接
    进入ClassWizard选择“变量”选框设置如下
    IDC_BOY_RADIO         CBUTTON          m_BoyRadio
    IDC_GIRL_RADIO        CBUTTON          m_GirlRadio
    至此连接资源的工作完成3、初始化
    在CTDlg::OnInitDialog()中添加代码如下:
    CheckRadioButton(IDC_BOY_RADIO,IDC_GIRL_RADIO,IDC_BOY_RADIO);
    这句代码的意思是BOY和GIRL是一组单选按钮,默认选择BOY
    如果有5个一组的单选按钮呢?
    CheckRadioButton(IDC_NUM1_RADIO,IDC_NUM5_RADIO,IDC_NUM4_RADIO):
    ok! 唯一要注意的就是一组单选按钮要顺序创建,并为第一个打上Group标记
    ps:没有解决不了的问题,只有你不再想去解决的问题。:)
      

  8.   

    其实不必要非得要一个成员变量,一个ID足矣。
    GetDlgItem(ID)就能干你所要求的事情了。
    加一个变量只不过让事情变得更加显式一些。
      

  9.   

    ((CButton*)GetDlgItem(IDC_CHECK1))->SetCheck(true);
      

  10.   

    你要是选择第二个
    ((CButton*)GetDlgItem(IDC_RADIO2))->SetCheck(true);
      

  11.   

    1. 对话框上的控件本质是一个个子窗口,在操作系统层面,连那个对话框的类都是不存在的,更别说上面的窗口了。VC++ 中的类实际上是针对窗口的行为进行的封装,结合你的滴3问,delphi中实际也是对窗口进行了封装,只是和VC++封装的程度不一样,VC++的封装更底层,因而用起来也更灵活,可以达到的效果也更多。但像delphi那样更高级的封装使得底层的细节不必暴露给用户,因而使用更方便。delphi和VC++的定位不同,delphi是RAD开发工具。
    2. 如上所说,控间实际是窗口,因此变量和控间只是间接的联系。VC++中针对控间可以建立控间变量和值变量两种。控间变量实际是窗口行为的直接封装,你对它的操作(函数调用)可以直接转化为API调用,产生结果。在构造函数执行时,实际的窗口还没建立,因此调用会失败。而值变量则需要经过一个复杂的 data exchange 的过程,例如对编辑控间建立一个int,则需要经过取得文本,把文本转为整数等一系列操作。这些操作实际是在 dodataexchange()函数中进行的,像DDX_Int() 就是将控件和int值进行数据交换的过程。当然你也可以定义自己的DDX函数,从而将控间和你自定义的变量类型联系起来:)但C++中仅对变量赋值并不能影响实际的控间内容,因此你必须手动的告诉MFC你要进行数据交换,调用UpdateData()函数,其参数指明了交换方向,是控间到变量还是变量到控间。你在构造函数中赋值有效是因为对话框建立时MFC调用了数据交换。
      

  12.   

    下班回来看到这么多前辈的指点,十分感动!真的,我想给你们再加点分,虽然我知道你们写这么多绝对不是只为了这个分数!再次表示十分的感谢,本来我只是会用databind的,现在通过您们的回答和我今天下午看的msdn的关于ddx,ddv的内容,现在有点明白了,谢谢大家!
    还有一个弱智的问题,就是ddx和ddv的中文翻译哪个是恰当的啊,对话框数据交换还是?谢谢