对话框:
在MFC中对资源的操作都是通过一个与资源相关的类来完成的
(在VC中用view –classwizard完成类与资源的绑定)
对话框的创建:
1.模态对话框(打开后不可以进行改程序的其他输入操作)
void CMainFrame::OnDialog()
{
// TODO: Add your command handler code here
MyDialog dlg=new MyDialog();
//这两种C++对象生成方式好像是一样的
//MyDialog dlg;
dlg.DoModal();
}
2.非模态对话框(打开后能进行改程序的其他输入操作)
这个主要是因为对话框打开后程序并没有向上述对话框一样停留在一条语句等待,而是顺序执行onDialog里面的代码直到结束
void CMainFrame::OnDialog()
{
// TODO: Add your command handler code here
//用指针new一个内存,在堆上分配内存,延长对象的生命周期。或者把MyDialog申明为//成员变量
MyDialog *dlg=new MyDialog();
//第一个参数对话框的ID,第二个是该对话框的父窗口
dlg->Create(IDD_DIALOG1,this);
//与上述模态对话框不同,必须显示的调用显示函数让其显示。上面的DoModal()函数本//身调用了ShowWindow()函数
dlg->ShowWindow(SW_SHOW);
}
上述代码有内存泄露的危险,因为生命周期结束时,他保存的内存地址就丢失了,没法在引用到原来指向的内存,必须显示的释放指针所指向的内存。
在对话框关联类里面重载PostNcDestroy()方法:
void MyDialog::PostNcDestroy()
{
delete this;
CDialog::PostNcDestroy();
}
模态对话框上的OK和Cancel按钮的响应函数调用了EndDialog函数销毁对话框,而非模态对话框只是隐藏了对话框,要销毁必须重写响应函数调用DestroyWindow函数销毁对话框。
CWnd对象都有一个m_hWnd,保存与窗口对象相关联的句柄。如果窗口对象没有与任一个窗口相关联,句柄为NULL,如下:
void MyDialog::OnButton1()
{
if (!btn.m_hWnd)
{
btn.Create("New",BS_DEFPUSHBUTTON|WS_VISIBLE,CRect(0,0,100,100),this,123);
}
else
{
btn.DestroyWindow();
}
}
静态文本框之类的多个控件的ID是一样的,要想给他们添加消息响应函数必须修改他们的ID,此外还要选中其属性对话框中的Notify选项,不然没法向父窗口发送消息。
控件也是窗口,获取静态控件上显示的文本,调用cwnd对象的成员函数GetWindowText()函数,获取控件对象用GetDlgItem()
设置静态控件的文本用SetWindowText()函数,如下:
void MyDialog::OnStatic1()
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItem(IDC_STATIC1)->GetWindowText(str);
if (str=="Number1")
{
this->GetDlgItem(IDC_STATIC1).SetWindowText("数字一");
}
}
PS:碰到一个有意思的报错
error C2228: left of '.SetWindowTextA' must have class/struct/union type
this->GetDlgItem(IDC_STATIC1).SetWindowText("数字一");把.改成->就好了
另一种获取控件的内容的方法是用几个变量分别和控件相关联,这个过程用class wizard中的Add Variable来完成,在内部是DoDataExchange()来完成关联的。在调用关联的变量之前要用UpdateData(bool)来让数据交换生效,UpdateData()函数内部调用了DoDotaExchange()来完成数据关联,里面的bool为true的时候代表正在获取对话框的数据,为false代表正在初始化对话框的控件.(DDV开头的函数对话框数据交换DDC对话框数据校验)
void MyDialog::OnButton1()
{
this->UpdateData(true);
m_edit3=m_edit1+m_edit2;
this->UpdateData(false);
}
还有一种方式,用几个控件变量与上述控件关联,同样用wizard实现关联。控件变量与控件关联后就获取了该控件的对象,然后再调用GetWindowText()和SetWindowText()实现
Windows程序都是基于消息的系统,通过SendMessage()来发送消息,获取窗口文本的消息是WM_GETTEXT设置窗口文本的消息是WM_SETTEXT,Cwnd类都有SendMessage()函数,加::表示调用Platform SDK的SendMessage函数。
::SendMessage(m_e1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
::SendMessage(m_e2.m_hWnd,WM_GETTEXT,10,(LPARAM)ch2);
int b=atoi(ch1)+atoi(ch2);
itoa(b,ch3,10);
::SendMessage(m_e3.m_hWnd,WM_SETTEXT,10,(LPARAM)ch3);
还可以直接用SendDlgItemMessage()直接给对话框的子控件发送消息。相当于把GetDlgItem()和SendMessage()这两个函数组合起来了
控件对象的SetFocus()函数获取焦点