对话框 一、 创建模态对话框 1、 先创建一个对话框的资源 2、 再创建一个子菜单资源 3、 再增加一个和该对话框相对应的类 4、 再针对增加的子菜单资源添加命令响应函数: void CDeadView::OnDialog() { // TODO: Add your command handler code here CDeadDlg dlg;//该类和对象就是和新建的模态对话框对应的。一个模态对话框就有一个和它相对应的对话框类。 dlg.DoModal();//添加一个模态对话框 } 二、 在模态对话框上添加一个按钮,并且对该按钮实现一定的功能 1、 在新建的对话框资源中,用右边的工具栏,创建一个按钮。创建好后,在该按钮上,右键单击,选属性,编辑该按钮的ID和名称。 2、 然后右键单击,选ClassWizrd,创建命令响应函数: void CDeadDlg::OnPiao() { // TODO: Add your control notification handler code here //第一种方法: /*if(m_IsCreate==FALSE) { m_btn.Create("坏老婆",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10,10,80,80),this,1); //输出位置,父窗口,编号 m_IsCreate=TRUE; } else { m_btn.DestroyWindow(); m_IsCreate=FALSE; }*/ //第二种方法(简单且提倡) if(!m_btn.m_hWnd) { m_btn.Create("坏老婆",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10,10,80,80),this,1); } else { m_btn.DestroyWindow(); } } (注:对第二种方法,有必要说明一下,每个窗口类的对象,都有一个成员变量叫窗口句柄m_hWnd,在还没有窗口和该对象进行连接的时候,m_hWnd是空的,当有窗口和该对象连接后,m_hWnd就是非空的了,且当该窗口销毁后,m_hWnd又变成空的了,所以第二种方法就是依据这种特性,进行的编程,可谓巧妙!) 三、 让静态文本接收命令响应函数: 例: 1、 在资源的对话框中添加静态文本”Number1:” 2、 在右键属性中,将其ID号改为“IDC_NUMBER1”,且将其“类型”中的“Notify”勾选上,以使该静态文本能接受通告消息。 3、 通过ClassWizard来对该静态文本添加命令响应函数: void CDeadDlg::OnNumber1() { // TODO: Add your control notification handler code here CString str; GetDlgItem(IDC_NUMBER1)->GetWindowText(str); //上面两个函数的意义分别是取得指向该静态文本的指针,取得该静态文本的文本内容到str中。 if(str=="Number1:") { GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1:");//重新设置静态文本的内容 } else { GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:"); } } 四、 对话框控件访问七种方式: 通过ClassWizard来添加按钮对文本框的操作: 第一种方法: void CDeadDlg::OnPiao() { // TODO: Add your control notification handler code here int num1,num2,num3; char ch1[10],ch2[10],ch3[10]; GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10); GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10); //两个函数的作用分别是获得指向该文本框的指针,获得文本框的内容,并且以字符串的形式,存储到字符数组中。 num1=atoi(ch1);//字符串装换成整形 num2=atoi(ch2); num3=num1+num2; itoa(num3,ch3,10);//整形装换成字符串,注意,第三个参数是10进制的意思。 GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);//设置文本框的内容。 } 第二种方法: void CDeadDlg::OnPiao() { // TODO: Add your control notification handler code here int num1,num2,num3; char ch1[10],ch2[10],ch3[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); } 说明:第二种方法就是把第一种方法中的两个函数合在一起了。 第三种方法: void CDeadDlg::OnPiao() { // TODO: Add your control notification handler code here int num1,num2,num3; num1=GetDlgItemInt(IDC_EDIT1); num2=GetDlgItemInt(IDC_EDIT2); num3=num1+num2; SetDlgItemInt(IDC_EDIT3,num3); } 说明:第三种方法又把字符串和整形之间的转化封装了。 第四种方法: 在资源中,在编辑框上右键单击,通过ClassWizard中的Member Variables为每个编辑框关联一个值变量,以后对变量的操作,就是直接对编辑框中内容的操作。 void CDeadDlg::OnPiao() { // TODO: Add your control notification handler code here UpdateData(TRUE);//当参数为TRUE时,表示从编辑框控件中取数据 m_result=m_num1+m_num2; UpdateData(FALSE);//当参数为FALSE时,表示对编辑框控件进行赋值或初始化 } 第五种方法: 在资源中,在编辑框上右键单击,通过ClassWizard中的Member Variables为每个编辑框关联一个控件变量,以后对控件变量的操作,就是直接对编辑框的操作。该控件变量和上面方法中的值变量是有相似的地方的。 void CDeadDlg::OnPiao() { // TODO: Add your control notification handler code here 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); } 第六种方法: void CDeadDlg::OnPiao() { // TODO: Add your control notification handler code here int num1,num2,num3; char ch1[10],ch2[10],ch3[10]; //::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); //::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); //以上是调用Win32 API函数的两种方法。第一个参数是指向该编辑框的句柄,第二个参数是发送给编辑框的消息,第三个参数是数组的大小,第四个参数就不用说了。 //GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1); m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1); //以上是直接调用CWnd平台的SendMessage函数 m_edit2.SendMessage(WM_GETTEXT,10,(LPARAM)ch2); num1=atoi(ch1);//字符串装换成整形 num2=atoi(ch2); num3=num1+num2; itoa(num3,ch3,10);//整形装换成字符串 //::SendMessage(GetDlgItem(IDC_EDIT3)->m_hWnd,WM_SETTEXT,10,(LPARAM)ch3); //::SendMessage(m_edit3.m_hWnd,WM_SETTEXT,10,(LPARAM)ch3); //GetDlgItem(IDC_EDIT3)->SendMessage(WM_SETTEXT,10,(LPARAM)ch3); m_edit3.SendMessage(WM_SETTEXT,10,(LPARAM)ch3); } 第七种方法: void CDeadDlg::OnPiao() { // TODO: Add your control notification handler code here 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); //SendDlgItemMessage()是将第六种方法中的两个函数合在一起了。 num1=atoi(ch1);//字符串装换成整形 num2=atoi(ch2); num3=num1+num2; itoa(num3,ch3,10);//整形装换成字符串 SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,10,(LPARAM)ch3); //SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,1,3); //消息 EM_SETSEL是复选文本的意思,后两个参数是复选的开始和结束位置,包括开始位置,不包括结束位置。 SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,-1); //当后两个参数是0和-1时是复选全部文本的意思。 m_edit3.SetFocus(); } 五、 对话框的收缩与扩展功能; 新建一个按钮,并对该按钮进行收缩与扩展的命令响应函数: void CDeadDlg::OnButton1() { // TODO: Add your control notification handler code here CString str; GetDlgItemText(IDC_BUTTON1,str); if(str=="收缩<<") { SetDlgItemText(IDC_BUTTON1,"扩展>>"); } else { SetDlgItemText(IDC_BUTTON1,"收缩<<"); } static CRect rectLarge; static CRect rectSmall; 此处设置成静态的变量是因为每次运行该函数的时候,它们的值不想被改变了。 if(rectLarge.IsRectNull()) {//因为CRect对象初始值为0,所以此处只执行一次,再一次进行命令响应时,就不执行了。 CRect rectSeparator; GetWindowRect(&rectLarge);//获得当前对话框的矩形大小,保存到rectLarge中。 GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator);//获得分隔符的矩形大小 rectSmall.left=rectLarge.left; rectSmall.top=rectLarge.top; rectSmall.right=rectLarge.right; rectSmall.bottom=rectSeparator.bottom; //因为收缩和扩大后的窗口,只有右下角点的纵坐标发生了改变,所以只需用分隔符的右下角的纵坐标改变收缩后的窗口就行了。 } if(str=="收缩<<") { SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);//设置新的窗口的位置等,祥看csdn。 } else { SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),SWP_NOMOVE|SWP_NOZORDER); } } 六、 对话框控件初始焦点和TAB键顺序的设置 在控件属性中的Styles中,将Default button勾选上,则可以将该控件设置为初始焦点。 在控件的属性中将tab stop勾选上,则该控件即参与了tab键的顺序,在Layout菜单中选择Tab Order,则可以设置tab键的顺序。