xiaoyingzi 发表于 2011-8-9 12:12:34

求助:如何将两个打开的dwg窗口左右均布

想将两个打开的dwg窗口左右均布,
用vla-put-widt可以改变窗口大小:
(setqAcadObject   (vlax-get-acad-object)
       AcadDocument (vla-get-ActiveDocument Acadobject)
       Application(vla-get-Application Acaddocument)
)
(setq w1 (vla-get-width AcadDocument))
(vla-put-width AcadDocument (* 0.5 w1))
但是窗口定位却无法实现,
用vla-put-windowtop 和vla-put-windowleft只能改变整个acad窗口的位置
(vla-put-windowtop Application 0)
(vla-put-windowleft Application w1)

Qwer1243 发表于 2021-8-24 15:40:49

本帖最后由 Qwer1243 于 2021-8-24 15:46 编辑

xiaoyingzi 发表于 2012-8-31 08:55(vl-load-com)

(defun c:docwinleft (/ app doc wrap hwnd w1 h1)

下面是我的要实现图片展示和代码,再次感谢楼主和高飞鸟大师C:\Users\Administrator\Desktop\jdfw.gif
;;;----------------------
;;;;;;;;;不对称分屏;;;;;;
;;;----------------------
(defun c:sp ()
    (vl-load-com)
    (setq AcadObject   (vlax-get-acad-object)
          AcadDocument (vla-get-activedocument AcadObject)
          mSpace       (vla-get-modelspace AcadDocument)
          wrap               (vlax-create-object "DynamicWrapperX") ;创建DynamicWrapperX对象
    )
    (vlax-invoke wrap 'Register "USER32" "MoveWindow" "i=llllll" "r=l") ;注册MoveWindow函数
    (setq DocumentSel (vla-get-documents AcadObject))
    (command "syswindows" "V")
    (vlax-for Document DocumentSel
      (setq hwnd (vla-get-hwnd Document)) ;当前文档句柄
      (if (equal Document (vla-get-activedocument AcadObject))
            (vlax-invoke wrap 'MoveWindow hwnd 600 0 1255 784 1)
            (vlax-invoke wrap 'MoveWindow hwnd 0 0 600 784 1)
      )
    )
    (vlax-release-object wrap)
    (princ)
)

Qwer1243 发表于 2021-8-24 15:29:23

xiaoyingzi 发表于 2012-8-31 08:55
(vl-load-com)

(defun c:docwinleft (/ app doc wrap hwnd w1 h1)


找了好几天相关的资料,今天终于找到了 非常感谢你提供了思路和灵感 也感谢高飞鸟大师

pxt2001 发表于 2023-1-20 12:46:38

edsion24 发表于 2021-8-25 08:55
执行不起来啊

看这个帖子http://bbs.mjtd.com/forum.php?mod=viewthread&tid=186586&page=1&extra=#pid937834

xiaoyingzi 发表于 2011-8-11 23:09:00

本帖最后由 xiaoyingzi 于 2011-8-12 19:15 编辑

用纯lisp好像不好解决,终于用lisp下调用api解决,
(vl-load-com)
(defun c:11 (/ app doc wrap hwnd w1 h1)
(setq app (vlax-get-acad-object))                                                   ;CAD程序对象
(setq doc (vla-get-ActiveDocument app))                                       ;当前文档对象
(setq wrap (vlax-create-object "DynamicWrapperX"))                   ;创建DynamicWrapperX对象
(setq hwnd (vla-get-hwnd doc))                                                   ;当前文档句柄
(vla-put-windowState doc 3)                                                          ;当前文档窗口最大化
(setq w1 (fix (* 0.5 (vla-get-width doc))))                                    ;设w1为当前文档窗口宽度的一半
(setq h1 (fix (vla-get-Height doc)))                                                 ;设h1为当前文档窗口高度
(vla-put-windowState doc 1)
(vlax-invoke wrap 'Register "USER32" "MoveWindow" "i=llllll" "r=l");注册MoveWindow函数
(vlax-invoke wrap 'MoveWindow hwnd 0 -20 w1 h1 1)                   ;移动当前文档窗口,并改窗口宽度为最大化时的一半
(vlax-release-object wrap)
(princ)
)

半听可乐 发表于 2012-8-30 20:06:03

本帖最后由 半听可乐 于 2012-8-30 20:06 编辑

xiaoyingzi 发表于 2011-8-11 23:09 http://bbs.mjtd.com/static/image/common/back.gif
用纯lisp好像不好解决,终于用lisp下调用api解决,
(vl-load-com)
(defun c:11 (/ app doc wrap hwnd w1...

这个好像实现不了哦

xiaoyingzi 发表于 2012-8-31 08:55:46

(vl-load-com)

(defun c:docwinleft (/ app doc wrap hwnd w1 h1)
(setq app (vlax-get-acad-object))                                     ;CAD程序对象
(setq doc (vla-get-ActiveDocument app))                             ;当前文档对象
(setq wrap (vlax-create-object "DynamicWrapperX"))               ;创建DynamicWrapperX对象
(setq hwnd (vla-get-hwnd doc))                                     ;当前文档句柄
(vla-put-windowState doc 3)                                        ;当前文档窗口最大化
(setq w1 (fix (* (vla-get-width doc) 0.5)))                        ;设w1为当前文档窗口宽度的一半
(setq h1 (fix (vla-get-Height doc)))                               ;设h1为当前文档窗口高度
(vla-put-windowState doc 1)                                        ;当前文档窗口正常
(vlax-invoke wrap 'Register "USER32" "MoveWindow" "i=llllll" "r=l");注册MoveWindow函数
(vlax-invoke wrap 'MoveWindow hwnd -4 -25 (+ w1 7) h1 1)         ;移动当前文档窗口至左侧,并改窗口宽度为最大化时的一半
(vlax-release-object wrap)
(princ)
)

(defun c:docwinright (/ app doc wrap hwnd w1 h1)
(setq app (vlax-get-acad-object))                                     ;CAD程序对象
(setq doc (vla-get-ActiveDocument app))                             ;当前文档对象
(setq wrap (vlax-create-object "DynamicWrapperX"))               ;创建DynamicWrapperX对象
(setq hwnd (vla-get-hwnd doc))                                     ;当前文档句柄
(vla-put-windowState doc 3)                                        ;当前文档窗口最大化
(setq w1 (fix (* (vla-get-width doc) 0.5)))                        ;设w1为当前文档窗口宽度的一半
(setq h1 (fix (vla-get-Height doc)))                               ;设h1为当前文档窗口高度
(vla-put-windowState doc 1)                                        ;当前文档窗口正常
(vlax-invoke wrap 'Register "USER32" "MoveWindow" "i=llllll" "r=l");注册MoveWindow函数
(vlax-invoke wrap 'MoveWindow hwnd (- w1 3) -25 (+ w1 3) h1 1)   ;移动当前文档窗口至右侧,并改窗口宽度为最大化时的一半
(vlax-release-object wrap)
(princ)
)


(defun c:docwinmax( / app doc)                                       
(setq app (vlax-get-acad-object))                                     ;CAD程序对象
(setq doc (vla-get-ActiveDocument app))                             ;当前文档对象
(vla-put-windowState doc 3)                                        ;当前文档窗口最大化
(princ)
)

(defun c:docwinsize( / app doc w1 h1 w h)   
(setq w (getint "\n输入宽:"))
(setq h (getint "\n输入高:"))
(setq app (vlax-get-acad-object))                                     ;CAD程序对象
(setq doc (vla-get-ActiveDocument app))                             ;当前文档对象
(vla-put-width doc w)                                              ;修改当前文档窗口跨度为w
(vla-put-height doc h)                                             ;修改当前文档窗口高度为h
(princ)
)

xiaoyingzi 发表于 2012-8-31 08:59:20

其实用acad自带命令syswindows也可很方便的实现,不过窗口还有标题栏

xiaoyingzi 发表于 2012-8-31 09:02:03

上面程序要注册dynwrapx.dll,具体可看高飞鸟大大的帖子,所以从实用性来说还是acad自带命令比较好

xiaxiang 发表于 2012-8-31 09:06:33

docwinleftdocwinright 这两个命令执行后都报错:参数类型错误: VLA-OBJECT nil
已经加载(vl-load-com)
程序执行完后返回syswindows已经得到的结果
不知何故

xiaoyingzi 发表于 2012-8-31 09:13:42

本帖最后由 xiaoyingzi 于 2012-8-31 09:56 编辑

xiaxiang 发表于 2012-8-31 09:06 http://bbs.mjtd.com/static/image/common/back.gif
docwinleftdocwinright 这两个命令执行后都报错:参数类型错误: VLA-OBJECT nil
已经加载(vl-load-com)...

上面程序要注册dynwrapx.dll,程序实现效果:

自带命令syswindows也可很方便的实现,不过窗口还有标题栏,效果如下



szxgsh 发表于 2013-6-22 20:04:15

这个东西用处有限,节省不了多少时间。
能不能像下面一样做一个,估计会比较方便:
比如,同时开了9个文件,我只想让其中的2个或N个文件均布于窗口。
我的这个思路看是否可以行:
输入命令后,立即出现一个对话框,这个对话框显示所有打开的文件的列表。然后勾选2个或3个文件均布与窗口。
页: [1] 2
查看完整版本: 求助:如何将两个打开的dwg窗口左右均布