创建模态对话框:这里说明CDialog类是从CWnd派生出来的,这个类是用来显示对话框的基类。
对话框有:modal(模态)、modaless(非模态)两种。
模态对话框:打开一个模态对话框必须在关闭这个模态对话框后才能执行其他任务。
非模态对话框:与模态相反,不关闭这个对话框也可以执行其他任务。
1、需要在资源视图里的Dialog里创建一个对话框。
2、由于Mfc中对资源的操作是由一个类来完成的,所以对资源的操作必须创建一个与 自己的对话框资源相关联的类,所以需要对他采用类向导的方式创建一个类(一路 ok到底就可以)。
3、在Menu(菜单)里的帮助按钮后边添加一个“对话框”按钮,然后对这个按钮在 CTestView类中添加COMMAND响应事件OnDlg。
4、点击菜单栏里的“对话框”按钮,出现我们前面设计的模态对话框,在此需要用到 一个msdn中查到的一个函数DoModal();msdn里对这个函数的解释:An int value that specifies the value of the nResult parameter that was passed to the CDialog::EndDialog member function, which is used to close the dialog box(这个函数的返回值是传给 CDialog的成员函数EndDialog来关闭这个模态对话框的)
#include "TestDlg.h" //因为是在CTestView类中,定义CTestDlg对象需要加入这个 头文件 ...... ...... void CMybole2View::OnDlg() { // TODO: Add your command handler code here CTestDlg dlg; //定义一个对话框对象 dlg.DoModal(); //产生一个模态对话框,这里因为之前这个CTestDlg已经跟我们设计的对话框相关 //联了,所以产生的就是我们之前设计好的对话框 }
创建一个非模态对话框:
对话框中,点击静态文本响应通道消息:步骤和上面是一样的,只是在四里面,要改一下,创建非模态对话框,需要调用CDialog::Create();函数。这个对话狂创建了它不会像模态对话框一样显示,并且关闭也销毁,这些工作都要我们自己来做。对话框的销毁是在我们点击OK(确定)/Cancel(取消)的时候销毁的,所以需要我们在响应对话框窗口的OnOK()函数中去调用销毁对话框的函数DestroyWindow()函数。在msdn中查到:Don’t call the base-class member function, because it calls EndDialog, which makes the dialog box invisible but does not destroy it.(不要调用基类的这个成员函数,因为它调用的是EndDialog,这个EndDialog是让这个对话框窗口不可见并不是销毁了它。),这样我们就需要覆盖重写这个OnOk()函数,这里不对非模态对话框窗口做测试。
1、先去资源编辑器的前面设计的对话框窗口中新建三个静态文本控件和三个文本编辑 框控件
2、由于静态文本控件并不是用来响应点击消息的,所以我们生成的三个静态文本控 件的ID号是一样的,这里要响应通道消息就需要改变它的ID,这里把第一个静态 文本控件的ID改为IDC_NUMBER1;
3、静态文本一般是不用来响应消息的,所以需要修改这个静态文本控件的属性,右击 属性-》样式-》勾选通告
4、对它建立类向导,增加通道消息BN_CLICKED的函数;
想法:要改变一个静态文本的内容,首先需要获取它当前的文本内容,这里在Msdn中 查到void GetWindowText( CString& rString ) const;(它的解释是获取一个静态 文本控件的内容,获取到的值赋值给参数rString );
得到了获取文本控件的函数,还需要知道怎样获取这个文本控件的指针,用这个 去调用上面GetWindowText,就可以获取到我们想要的内容,在Msdn中查到:
CWnd* GetDlgItem( int nID ) const;(它的解释是传递一个对话框窗口中子控件
的ID,然后得到一个子控件的指针,利用这个指针,就可以调用上面的函数获 取文本内容)
实现:
void CTestDlg::OnNumber1() { // TODO: Add your control notification handler code here CString str; if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str=="Number1:") //获取文本控件IDC_NUMBER1的内容赋值给str,判断str是否等于Number1: { GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:"); //如果是改变它的文本内容为"数值1:" } else { GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:"); //如果不是改变它的文本内容为"Number1:" } }
实现简单的加法运算:
方法1:GetDlgItem()->Get(Set)WindowText()
int num1,num2,num3; char ch1[10],ch2[10],ch3[10]; GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10); //获取文本编辑框1的内容最多为10个字符串长度的值(因为上面定义的字 符串的长度最大只有10) GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10); num1=atoi(ch1); //把文本编辑框1的内容转化为int型赋值给num1 num2=atoi(ch2); num3=num1+num2; itoa(num3,ch3,10); //把num3以十进制转化为文本内容赋值给ch3 GetDlgItem(IDC_EDIT3)->SetWindowText(ch3); //改变文本编辑框的内容为ch3的内容
方法2:GetDlgItemText()/SetDlgItemText()
在msdn中查到:int GetDlgItemText( int nID, CString& rString ) const;(它是用对话框窗口子控件的ID获取它的文本内容),这个函数的效果就是集成了上面GetDlgItem、GetWindowText两个函数的功能。对应的也有SetDlgItemText,用ID改变文本内容。
int num1,num2,num3; char ch1[10],ch2[10],ch3[10]; GetDlgItemText(IDC_EDIT1,ch1,10); //获取ID为IDC_EDIT1的内容最大为10个字符串长度的值赋给ch1 GetDlgItemText(IDC_EDIT2,ch2,10); num1=atoi(ch1); num2=atoi(ch2); num3=num1+num2; itoa(num3,ch3,10); SetDlgItemText(IDC_EDIT3,ch3); //改变IDC_EDIT3的内容为ch3
方法3:GetDlgItemInt()/SetDlgItemInt()
UINT GetDlgItemInt( int nID, //对象ID
BOOL* lpTrans = NULL,
//如果获取的值超过了赋值范围 返回一个假,默认为空,为 假是会提示错误
BOOL bSigned = TRUE ) const;//设置赋值的对象是否为有符 号的对象
对应的也有SetDlgItemInt,这两个函数直接把获取的值转化为Int,把设置的值转化为文本值。
int num1,num2,num3; num1=GetDlgItemInt(IDC_EDIT1); num2=GetDlgItemInt(IDC_EDIT2); num3=num1+num2; SetDlgItemInt(IDC_EDIT3,num3);
方法4:将控件和整型变量相关联
这里我们可以把编辑框控件与我们类成员变量相关联,运算成员变量就等于在修改编辑框的内容了。
操作把编辑框控件与类成员变量关联后发现:在类头文件中声明了三个公有的类成员变量:
int m_num1;
int m_num2;
int m_num3;
在.cpp中构造函数对它们初始化为0,并且在DoDataExchange中多了
DDX_Text(pDX, IDC_EDIT1, m_num1);
DDX_Text(pDX, IDC_EDIT2, m_num2);
DDX_Text(pDX, IDC_EDIT3, m_num3);
查过Msdn后发现DoDataExchange函数里解释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来调用这个函数,并且对对话框窗口重新初始化)
然后在Msdn中继续查找UpdateData发现它只有一个参数默认赋值是TRUE,意思是开启初始化窗口,那么FALSE就是关闭初始化窗口。
UpdateData(); //开启初始化 m_num3=m_num1+m_num2; UpdateData(FALSE); //关闭初始化
方法5:将控件和控件变量相关联
通过增加控件变量来实现加法,这里实现的是类似直接把文本框控件的指针定义为成员变量(就是指针与成员变量关联);
同样通过建立类向导,在里面选择添加变量,在出现的选择框中我们需要选择Control说明我们添加的是控件变量。并且代码也会自动在DoDataExchange里把我们的控件与成员变量相关联。
int num1,num2,num3; char ch1[10],ch2[10],ch3[10]; m_edit1.GetWindowText(ch1,10); //通过关联的成员变量来获取文本框的值 m_edit2.GetWindowText(ch2,10); num1=atoi(ch1); num2=atoi(ch2); num3=num1+num2; itoa(num3,ch3,10); m_edit3.SetWindowText(ch3);//同理,通过关联的成员变量来改变文本框的值
方法6(通过发送消息SendMessage(下面这个是平台sdk函数也就是全局函数)来实现):
SendMessage(
(HWND) hWnd, // 窗口的句柄
WM_GETTEXT,/WM_SETTEXT // 发送GETTEXT或SETTEXT消息
(WPARAM) wParam, //和上面一样,获取控件中字符数最大限制,不用要设置为0
(LPARAM) lParam // 获取的值赋值给的字符串
);
实现:
int num1,num2,num3; char ch1[10],ch2[10],ch3[10]; //::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPAR AM)ch1); //使用平台sdk函数获取文本编辑框的内容 //::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); //GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1); //使用CWnd的成员函数 m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1); m_edit2.SendMessage(WM_GETTEXT,10,(LPARAM)ch2); num1=atoi(ch1); num2=atoi(ch2); num3=num1+num2; itoa(num3,ch3,10); m_edit3.SendMessage(WM_SETTEXT,0,(LPARAM)ch3); //使用CWnd类成员函数改变文本编辑框的内容
方法7(通过发送消息SendDlgItemMessage来实现):
int num1,num2,num3; char ch1[10],ch2[10],ch3[10]; SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1); SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)ch2); num1=atoi(ch1); num2=atoi(ch2); num3=num1+num2; itoa(num3,ch3,10); SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3); SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,-1); //这里通过发送EM_SETSEL(edit message)消息,设置编辑框控件的复选内容, 其中最后两个参数是复选内容开始和结束的位置,开始为0结束为-1表示全 部复选 m_edit3.SetFocus(); //设置第三个编辑框为复选对象