📄 subject_42493.htm
字号:
<p>
序号:42493 发表者:金枪鱼 发表日期:2003-06-03 19:25:45
<br>主题:如何在对话框初始化函数中退出对话框
<br>内容:我在一个对话框(模态)的初始化函数中要进行一些处理,如果处理不成功我希望直接退出本对话框。<BR>但此时调用OnCancel函数没有用,而且对话框初始化函数必须返回TRUE。<BR><BR>请高手指点如何在对话框初始化函数中退出对话框。<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:萧七 回复日期:2003-06-03 19:44:47
<br>内容:直接return ;行吗<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金枪鱼 回复日期:2003-06-03 22:50:03
<br>内容:// return TRUE unless you set the focus to a control<BR>// EXCEPTION: OCX Property Pages should return FALSE<BR>模态对话框的初始化函数必须返回BOOL值,直接return肯定出错,并且也不会退出对话框。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2003-06-03 23:21:54
<br>内容:<BR>try { <BR> call dialog initialize routine<BR>}catch(...)<BR><BR><BR>in the initialize routine<BR>{<BR> if(OK) do what u wanna...<BR> else __asm int 3<BR>}<BR><BR>Just a quick idea
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金枪鱼 回复日期:2003-06-04 01:13:37
<br>内容:汇编int3什么意思?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Neil Gan 回复日期:2003-06-04 08:32:10
<br>内容:You should override OnCreate. In this function, you return -1 to indicate Windows that you don't want to continue.<BR><BR>"int 3" is the debug interrupt instruction.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金枪鱼 回复日期:2003-06-04 12:01:33
<br>内容:谢谢NeilGan,按照你说的道理,似乎是对的。<BR><BR>我在OnInitDialog()中发现某些初始化不成功后,设置了一个标志让OnCreate()返回-1,但无法退出对话框。问题是模态对话框的OnCreate()函数执行比OnInitDialog()函数执行在前。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Neil Gan 回复日期:2003-06-04 12:09:23
<br>内容:一定要在OnInitDialog中做吗?不能移到OnCreate中?如果是这样,你可以调用EndDialog去中止它<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金枪鱼 回复日期:2003-06-04 14:20:24
<br>内容:我的对话框上有一个列表控件。我原来需要再对话框的初始化函数设置它的属性、插入列和设置列头和各列的对其方式。然后打开数据库取出数据并在列表控件上显示。如果数据获取不成功,我想直接关闭对话框。<BR><BR>我把这部分代码移动OnCreate函数中后,连列表控件的SetExtendedStyle函数都不能执行。更到不到后面的语句了。<BR>因此,似乎并不是OnInitDialog函数可以实现的功能都可以放到OnCreate函数中去实现。<BR><BR>我采用下面的方法可以实现:<BR>1)在对话框类中添加一个私有的BOOL变量m_IsDlgInitSuccess来记录是否初始化操作成功,并在构造函数中赋值FALSE。如果初始化有操作失败,则标记为TRUE。<BR>2)在对话框类中添加一个私有的UINT变量来记录计时器消息,在对话框的初始化函数中创建一个计时器,以便发送计时消息,试件间隔可以设置很短。<BR>3)在计时消息处理函数中首先消费这个计时器,再根据标识决定是否调用对话框的OnCancel函数。<BR><BR>我个人认为这个办法很笨,希望有更加直接的方式。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:Neil Gan 回复日期:2003-06-05 00:32:28
<br>内容:I mean you can call EndDialog in OnInitDialoag<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金枪鱼 回复日期:2003-06-05 10:14:04
<br>内容:EndDialog需要DoModal返回的参数哦,在OnInitDialog函数无法传入这个参数?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金枪鱼 回复日期:2003-06-05 10:35:27
<br>内容:哦,是我弄错误MSDN的意思。EndDialog的参数是指定返回值,而不是需要输入返回值。<BR>感谢,NeilGan,分给你了。<BR><BR>但我还想知道,如果在OnInitDialog()函数中调用了EndDialog()结束对话框,还会不会执行OnCancel()、OnDestroy()、OnClose()这类消息?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Neil Gan 回复日期:2003-06-05 10:40:24
<br>内容:no.<BR><BR>OnCancel,OnClose and OnDestroy are all message process functions.<BR><BR>MSDN says:<BR><BR>The system checks the flag before attempting to retrieve the next message from the application queue. If the flag is set, the system ends the message loop...<BR><BR>so, no more message is processed.<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金枪鱼 回复日期:2003-06-05 11:22:05
<br>内容:但我测试表明模态对话框的生命周期如下:<BR> 1)调用OnCreate函数<BR> 2)DoModal()函数调用OnInitDialog()函数<BR> 3)用户点击按钮,或者ESC按键,或者×按钮后<BR> 但不同的关闭方法顺序有差别:<BR> a)点击OK或者CALCEL按钮:按钮函数(OnOK或者OnCancel)-WM_DESTROY;<BR> b)点击×按钮:WM_CLOSE-ONCANCEL-WM_DESTROY<BR> c)ESC按键:OnCancel-WM_DESTROY(不发送WM_CLOSE消息)<BR> d)调用EndDialog(IDCANCEL),直接到WM_DESTROY.<BR><BR>我原来以为模态对话框关闭时都会先WM_CLOSE然后WM_DESTORY,看来时错误的了。只有WM_DESTROY消息才是肯定要发送的。<BR> 这个错误犯大了,因为有些清理工作我是放在OnCLose函数中进行的,看来应该使用OnDestroy函数而不是OnCLose函数。<BR>2003-6-5 11:26:31
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -