对话框
一、 创建模态对话框
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键的顺序。