找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 650|回复: 5

[求助]:如何正确地使用有模式和无模式对话框

[复制链接]
发表于 2003-4-27 22:03:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在 ARX 2002 环境下编程时,如何正确地使用有模式和无模式对话框?
    这个问题书上没有说清楚,我一直也没有找到合适的例子。

    我在编程时遇到了不起眼的问题:
    1.用向导生成一个工程(使用MFC);
    2.增加一条命令;
    3.插入一个对话框资源,并添加各种控件,增加处理函数等等;
    4.在命令中增加使用对话框的代码,并另外增加了运行时间较长的工作代码,注册命令的代码如下:
void modalDlgTest()
{
    // TODO: Implement the command

    // When resource from this ARX app is needed, just
    // instantiate a local CAcModuleResourceOverride
    CAcModuleResourceOverride resOverride;

    CTestDlg dlg;
    dlg.DoModal();


    //以下为长时间运行代码,
    //并有在AutoCAD当前图中绘图的命令
    .
    .
    .
}
        编译连接通过,运行也正常。

    可是,当在 AutoCAD 2002 中运行该命令并弹出对话框时,如果用鼠标拖动对话框一下,再按OK按钮,则大问题来了:对话框直到运行了几分钟才消失,并且被绘图命令(程序中的)弄得百孔千疮。
    该问题并不影响程序最终结果,但令人不爽。
    这到底是程序的问题,还是ARX不是很完善地支持 MFC 对话框?
    特请高人指点(如何正确地使用有模式和无模式对话框)。
    谢谢!快快救命!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-4-28 00:13:26 | 显示全部楼层
从你的程序来看,使用的是模式对话框,如果将长时间运行的绘图代码加到CDialog::OnOK()函数中,对话框会等到绘图完成后再关闭,可以避免弄得百孔千疮。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-4-28 10:42:59 | 显示全部楼层
不行啊,我在CDialog::OnOK()函数中试过,我甚至定义了一个全局函数来处理对话框,也毫无用处。
    我打开了 ARX 2002 中的对话框“例子”,在其中加入长时间运行代码,结果一样。

    我的问题在下列情况发生:
    1. 当弹出对话框后,如果用鼠标拖动对话框一下(哪怕一点点),再按 OK 按钮。
    2. 当按对话框上的 “Open” 按钮,打开文件并返回该对话框后,再按 OK 按钮。

    对于上述二种情况,对话框的显示失去控制,被弄得百孔千疮,直到程序结束时才消失。

  我猜到了一些模糊的概念,可能是资源实例、窗口句柄、消息处理、钩子函数......等等问题,但我实在弄不明白。
    请高人指点!快快救命!谢谢谢谢谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-4-29 15:49:22 | 显示全部楼层
问题在于“长时间运行代码”,它占用了太多的 CPU 处理时间,导致 WINDOWS 消息无法及时响应。

用多线程吧:把那一段代码的执行放在一个新线程里,放在后台处理。

好好看看相关的资料,多线程程序不太好控制,而且在 CAD 中用它也有一些限制,但小心处理可以搞定的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-4 04:27:58 | 显示全部楼层
问题在您的长时间运行代码中,好好规划你的程序。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-5 23:38:56 | 显示全部楼层
多谢各位热烈参与讨论!
    但大家可能还不太明白我的意识,我再具体一点:
    我将长时间代码(只有几秒钟)加入 ARX 2002 自带的例子“modal”中,如下:
void modalDlgTest()
{
    // When resource from this ARX app is needed, just
    // instantiate a local CAcModuleResourceOverride
    CAcModuleResourceOverride resOverride;

    CTestDlg dlg(CWnd::FromHandle(adsw_acadMainWnd()));
    dlg.DoModal();

    ads_point P1;
    SET_POINT(P1, 100, 600, 0); //这是自定义的宏
        // 开始绘制点(同位置重复30次)
    for (long i=1; i <= 30; i++)
    {
        ads_command(RTSTR,"-insert",  RTSTR,"B1268",  RT3DPOINT,P1,
                                RTSTR,"1",  RTSTR,"1",  RTSTR,"0",  RTNONE);
    }
}

    以上代码再简单不过了,大家可以试一试(要加入对话框资源)。

    再强调一下,问题在下列情况发生:
1. 当弹出对话框后,如果用鼠标拖动对话框一下(哪怕一点点),再按 OK 按钮。
2. 当按对话框上的 “Open” 按钮,打开文件并返回该对话框后,再按 OK 按钮。

    对于上述二种情况,对话框的显示失去控制,被弄得百孔千疮(此时AutoCAD图形编辑窗口中心坐标在(100,600)附近),直到程序结束时才消失。

    如果大家无法解决,我也只好暂时将此问题归为AutoCAD及其 ARX 的 BUG,不再研究。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-20 22:28 , Processed in 0.197947 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表