明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4908|回复: 11

无模式对话框设计经验小结

  [复制链接]
发表于 2014-1-5 00:28 | 显示全部楼层 |阅读模式
本帖最后由 masterlong 于 2014-1-5 10:17 编辑

odcl确实强大
但要用好确实不容易
一点小小经验供参考
如有谬误欢迎指正

首先是主对话框名称不能含大字符
开始不知道用了中文
怎么也无法显示对话框
后来才找到问题结症

鼠标移出对话框自动执行命令
这是一个很有趣的功能
主对话框事件选中“OnMouseMovedOff”
同时取消“保持焦点”选项

如果主对话框有多个分区
希望移出不同的分区执行不同的命令
办法是
在不同的分区内设定“PictureBox”控件
控件背景色设定与主对话框相同
相应事件选中“OnMouseEntered”
并为同一特定参数设置不同的值
以便最后进行判别

以上图片控件的事件
不建议在移出时为特定参数赋值
虽然这样不是不行
但如果图片边界距主对话框边界太近
则可能程序的反应不够及时
导致运行结果与预想不同

如果自动执行命令需要有“选择”操作
比如ssget、entsel、nentsel等
如果没有选择而是鼠标又移入对话框
再移出时会提示“不能重复进入lisp”
相应的解决方案有两个
在主对话框鼠标移出事件中
一是添加对话框隐藏和恢复代码
(dcl_Form_Hide   xxxx_yyyy   T/nil  )
二是临时禁止一切鼠标移动事件
第一种方案相对简单可靠
第二种方案较难控制
对话框中有较多鼠标事件时不建议采用

右键重复命令
很多人在问
这里提供一个解决方案
利用SCRIPT命令
示例代码如下
(setq @zss_scr (open "c:\\QGY_temp\\@zss_scr.scr" "w"))
(write-line "zsx" @zss_scr)
(close @zss_scr)
(command "script" "c:\\QGY_temp\\@zss_scr.scr")
这样就可以实现重复命令

上述代码不能用在关闭对话框代码中
(dcl_Form_Close xxxx_yyyy)之后
可以执行其它代码
也可以调用子程序
但是不会执行后续的command或vl-cmdf函数

在dcl_Form_Close之后的代码
不要含有屏幕输出类的函数
比如(princ "程序结束")
如果确实需要可以加到close之前

评分

参与人数 1明经币 +1 收起 理由
004 + 1 很给力!

查看全部评分

 楼主| 发表于 2014-1-10 20:32 | 显示全部楼层
本帖最后由 masterlong 于 2014-1-10 21:39 编辑

上一贴我的期望是在改变选项时
改变选项的图像显示用以醒目
实践证明不可行
同时还有一些发现

选项的OnChanged事件
非常奇怪
不知道是BUG还是有意的设置
如果允许该事件
它在执行某些系统内部操作的时候会被强制执行
比如在dcl_Form_Show
OnChanged事件会被强制执行一次
并且它会以选项id=0为执行的基础
dcl_TabStrip_SetCurSel
也会强行执行一次
以set的目标ID为执行的基础

比如下面的代码
(defun c:ZSS/ZSSBZ/zss选项#OnChanged (ItemIndex /)
        (cond
                ((= ItemIndex 0)(princ "啊啊啊啊啊啊啊"))
                ((= ItemIndex 1)(princ "天天天天天天天"))
                ((= ItemIndex 2)(princ "呀呀呀呀呀呀呀"))
        )
(princ)
)
dcl_Form_Show时就会自动输出 "啊啊啊啊啊啊啊 "
初始化时若指定选项2时会自动输出 " 呀呀呀呀呀呀呀 "
证明这些内部操作确实是强制调用了OnChanged事件

dcl_TabStrip_SetCurSel时调用OnChanged事件可以理解
显示对话框时OnChanged (0) 就不能理解了
因为一般来说用户希望的
是显示上一次关闭对话框时的选项

所以这个事件最好不要选中
如果选中不要在对应程序中
包含不必要的屏幕输出
在执行并接受用户指定操作时
使用dcl-TabStrip-GetCurSel
提取当前选项id并执行相应程序

如果必须要在切换选项时执行某些操作
我现在的处理办法是
在dcl_Form_Show 之前
设置一个参数(setq zss_Init_end Nil)
在初始化的最后(setq zss_Init_end T)
再在OnChanged 中设置
(if zss_Init_end
    (progn
     .......
    )
)

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2014-1-5 12:12 | 显示全部楼层
本帖最后由 masterlong 于 2014-1-5 12:14 编辑

补充一点
采用分区图片感应鼠标时
在相应的鼠标移入事件中
最好再添加几句代码
1.图片自身不可见
(dcl_Control_SetVisible xxxx_yyyy_鼠标感应区1 Nil)
2.其它图片可见
(dcl_Control_SetVisible xxxx_yyyy_鼠标感应区2 T)

第一句代码的作用
在图片区的空白处点击时
不会因为图片的前置遮盖住其它控件
第二句代码的作用
鼠标在对话框内不同图片区域反复移动时
不会因为第一句代码导致感应失效

以上代码在不同的图片区均需设置
在移出对话框的事件中
也同时需要恢复所有图片可见
回复 支持 1 反对 0

使用道具 举报

发表于 2022-7-7 11:04 | 显示全部楼层
很有用的分享,谢谢
 楼主| 发表于 2014-1-5 12:48 | 显示全部楼层
本帖最后由 masterlong 于 2014-1-6 05:07 编辑

顺便请教两个问题
无模式对话框启动时
只希望在当前dwg有效
既切换dwg窗口或关闭dwg时
对话框自动关闭
这个要求能否实现、如何实现?

这个问题基本解决
OnDocActivated
OnEnteringNoDocState
两项选中
对应事件中close对话框
不过新开dwg窗口时
对话框还是会显示
切换窗口时才会自动关闭
不过不影响大局



使用TabStrip控件时
每次启动均显示第一个tab
即使已经指定了显示其它tab
界面的布置没问题
但tab的显示是错的
截图如下

希望达到的效果




实际的效果

如上可见
tab的显示是错误的

本帖子中包含更多资源

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

x
 楼主| 发表于 2014-1-10 23:00 | 显示全部楼层
odcl里的文本控件的功能是很强的
比如它可以设定OnKeyDown事件
并提供三个参数供使用
可以通过判定它们的值
来达到某些要求

比如我在自己的程序中
设定了当输入字符为空格时
执行“确认”
设定按下shift键时
窗口内的文字转换大小写
发表于 2014-3-20 14:39 | 显示全部楼层
谢谢楼主的总结
发表于 2019-5-18 09:21 | 显示全部楼层
谢谢大佬的分享
发表于 2019-5-22 10:57 | 显示全部楼层
谢谢楼主分享
发表于 2021-2-22 01:00 | 显示全部楼层
好,
谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-25 18:33 , Processed in 0.311836 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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