`
lovnet
  • 浏览: 6710087 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

MFC对话框Dialog(一)对话框创建,传值

 
阅读更多

MFC为我们提供了一些常用的控件,我们直接拖过来就可以用.这样大大简化了开发流程.要使用那些控件我们要先创建一个对话框(Dialog).然后就可以往对话框中拖入各种控件了.

下面来创建一个简单的有模式对话框,在里面添加一个按钮(Button)和两个文本框)Edit Control).

1.新建一个对话框并生成对应的类:

首先在Resource View中选中Dialog然后右击鼠标选择Insert Dialog.这样一个对话框就产生了.如果是第一个新建的,默认名字为IDD_DIALOG1.我们双击打开它.接下来从Toolbox中拖一个按键和两个文本框进来.

选中Dialog右击,选择Add Class.输入类名,假如为NewDialog.点Finish.一个叫NewDialog的类就产生了.这个类就和对话框关联起来了.如果我们不知道一个类是和哪个对话框关联的话,可以在头文件中找这样的代码:enum{ IDD = IDD_DIALOG1 };其中IDD_DIALOG1就是对话框的ID,是唯一的.当你为对话框添加类时这段代码会自动产生.

我们如果要调用这个对话框的话就直接调用这个类就行.比如:NewDialog nDlg ; nDlg.DoModal();//这样一个有模式对话框就显示出来了.这种对话框弹出来之后就不用对其他页面做操作了.另外还有所谓的无模式对话框,打开后还可以对其他页面操作.

2.直接获取对话框中控件的值和赋值:

假如对话框中按钮的ID为IDC_BUTTON1,两个文本框的ID分别为IDC_INPUT1,IDC_INPUT2.(补充:在属性窗口中查看一个控件的ID时会发现ID名旁边是一个下拉列表框,里面有其他很多控件的ID.所发查看的时候鼠标要小心点,别一不小心选了一个其他的ID了.这样后面哪出错了都不容易发现哪错了.我就曾经被折腾了好久啊)

(1)赋值 你打开对话框之前想对文本框初始化一个值的话可以这样写代码:SetDlgItemText(IDC_INPUT1, _T("please input "));(如果你把文本框属性中的Number选为True的话表示只能输入数字.如果输入字符会有出错提示.这时初赋值可以通过SetDlgItemInt(IDC_INPUT1, 123);)

(2)获取值 要获取IDC_INPUT1中的值:CString temp; GetDlgItemText(IDC_INPUT1,temp); //文本框中的值就保存在变量temp中了.

3.使用变量获取对话框中控件的值和赋值:

上面的方法有些麻烦,我们还可以有更简单的方法.把文本框控件和一个变量对应起来.选中IDC_INPUT1右击-->选中Add Variable-->在Category中选Value,Variable type中选CString.-->输入Variable name.假如为csInput1-->点finish.用同样的方法为IDC_INPUT2添加变量csInput2.

做完上面的操作后对对话框对应的类中会自动添加一些代码进去.在头文件中会看到public: CString csInput1; CString csInput2;在cpp文件中会看到

void CtestDlg::DoDataExchange(CDataExchange* pDX) //这个参数干嘛用的还没太搞懂.

{

CDialog::DoDataExchange(pDX);

DDX_Text(pDX, IDC_INPUT1, csInput1); //这行和下面一行是此时自动添加的.这个函数是在为对话框添加类时自动产生的

DDX_Text(pDX, IDC_INPUT2, csInput2);

}

DoDataExchange这个函数是干嘛用的呢?

顾名思义DataExchange就是数据交换.它的作用就是把变量和控件绑定到一起,变量的值改变后控件显示的值也变,修改了控件上的值变量也跟着变.

(1)打开对话框时让其中一个文本框显示please input.

现在我们来初始化下IDC_INPUT1显示的值 .在初始化的代码中给csInput1赋值就行.csInput1=_T("please input");

不过这时你打开对话框会失望的看到并没有初始化成功.这是因为DoDataExchange(CDataExchange* pDX)函数还没被调用.于是你就想手动去调用下,结果发现参数不知道填啥.

其实这个函数你是不能直接来调用的.我们必须调用UpdateData()这个函数,这个函数会自动再去调用DoDataExchange.最后的代码应该是这样的:

csInput1=_T("please input");

UpdateData(FALSE);//如果参数是TRUE就表示把控件上显示的值传到变量csInput1.另外UpdateData()和UpdateData(TRUE)等价.

(2)在IDC_INPUT1中随便输入些啥点下按钮后IDC_INPUT2中显示IDC_INPUT1中的值.

首先要给按钮添加个事件处理函数,直接双击它或右击选择Add Event Hanlder.这样一个叫CNewDialog::OnBnClickedButton1()的函数就产生了.

在里面添加代码:csInput2=csInput1;//一运行发现没实现要想的效果,还是得继续用UpdateData()函数才行.

在后面再添加一行代码:UpdateData(FALSE);//不过此时会发现不管IDC_INPUT1中输入什么.点下按钮后IDC_INPUT1,IDC_INPUT2的值都是开始csInput1初始的值"pleaseinput"

这是为啥呢.因为csInput1并没有收到IDC_INPUT1中的值.而调用UpdateData(FALSE)后对话框页面会内刷新下,显示变量传过来的值.

所以在给csInput2赋值前需要先把控件上改过来的值传给csInput1.最后的代码应该是这样的:

UpdateData();//先把文本中的值传到相应的变量上去

csInput2=csInput1;// 给另一个文本框对应变量赋值

UpdateData(FALSE);//刷新对话框把变量值传到控件中

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics