用下面的代码可以实现调用外部程序作为MDI子窗体,那么如何实现,调用的程序无边框、不能移动、在MDI托盘内平铺显示呢?
Option Explicit
Private Declare Function SetParent Lib "user32.dll" ( _
ByVal hWndChild As Long, _
ByVal hWndNewParent As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPrivate Const WS_EX_MDICHILD As Long = &H40&
Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE As Long = (-20)
Private Const WS_CHILD = &H40000000
Private Const WS_CHILDWINDOW = (WS_CHILD)'把计算器作为子窗体
Private Sub MDIForm_Load()
Dim lngCalculator As Long
Dim lngStyle As Long
Dim lngExStyle As Long
Shell "calc.exe", vbNormalFocus
lngCalculator = FindWindow(vbNullString, "计算器")
If lngCalculator > 0 Then
SetParent lngCalculator, Me.hwnd
SetWindowLong lngCalculator, GWL_EXSTYLE, WS_EX_MDICHILD
End If
End Sub
Option Explicit
Private Declare Function SetParent Lib "user32.dll" ( _
ByVal hWndChild As Long, _
ByVal hWndNewParent As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPrivate Const WS_EX_MDICHILD As Long = &H40&
Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE As Long = (-20)
Private Const WS_CHILD = &H40000000
Private Const WS_CHILDWINDOW = (WS_CHILD)'把计算器作为子窗体
Private Sub MDIForm_Load()
Dim lngCalculator As Long
Dim lngStyle As Long
Dim lngExStyle As Long
Shell "calc.exe", vbNormalFocus
lngCalculator = FindWindow(vbNullString, "计算器")
If lngCalculator > 0 Then
SetParent lngCalculator, Me.hwnd
SetWindowLong lngCalculator, GWL_EXSTYLE, WS_EX_MDICHILD
End If
End Sub
解决方案 »
- VBA中关于Trim函数用法,出现了一个问题,麻烦高手帮忙
- 数据库字段的类型为BIT 用CHECK 控件为什么会报错
- 曾经发广告被干倒,VB荣誉分10,总荣誉分48,想起来以前就后悔,CSDN能不能给次重新做人机会啊。
- 请问用VB怎么才能把1个数据库里的表全部读入LISTBOX里?
- ?几个简单的问题
- 请问如何选中datagrid的第i行第j列的单元格??
- ????如何判断DSN是否存在????,如何列举所有的DSN
- TDBGrid控件的问题
- 如何编写直写内存的VXD?
- 58分,居然没有人要,再加20分如何!!
- VB版第三期人物---yoki
- 请问:我用控件adodc和datagrid就从oracle9i中读取了数据,请问用adodb怎样连接oracle9i(不用控件adodc)?
ByVal hWndChild As Long, _
ByVal hWndNewParent As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
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
Private Const WS_EX_MDICHILD As Long = &H40&
Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE As Long = (-20)
Private Const WS_CHILD = &H40000000
Private Const WS_CHILDWINDOW = (WS_CHILD)
Private Const SWP_NOMOVE = &H2
Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As rect) As Long
Private Type rect
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private rect As rect
Private Const SWP_SHOWWINDOW = &H40
'把计算器作为子窗体
Private Sub MDIForm_Load()
Dim lngCalculator As Long
Dim lngStyle As Long
Dim lngExStyle As Long
Me.Show
Form2.BorderStyle = 0
Form2.Show
GetClientRect Me.hwnd, rect '获取当前窗体的客户区域大小
' Shell "calc.exe", vbNormalFocus
' lngCalculator = FindWindow(vbNullString, "计算器")
lngCalculator = Form2.hwnd
If lngCalculator > 0 Then
SetParent lngCalculator, Me.hwnd
SetWindowLong lngCalculator, GWL_EXSTYLE, WS_EX_MDICHILD
SetWindowPos lngCalculator, 0, 0, 0, rect.Right - rect.Left, _
rect.Bottom - rect.Top, SWP_SHOWWINDOW '设置窗体大小和位置
End If
End Sub