明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索

[讨论]如何令autocad软件窗口能够出现在VB窗体中?

  [复制链接]
发表于 2003-10-9 13:47 | 显示全部楼层
现在的情况应该是AutoCAD的对象不能创建,可能安装了多个版本的ACAD。
 楼主| 发表于 2003-10-9 13:55 | 显示全部楼层
以前装过14,2000,2002,2004。现在只保留了2000,可能注册表没有清干净。
遇到这种情况怎么办呢?
发表于 2003-10-9 13:57 | 显示全部楼层
将AutoCAD.Application更改为AutoCAD.Application.15试试。如果不行,要清除注册表,重装ACAD了。
 楼主| 发表于 2003-10-9 14:13 | 显示全部楼层
还是不行!呵呵,看来什么时候我给重装系统再看看。
Set a = CreateObject("AutoCAD.Application")将这句改为
Set a = GetObject(, "AutoCAD.Application.15")再先加载ACAD2000
终于看到效果了!!很好,谢谢efan2000。
发表于 2003-10-9 18:58 | 显示全部楼层
运行这个窗口吧,ef2000的代码一次就通过,没有问题的!
 楼主| 发表于 2003-10-10 23:40 | 显示全部楼层
在窗体中显示的是autocad全界面,而且窗体不足够大,就不能全部包含autocad界面。可以令autocad界面能正好缩放在给定的窗体内吗?或者也能令autocad界面能出现在某个控件里吗(比如picture,image之类的控件)?
发表于 2003-10-11 22:02 | 显示全部楼层
重新修改了一下,支持VB的窗体缩放时ACAD的窗口自动跟随缩放。


  1. Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
  2. Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
  3. Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
  4. Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

  5. Private Type RECT
  6.     Left As Long
  7.     Top As Long
  8.     Right As Long
  9.     Bottom As Long
  10. End Type

  11. Private acadApp As Object
  12. Private lHwnd As Long '保存ACAD应用程序的窗口句柄
  13. Private lState As Long '保存ACAD的初始窗口状态
  14. Private r As RECT '保存ACAD的初始窗口位置

  15. Private Sub Form_Load()
  16.    
  17.     On Error GoTo ErrTrap
  18.     Set acadApp = GetObject(, "AutoCAD.Application")
  19.     acadApp.Visible = True
  20.     lHwnd = GetParent(GetParent(acadApp.Activedocument.hwnd))
  21.     If lHwnd = 0 Then Exit Sub
  22.     lState = acadApp.WindowState
  23.     acadApp.WindowState = 1 '设置ACAD的窗口状态为默认,用于保存窗口位置。
  24.     GetWindowRect lHwnd, r
  25.     SetParent lHwnd, Form1.hwnd
  26.     Form1.ScaleMode = vbPixels '将VB窗体默认的缇单位改为以像素为单位。
  27.     SetWindowPos lHwnd, 0, Form1.ScaleLeft, Form1.ScaleTop, Form1.ScaleWidth, Form1.ScaleHeight, 0
  28.     Exit Sub
  29.    
  30. ErrTrap:
  31.     On Error GoTo 0
  32. End Sub

  33. Private Sub Form_Resize()
  34.     SetWindowPos lHwnd, 0, Form1.ScaleLeft, Form1.ScaleTop, Form1.ScaleWidth, Form1.ScaleHeight, 0
  35. End Sub

  36. Private Sub Form_Unload(Cancel As Integer)
  37.     If lHwnd = 0 Then Exit Sub
  38.     SetParent lHwnd, 0
  39.     SetWindowPos lHwnd, 0, r.Left, r.Top, r.Right - r.Left, r.Bottom - r.Top, 0
  40.     acadApp.WindowState = lState
  41.     Set acadApp = Nothing
  42. End Sub
 楼主| 发表于 2003-10-12 09:55 | 显示全部楼层
efan真是高!!
API函数功能真的强大,这段代码对于想通过在VB窗体实现autocad编辑操作的朋友太有借鉴意义了!再次感谢efan斑竹!
发表于 2003-10-12 13:42 | 显示全部楼层
呵呵,版主高明!更进一步了!
还有一个问题就是,vb的窗体不能用鼠标拖动放大和缩小。
发表于 2003-10-12 14:27 | 显示全部楼层
本帖最后由 作者 于 2003-10-13 12:24:40 编辑

不是不能,由于将ACAD的窗口尺寸设置为VB窗体客户区的大小,因而两个窗口的右下角位置几乎是一样的,所以拖动的时候可能真正的是拖动ACAD的窗口。
这种情况可以将ACAD的窗口尺寸设置的小一些。比如:宽度Form1.ScaleWidth-5,高度Form1.ScaleHeight-5,这样就不会重叠了。

变更下面的一句:
SetWindowPos lHwnd, 0, Form1.ScaleLeft, Form1.ScaleTop, Form1.ScaleWidth, Form1.ScaleHeight, 0
更改为:
SetWindowPos lHwnd, 0, Form1.ScaleLeft, Form1.ScaleTop, Form1.ScaleWidth-5, Form1.ScaleHeight-5, 0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 09:19 , Processed in 0.364054 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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