MFC非模态对话框教程
MFC非模态对话框教程Tutorial - Modeless Dialogs with MFC开发工具:VC6, VC7, C++, Windows, MFC, VS, VS.NET2002, Dev
摘要:文章解释MFC一些非模式对话框应用的技巧和建议。
所含源码列表:
Download Project [VC++ .NET] - 22 Kb 简介非模式对话框常常感到困惑的新手程序员。基本上是一个非模式对话框是一个使我们能够互动,与其他的Windows ,甚至当非模式对话框仍然是在屏幕上。如果您请记住,几个漂亮的小动作,然后编程非模式对话框,将非常简单。 创建非模式对话框简单的方法创建一个非模式对话框是使用 自 另一种解决办法是要申明您的非模式对话框作为一个堆的成员对象你的主要框架窗口或您的 由的方式不同,非模式对话框,非模式对话框需要有
CModeLess *m_pmodeless = new CModeLess(this); m_pmodeless->Create(CModeLess::IDD); m_pmodeless->ShowWindow(SW_SHOW);
父问题惯常的做法是使父窗口的主窗口对您的应用程序,这是典型的主框架窗口。现在的一个问题是与这是因为非模式对话框,将继续留在上方的这父窗口。它可以让您的互动与主框架窗口,或许它还包含一个
m_pmodeless->Create(CModeLess::IDD,GetDesktopWindow());
销毁非模式对话框既然我们已分配内存就堆,我们必须将它删除时,非模式对话框是摧毁,否则我们很快会遇到很大的麻烦与内存泄漏,左,右和中心。当对话框是摧毁了最后一则留言,我们收到处理类是
void CModeLess::PostNcDestroy() { CDialog::PostNcDestroy(); delete this; }
问题与成员对象如果非模式对话框是一个成员对象的父窗口的类,我们有一个轻微的问题在这里。成员变量仍持有指针引用,但它引用的记忆已被删除。有替代这个问题。一种方法是后一用户定义的消息给父窗口和处理它在父类,通过设置非模式对话框成员变量,以
void CModeLess::PostNcDestroy() { CDialog::PostNcDestroy(); GetParent()->PostMessage(WM_MODELESS_CLOSED,0,0); delete this; }
LRESULT CMainFrame::OnMyMethod(WPARAM wParam, LPARAM lParam) { m_pmodeless = NULL; return 0; }
问题OnOK ( )和OnCancel ( )在模态对话框,每个人都包括女王的厨师,有OK/cancel按钮。我认为,想必在许多其他更了解市民的意见,您要做好,以避免OK和取消对一非模式对话框。但如果因为某种不可避免的原因,您最希望能有他们对您的非模式对话框,那么您将需要超过预约两种功能函数。 这里是我的非模式版本的
void CModeLess::OnCancel()
{
DestroyWindow();
}
好吧,现在我的非模式版本的
void CModeLess::OnOK() { if(UpdateData(true)) { DestroyWindow(); } }
传递回数据在模态对话框,我们仍然可以使用数据变量时,
void CModeLess::OnOK() { if(UpdateData(true)) { ((CMainFrame*)m_parent)->m_x=m_sss; DestroyWindow(); } }
在这里,我已经指派的值对话框的数据变量
CModeLess *m_pmodeless = new CModeLess(this);
你可以看到,我已通过
CModeLess::CModeLess(CWnd* pParent /*=NULL*/) : CDialog(CModeLess::IDD, pParent) { //{{AFX_DATA_INIT(CModeLess) m_sss = 0; //}}AFX_DATA_INIT m_parent=pParent; //This is where I point m_parent to my main frame window }
这一切,慢慢是有道理的,嗯? 跟踪非模式对话框计数让我们说你要只有一个实例,该非模式对话框活在同一时间。在这种情况下,每一次用户启动一些行动,结果,在使该非模式对话框,你必须检查,看看是否该非模式对话框是已经在运作中。也就是说, 这里是我如何创建我的非模式对话框现在我想限制他们只是一个在时间: -
if(m_pmodeless) { m_pmodeless->SetForegroundWindow(); } else { m_pmodeless = new CModeLess(this); m_pmodeless->Create(CModeLess::IDD); m_pmodeless->ShowWindow(SW_SHOW); }
但是,当对话框被摧毁,我们必须告知父类指针,它现在是无用的。我们做什么,是集指针
void CModeLess::PostNcDestroy() { CDialog::PostNcDestroy(); ((CMainFrame*)m_parent)->m_pmodeless = NULL; delete this; } |