MFC如何动态添加控件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC如何动态添加控件相关的知识,希望对你有一定的参考价值。

在主对话框中动态添加控件的方法我大概了解。可我不是想在主对话框中添加。我在主对话框中添加了一个TabCtrl控件,为了使用这个控件,在资源里又添加了几个Dialog资源。现在的问题是如何在这几个对话框资源中动态添加控件?感觉不是在主对话框的OnInitDialog函数中写吧?可又不知道在哪。

  动态控件的创建过程:
  1.建立控件ID号:
  ID号是控件的标识,创建控件前必须先为它设置一个ID号。
  打开资源中的“String Table”,在空白行上双击鼠标,这时会弹出一个ID属性对话框,在其中的ID编辑框中输入ID,如:IDC_MYBUTTON,在Caption中输入控件标题或注解(注:Caption框不能为空,为空会导致创建失败),这里我输入的是按钮上要显示的文字--动态按钮。
  2.建立控件对象:
  不同种类的控件应创建不同的类对象:
  ·按钮控件 CButton (包括普通按钮、单选按钮和复选按钮)
  ·编辑控件 CEdit
  ·静态文本控件 CStatic
  ·标签控件 CTabCtrl
  ·旋转控件 CSpinButtonCtrl
  ·滑标控件 CSliderCtrl
  ·多信息编辑控件 CRichEditCtrl
  ·进度条控件 CProgressCtrl
  ·滚动条控件 CSrcollBar
  ·组合框控件 CComboBox
  ·列表框控件 CListBox
  ·图像列表控件 CImageCtrl
  ·树状控件 CTreeCtrl
  ·动画控件 CAnimateCtrl
参考技术A 重写一个对话框类(继承于CDialog),在构造函数中关联你的对话框ID,然后重写其OnInitDialog,在里面create你的控件。在主对话框中怎么用不用说了吧。追问

我主要是把Create函数的第三个参数写成GetDlgItem(我要的对话框ID).不管把这句话放在是主对话框的OnInitDialog还是新类重写的OnInitDialog,编译通过,但是运行就会弹出错误,让我选择“重试”“中止”和“忽略”

参考技术B

这里有个例子,动态添加按钮的。调用控件的Create函数,就可以创建控件了。



追问

打不开啊。而且你这个是单文档程序,我做的是对话框。Create我会。我就是想知道如何把控件添加到我自己新建的对话框资源中。

追答

看来你没装Visual Studio 2008。对话框和单文档是一样的,在初始化时Create就好了。你既可以在OnInitDialog创建,也可以自己定义个函数,在想要的时候创建。

本回答被提问者和网友采纳

MFC中给控件添加变量,DoDataExchange中

DoDataExchange函数其实是一项数据动态绑定技术。比如你在写动态按钮过程中须对按钮添加变量时,怎么添加?控件类已经写好了,其变量是已经固定的。你要添加新的变量就要用到DoDataExchange函数。

你要在对话框的构造函数里面初始化一个变量,再用DoDataExchange函数将它绑定到你的动态按扭中,比如:DDX_Check(pDX, IDC_CHECK1, m_Lesson1);这就是将m_Lesson1(这是一个外部变量,其定义在对话框的构造函数里)绑定到IDC_CHECK1中。
 
看下DDX_Check函数原型:void AFXAPI DDX_Check(CDataExchange* pDX, int nIDC, int& value);
可以看到m_Lesson并不是真的添加到IDC_CHECK1控件里了,注意这是int& value,只是一个值引用而已。
差不多的意思就是这个变量被框架传递给控件了。控件只负责使用此变量 ,而不负责改写此变量。
 
值得注意的一点是:MSDN后面附加了一句 Never call this function directly. It is called by the UpdateData member function. Call UpdateData to initialize a dialog box’s controls or retrieve data from a dialog box.就是说此函数永远不被直接调用,它只是呼叫UpdateData函数时才会被调用。

 

 
UpdateData函数
内部调用了DoDataExchange。该函数只有一个布尔型参数,它决定了数据传送的方向。
调用UpdateData(TRUE)将数据从对话框的控件中传送到对应的数据成员中,调用UpdateData(FALSE)则将数据从数据成员中传送给对应的控件。
 
