MFC控件(0):对话框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(); //这样一个有模式对话框就显示出来了.这种对话框弹出来之后就不用对其他页面做操作了.另外还有所谓的无模式对话框,打开后还可以对其他页面操作.

 

 各种控件ID命名规范

1.对话框的名字方式一般以IDD + 描述信息,比如IDD_LOGON_PAGE,其中IDD自然是ID Dialog的简写,代表类型,后面的就用些有意义的描述词.

2.其他控件的ID名字一般是IDC(自然是ID Control简写) + 加控件名称(不过一般也缩写) + 描述信息

Button可命名为IDC+BTN+描述信息,例如IDC_BTN_CONNECT

Edit box可命名为IDC+EDIT+描述信息,例如IDC_EDIT_INPUT

Static text可命名为IDC+STATIC+描述信息,例如IDC_STATIC_INPUT

Check Box 命名:IDC+CHECK+XXXX

Radio Button命名: IDC + RADIO + XXXX

Combo Box 命名: IDC+COMBO + XXXX

List Control 命名:IDC + LIST + XXXX

Tree Control 命名:IDC + TREE + XXX

 

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中了.

 

对于所有继承自CWnd的控件还可以使用函数GetDlgItem(ID_XXX)来获取控件的指针,该函数返回值是CWnd*,所以也可以这样赋值与取值.

GetDlgItem(IDC_INPUT1)->SetWindowText("please input");//赋值

CString szInfo;

GetDlgItem(IDC_INPUT1)->GetWindowText(szInfo); //取值

 

 

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);

//DDX_Control(pDX,IDC_INPUT1,m_input); //DDX_Control是把控件与一个控件类对象绑定起来.CEdit m_input;

}

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);//刷新对话框把变量值传到控件中

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值