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