UpdateData(false)是将变量的值传到控件,表示对话框正在初始化.
UpdateData(TRUE)是从控件中取值到关联的变量, 表示数据正在获取
CWnd::DoDataExchange
 
 
时间: 2016年7月

调用由框架交换和验证对话框数据。

语法
 
      virtual void DoDataExchange(
   CDataExchange* pDX 
);
参数
 
 
pDX

为 CDataExchange 对象的指针。

备注
 

不要直接调用此函数。 它由 UpdateData 成员函数调用。 调用 UpdateData 初始化对话框的控件或对话框中检索数据。

当从 CDialog派生时应用程序特定的对话框选件类,则需要重写该成员函数,如果您希望使用结构的自动数据交换和验证。 添加变量向导将编写该成员函数的重写版本包含预期“数据映射”对话框的数据交换(ddx),并验证(DDV)全局函数调用。

自动生成此成员函数的重写版本,请对话框编辑器首先创建对话框资源,然后派生应用程序特定的对话框选件类。 然后使用添加变量向导关联变量、数据和验证大小与在新的对话框的各种控件。 向导然后将被重写的 DoDataExchange,包含数据映射。 下面是示例DDX/DDV代码块生成由添加变量向导:

 
void CPenWidthsDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
   DDX_Text(pDX, IDC_THINPENWIDTH, m_nThinWidth);
	DDV_MinMaxInt(pDX, m_nThinWidth, 1, 20);
   DDX_Text(pDX, IDC_THICKPENWIDTH, m_nThickWidth);
   DDV_MinMaxInt(pDX, m_nThickWidth, 1, 20);
}

DoDataExchange 重写的成员函数必须在源文件中的宏语句。

有关数据交换的对话框和验证的更多信息,请参见 显示和操作数据窗体 和 数据交换的对话框和验证。 有关添加变量向导生成的DDX_和DDV_宏的说明,请参见 技术说明26

要求

头文件位置: afxwin.h


 

VC中的DoDataExchange

怎么设置控件和变量关联呢?

假如在对话框中加入一个picture控件的话

1.导入图片

2.拉picture控件到对话框上,设置属性,Type改为Bitmap,image选择导入的图片,ID一定要修改,不能为默认的IDC_Static,否则下面将做的Classwizard将不出现此控件ID。

3.ClassWizard中选择member variable Category选择 Control加入相应的CStatic变量 。

4.此时到DoDataExchange看,增加相应的数据交换语句,我的是DDX_Control(pDX, IDC_bt, m_bt);


 

void CUserDialog::DoDataExchange(CDataExchange* pDX) 

    CDialog::DoDataExchange(pDX); 
    DDX_Text(pDX, IDC_USER_EDIT, m_username); 
    DDV_MaxChars(pDX,m_username,10); //将用户名的最大长度控件在10个字符

DDX:Dialog Data Exchange 表示对话框数据交换

DDV:Dialog Data Valid 表示对话框数据有效性


总之,这个函数对理解MFC框架是很有用的。对于写控件也是很有用的。 


UpdataData函数内部调用了DoDataExchange。该函数只有一个布尔型参数,它决定了数据传送的方向。调用UpdateData(TRUE)将数据从对话框的控件中传送到对应的数据成员中,调用UpdateData(FALSE)则将数据从数据成员中传送给对应的控件。 

UpdateData(FALSE)是将变量的值传到控件. 
UpdateData(TRUE)是从控件中取值到关联的变量 

 

DoDataExchange会被框架调用,用来改变和验证对话框的数据。在这个函数中一般是将控件和某些变量关联,当在其它地方改变量的值,通过UpdateData 进行双向交换。如: 

UpdateData();//将控件的值传给变量 
m_variable= "string";//分别为控件的变量赋值 
UpdateData(FALSE);//将变量的值传给控件 

以上是关于MFC如何动态添加控件的主要内容,如果未能解决你的问题,请参考以下文章

MFC 中关于Edit控件问题

mfc 动态为控件添加事件2

mfc 动态为控件添加事件1

C# WinForm 如何动态添加控件和设计控件布局

如何将消息映射添加到 MFC 中的动态菜单项

c# 中如何在GroupBox控件中动态添加与移除控件