iwzw 发表于 2003-10-12 14:47:00

efan2000发表于2003-10-12 14:27:00static/image/common/back.gif不是不能,由于将ACAD的窗口尺寸设置为VB窗体客户区的大小,因而两个窗口的右下角位置几乎是一样的,所以拖动的时候可能真正的是拖动ACAD的窗口。
这种情况可以将ACAD的窗口尺寸设置的小一些



把acad的窗口尺寸调小后,还是拖不动。因为一拖动,程序的焦点就从vb窗口转到了acad窗口。

efan2000 发表于 2003-10-12 16:32:00

本帖最后由 作者 于 2003-10-13 12:28:22 编辑

是在程序中定义,而不是手工调整。

将程序中的:
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
就可以了,当然如果需要ACAD窗口与VB窗体的间隔大点,可将5替换成10、20等。

netrb 发表于 2003-10-13 11:25:00

为什么在Win98下不能自动启动AutoCAD2002呢?必须先启动AtuoCAD2002后,再运行VB程序AutoCAD窗口才能打开呀!!!

topirol 发表于 2003-10-13 11:56:00

很好,但就是不能把cad的标题隐藏起来(南方的cass就做的很好)

将程序中的r.Right - r.Left和r.Bottom - r.Top同时减去一个数值,还是不行。

有什么好办法吗?

efan2000 发表于 2003-10-13 12:38:00

前面有错,是修改SetWindowPos lHwnd, 0, Form1.ScaleLeft, Form1.ScaleTop, Form1.ScaleWidth, Form1.ScaleHeight, 0这一句。
隐藏窗口的标题需要另外的API函数。
下面的例子中acadhwnd代表ACAD应用程序的句柄,也就是前面使用两次GetParent获得的值。

    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Const GWL_STYLE = (-16)
    Const WS_CAPTION = &HC00000
   
    Private Sub Test()
   Dim L As Long
   L = GetWindowLong(acadhwnd, GWL_STYLE)
   L = L And Not (WS_CAPTION)
   L = SetWindowLong(acadhwnd, GWL_STYLE, L)
    End Sub

topirol 发表于 2003-10-13 13:10:00

很好,收获不少阿!!谢谢。

但现在效果还不是很理想(因为用户还是可以改变cad窗口的大小,而VB窗口不能相应改变),看看南方的界面吧,看如何实现呢?

efan2000 发表于 2003-10-13 13:22:00

这个界面你觉的跟ACAD本身有什么不同?它是嵌套在其它窗体中的?
有区别的应该是窗口的标题和图标吧。使用SetWindowText和SetIcon就可以实现了,根据不必须要那么复杂。应该说它的运行过程是:首先启动自己的程序,在其中加载ACAD,更改它的标题和图标。接着是加载自己的配置文件,以及菜单和工具栏,接下来是加载自己的程序(Lisp、ARX、VBA之类的),最后完成加载,退出本身的启动,把后续的操作交给ACAD。

topirol 发表于 2003-10-13 13:40:00

哦,原来如此!
SetWindowText的用法查msdn可以查到,但SetIcon的用法没有!

efan2000 发表于 2003-10-13 13:51:00

又记错了,那是我以前写的一个函数Public Function SetIcon(byval Hwnd as long,byval IconFileName as string),应该使用LoadImage和SendMessage来设置。

更改窗口的图标见下面的代码:


Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_SETICON = &H80
Private Const IMAGE_ICON = 1
Private Const LR_LOADFROMFILE = &H10

Public Sub SetIcon()
    Dim hIcon As Long
   
    'FileName 图标文件, HwndACAD应用程序的句柄
    hIcon = LoadImage(0&, FileName, IMAGE_ICON, 16, 16, LR_LOADFROMFILE)
    If hIcon <> 0 Then
      Call SendMessage(Hwnd, WM_SETICON, 0, ByVal hIcon)
    End If
End Sub

topirol 发表于 2003-10-13 16:30:00

efan2000版主,还有问题要请教:

如何获得ACAD应用程序的句柄?

acadapp没有 hWnd 属性 !
页: 1 2 [3] 4 5 6 7 8 9
查看完整版本: [讨论]如何令autocad软件窗口能够出现在VB窗体中?