对话框包括模态对话框和非模态对话框
模态对话框创建之后要用 DoModal ( )函数显示,用EndDialog( )函数关闭,例如:
CTestDlg dlg ;
dlg.DoMal ( ) ;
非模态对话框用 CDialog::Create(...) 函数创建,例如:
CTestDlg dlg;
dlg.Create( IDD_DIALOG1, this );
dlg.ShowWindow ( SW_SHOW ) ;
//这里要注意要把 dlg 定义为 View类的成员变量(局部变量在程序结束之后要销毁,所以窗口不能显示出来);另外一种方法是分配一个指针,在堆上分配一个内存,我们知道在堆上分配的内存是和整个应用程序的生命周期相一致的。以上代码可以修改为:
CTestDlg *dlg = new CTestDlg ( ) ;
dlg->Create( IDD_DIALOG1, this );
dlg->ShowWindow ( SW_SHOW ) ;
对于非模态对话框,当运行出现一个对话框窗口时,我们点击“确定”或者“取消”的时候,对话框窗口消失了,当我们点击“确定”时,它是由CDialog : : OnOk ( ) 函数响应,事实上窗口并没有被销毁,而是隐藏起来了,要真正销毁窗口的话需要重写基类的OnOk ( ) 函数,并调用DestroyWindow ( ) 函数销毁窗口;而对于模态窗口而已,当我们点击“确定”或者“取消”按钮是,它是被销毁的,这一点要区分开来。
以下是MSDN中对CDialog : : OnOk ( )函数的部分解释:
If you implement the OK button in a modeless dialog box, you must override the OnOK member function and call DestroyWindow from within it. Don’t call the base-class member function, because it calls EndDialog, which makes the dialog box invisible but does not destroy it.
下面介绍4 种访问控件的方式:
第一种,以改变静态窗口文本内容为例,
使用
GetDlgItem( IDC_NUMBER1) -> GetWindowText( str )
GetDlgItem (IDC_NUMBER1 ) ->SetWindowText (“数值1" );
默认的静态文本框是不能响应通告消息的,但是我们可以稍加改动便可以让它响应通告消息:第一步是修改静态文本框的 ID ;第二步是将静态文本框属性里的“Styles”选项中的Notify选项打勾。
CString str ;
if( GetDlgItem( IDC_NUMBER1) -> GetWindowText( str ) , str = "Number 1" )
{
GetDlgItem (IDC_NUMBER1 ) ->SetWindowText (“数值1" );
}
else
{
GetDlgItem (IDC_NUMBER1) ->SetWindowText ( "Number1 " ) ;
}
在C语言中,提供了一个字符(即文本)到数值的转换的一个函数: int atoi( const char *string );
例如:
int num1,num2 , num3;
char ch1[10], ch2[10] , num[10];
num1 = atoi ( ch1 ) ;
num2 = atoi ( ch2 );
num3 = num1 + num2 ;
itoa ( num3, ch3, 10 ) ; // char *_itoa( int value, char *string, int radix )这个函数式将数值转换为文本
GetDlgItem ( IDC_EDIT ) -> SetWindowText ( ch3 ) ; //将这个数值填充到编辑框中
第二种,以一种加法运算为例,使用
GetDlgItemText ( IDC_EDIT3, ch1, 10 )
SetDlgItemText ( IDC_EDIT3,ch3 )
例如:
int num1,num2 , num3;
char ch1[10], ch2[10] , num[10];
GetDlgItemText ( IDC_EDIT1, ch1, 10 ) ;
GetDlgItemText ( IDC_EDIT2, ch2, 10 ) ;
num1 = atoi ( ch1 ) ;
num2 = atoi ( ch2 );
num3 = num1 + num2 ;
itoa ( num3, ch3, 10 ) ;
SetDlgItemText (IDC_EDIT3, ch3 ) ;
第三种,还是使用加法运算的例子,
例如:
UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) const; //该函数获取文本框的内容并转换为 Int 类型返回
int num1,num2 , num3;
num1=GetDlgItemInt (IDC_EDIT1 ) ;
num2=GetDlgItemInt (IDC_EDIT2 ) ;
num3=num1+num2 ;
SetDlgItemInt (IDC_EDIT3, num3 ) ;
第四中访问控件的方式,这也是最简单的一种方式,对控件绑定关联变量,使用关联变量操作。(m_num1、m_num2、m_num3分别为关联变量)
UpdateData( TRUE ) ;
m_num3= m_num1 + m_num2 ;
UpdateData (FALSE ) ;
这里为什么要加UpdateData( TRUE )和 UpdateData( FALSE ) 具体看 MSDN 中的 CWnd::DoDataExchange 和 CWnd::UpdateData 这两个函数