MFC中模态对话框和非模态对话框的区别?

 我来答
qigongyu123
推荐于2016-07-30 · 超过36用户采纳过TA的回答
知道答主
回答量:100
采纳率:0%
帮助的人:102万
展开全部
模态对话框工作状态:当它获得焦点时,将垄断用户的输入,在完成本对话框之前,用户无法对本程序的其他部分进行操作。

非模态对话框类似于WORD里的查找替换,就在应用程序打开非模态对话框的同时还可以切换到其他窗口进行操作。

二者的类都派生于CDialog类,而CDialog类派生于CWnd类。

区别:

模态对话框使用CDialog::DoModal函数创建以及销毁。初始化消息WM_INITDIALOG,调用OnInitDialog初始化并显示,创建完毕后,DoModal启动消息循环。

非模态对话框使用CDialog::Create实现。由于Create函数不会启动新的消息循环,对话框与应用程序共用一个消息循环,就不会独占用户输入,Create函数在对话框显示后就立即返回。DoModal是在对话框关闭后才返回。对话框关闭后说明对话框窗口的对象已经销毁,只剩下C++对象还没有释放,所以必须调用CWnd::DestoryWindows函数来关闭非模态对话框。
手机用户22624
2011-06-25 · TA获得超过216个赞
知道答主
回答量:426
采纳率:0%
帮助的人:252万
展开全部
1.这个窗口过程的任务是干什么呢?就是最终用来处理消息的,就是消息的处理器而已,那么这个函数就是WindowProc。Windows的启动应用程序时,先调用WinMain函数,然后调用窗口过程。无论Windows何时想传递一个消息到一窗口,都将调用相应的窗口过程。当Windows从环境,或从另一个应用程序,或从用户的应用程序中得到消息时,它将调用窗口过程并将信息传给此函数。总之,窗口过程函数处理所有传送到由此窗口类创建的窗口所得到的消息。并且窗口过程有义务处理Windows扔给它的任何消息。令我们不解的是,在程序中我们看不出来是哪一个函数在调用窗口过程。它其实是一个回调函数.前面已经提到,Windows把发生的输入事件转换成输入消息放到消息队列中,而消息循环将它们发送到相应的窗口过程函数,真正的处理是在窗口过程函数中执行的,在Windows中就使用了回调函数来进行这种通信。 回调函数是输出函数中特殊的一种,它是指那些在Windows环境下直接调用的函数。一个应用程序至少有一个回调函数,因为在应用程序处理消息时,Windows调用回调函数。这种回调函数就是我们前面提到的窗口过程,它对对应于一个活动的窗口,回调函数必须向Windows注册,Windows实施相应操作即行回调。每个窗口必须有一个窗口过程与之对应,且Windows直接调用本函数,因此,窗口函数必须采用FAR PASCAL调用约定。
2.MFC是微软基础类(Microsoft Foundation Classes),同VCL类似,是一种Application Framework,随微软Visual C++ 开发工具发布。该类库提供一组通用的可重用的类库供开发人员使用。大部分类均从CObject 直接或间接派生,只有少部分类例外。
我使用MFC的感觉就是方便,快捷。它里面封装的很多类功能很强大。但是MFC不是万能的,感觉有些功能用其他方法实现起来反而更有用一些吧。各有各的好处,用着顺手才是最重要的,反正我喜欢用哈哈。
3.与模态对话框不同,非模态对话框不垄断用户的输入,用户打开非模态对话框后,仍然可以与其它界面进行交互。非模态对话框的设计与模态对话框基本类似,也包括设计对话框模板和设计CDialog类的派生类两部分。但是,在对话框的创建和删除过程中,非模态对话框与模态对话框相比有下列不同之处:
非模态对话框的模板必须具有Visible风格,否则对话框将不可见,而模态对话框则无需设置该项风格。更保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建在堆栈上。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是模态对话框的关键所在。必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用DestroyWindow来关闭对话框。
4.GetParent() == 想测试的窗口句柄,试试这个
5. 得到视:
CMainFrame *pFrm = (CMainFrame *)::AfxGetApp()->GetMainWnd() ;
CTestView *pView =(CTestView *) pFrm->GetActiveView();

得到文档:
CTestDoc* pdoc=(CTestDoc*)pFrm->GetActiveDocument();
以上均基于单文档
6.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
沧海雄风2009
2011-06-25 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8525
采纳率:79%
帮助的人:2834万
展开全部
MFC中有两种类型的对话框:模态对话框和非模态对话框。

模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务。非模态对话框是指当其显示时,允许转而执行程序中其他任务,而不用关闭这个对话框。

模态对话框的创建:

创建模态对话框需要调用CDialog类的成员函数:DoModal,该函数的功能是创建并显示一个模态对话框,其返回值将作为CDialog类的另一个成员函数:EndDialog的参数,后者的功能是关闭模态对话框。一般显示模态对话框的实现代码如下:

void CASCEView::OnDialog()

{

CASCEDlg dlg;

dlg.DoModal();

}

非模态对话框的创建:

要创建非模态对话框就需要利用CDialog类的Create成员函数,该函数有以下两种形式的声明:

virtual BOOL Create(

LPCTSTR lpszTemplateName,

CWnd* pParentWnd = NULL

);

virtual BOOL Create(

UINT nIDTemplate,

CWnd* pParentWnd = NULL

);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-07-06
展开全部
你和小小的狐狸这位朋友说的不是同一个东西。
小小的狐狸说的是用MFC编程,你说的是SDK编程。
CreateDialog是标准的API函数,要想用它的话就得舍弃MFC,因为参数不兼容...
WindowProc是MFC包装过的函数,没法向CreateDialog这个函数里套。就算类型强转编译成功了,运行时一定非法。呵呵,好像MFC下还没法强转。
用Create创建的函数消息处理全封装在CMyDlg这个类里。
WndProc是什么?
另外,虚机团上产品团购,超级便宜
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友96aa8d3
2011-06-24 · TA获得超过433个赞
知道小有建树答主
回答量:2306
采纳率:75%
帮助的人:949万
展开全部
模式对话框 是你必须先响应他先 不然你进不了主对话框

非模式对话框 就没关系
追问
有没有在详细的解答?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式