1,如何使MDIFORM中的最大化按钮失效
2,如何使一个做出一个就象VB里面的工程窗口和属性窗口那样,可以一直可见,在做前面,不会被打开的其他的子form盖住,但又不影响其他子FORM的显示,而且还可以移动那样的。
3,如何使子form不超出mdiform的范围,因为一旦把它移动到比较靠外的地方,mdiform就会出现难看的滚动条,请问这个东西怎么做,最好能给个例子
4,怎么在菜单中加入就象word中那样的横条可以把不同类别的菜单项分开。
2,如何使一个做出一个就象VB里面的工程窗口和属性窗口那样,可以一直可见,在做前面,不会被打开的其他的子form盖住,但又不影响其他子FORM的显示,而且还可以移动那样的。
3,如何使子form不超出mdiform的范围,因为一旦把它移动到比较靠外的地方,mdiform就会出现难看的滚动条,请问这个东西怎么做,最好能给个例子
4,怎么在菜单中加入就象word中那样的横条可以把不同类别的菜单项分开。
解决方案 »
- Line画线 关于前置问题
- 有谁能帮我解决以下三个画图问题?
- 为什么不能更新RECORDSET?
- VB采用DOM加载XML文件出错!帮忙阿!
- 请问哪儿有C/S 三层架构代码啊?
- 请教大侠打开htlmwen文件的命令??
- 非常感谢 James0001(See-Plus-Plus) ,再问如何让刷子无色的地方透明
- 请问,我想实现表格输入的功能,还可以保存,打印,导入,用什么控件好?
- 怎么用vb的rptreport,rptlabel,rptTextBox 控件?
- y1g1y1(袁飞☆曾经沧海难为水,除却VB不是云☆),please come in.
- 谁知道如何获取一个Access数据库中的所有表名
- 如何在Datareport和外面间传送参数?
我也曾经想要做一个类似vb界面,但是没有成功,
不过可以使用setparent API 函数设置设置从属关系。
胡说一气的,别介意。
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 Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongConst conHwndTopmost = -1
Const conHwndNoTopmost = -2
Const conSwpNoActivate = &H10
Const conSwpShowWindow = &H40Private Sub Combo1_GotFocus()
'无论何时只要 ComboBox 收到焦点
'在这个例子中都会自动放下 ComboBox 控件的列表部分,用TAB键测试
Const CB_SHOWDROPDOWN = &H14F
Dim Tmp
Tmp = SendMessage(Combo1.hwnd, CB_SHOWDROPDOWN, 1, ByVal 0&)
End SubPrivate Sub munTopMost_Click()
' 从菜单中加入或删除检查标志.
munTopMost.Checked = Not munTopMost.Checked
If munTopMost.Checked Then
' 打开 TopMost 属性.
SetWindowPos hwnd, conHwndTopmost, 0, 0, 0, 0, conSwpNoActivate Or conSwpShowWindow
Else
' 关闭 TopMost 属性.
SetWindowPos hwnd, conHwndNoTopmost, 0, 0, 0, 0, conSwpNoActivate Or conSwpShowWindow
End If
End Sub
'=====================================
Public Const GWL_STYLE = (-16)
Public Const GWL_WNDPROC = (-4)
Public Const WS_MAXIMIZEBOX = &H10000
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOACTIVATE = &H10
Public Const SWP_SHOWWINDOW = &H40
Public Const WM_MOVING = &H216
Public Const WM_MOVE = &H3Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypeDeclare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
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
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" ( _
ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
ByRef pDst As Any, _
ByRef pSrc As Any, _
ByVal nLen As Long)
Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As LongPrivate mpfnWndProc As Long
Private mfrmHooked As FormPublic Sub EnableMaxButton(ByVal frm As Form, ByVal Enabled As Boolean)
If frm Is Nothing Then Exit Sub
Dim lngWndStyle As Long
lngWndStyle = GetWindowLong(frm.hwnd, GWL_STYLE)
If Enabled Then
SetWindowLong frm.hwnd, GWL_STYLE, lngWndStyle Or WS_MAXIMIZEBOX
Else
mlngWndStyle = GetWindowLong(frm.hwnd, GWL_STYLE)
SetWindowLong frm.hwnd, GWL_STYLE, lngWndStyle And (Not WS_MAXIMIZEBOX)
End If
End SubPublic Sub KeepTopMost(ByVal frm As Form, ByVal TopMost As Boolean)
If frm Is Nothing Then Exit Sub
If TopMost Then
SetWindowPos frm.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
Else
SetWindowPos frm.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End If
End SubPublic Sub HookForm(ByVal frm As Form, ByVal HookFlag As Boolean)
If frm Is Nothing Then Exit Sub
If HookFlag Then
Set mfrmHooked = frm
mpfnWndProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, AddressOf WndProc)
Else
Set mfrmHooked = Nothing
SetWindowLong frm.hwnd, GWL_WNDPROC, mpfnWndProc
End If
End SubPublic Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case WM_MOVE
Case WM_MOVING
Dim rc As RECT
CopyMemory rc, ByVal lParam, Len(rc)
Debug.Print rc.Left, rc.Top, rc.Right, rc.Bottom
End Select
WndProc = CallWindowProc(mpfnWndProc, hwnd, uMsg, wParam, lParam)
End Function
'=====================================
'=====================================
'In MDIForm
'=====================================
Private Sub MDIForm_Load()
EnableMaxButton Me, False
Form1.Show 'Form1.MDIChild = True
Form3.Show , Me 'Form3.MDIChild = False
KeepTopMost Form3, True
End Sub
'=====================================
2 上例
3 暂时没做出来
4 Caption可以使用"-"来分割菜单项
如果想子窗体不超过MDI用代码,控制坐标看看,应该可以的!!
乱说!别介意!
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If (Button = vbLeftButton) And (Me.WindowState = 0) Then
MousePointer = vbSizeAll
mX = X
mY = Y
End IfEnd SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim H As Long
Dim V As Long
On Error Resume Next
If (Button = vbLeftButton) And (Me.WindowState = 0) Then
'如果鼠标位置没有变化,表示没有移动。此时当退出过程,提高程序运行效果。
If (X = mY) And (Y = mY) Then Exit Sub
H = Me.Left + X - mX
V = Me.Top + Y - mY
If H <= 0 Then
H = 0
ElseIf H >= (MDIform.Width - Me.Width) Then
H = MDIform.Width - Me.Width
End If
If V <= 0 Then
V = 0
ElseIf V >= (MDIform.Height - Me.Height) Then
V = MDIform.Height - Me.Height
End If Me.Move H, V
End If
End SubPrivate Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
MousePointer = vbDefault
'如果有右键菜单,在这里弹出右键菜单
If Button = vbRightButton Then
Call PopupMenu(mnuRight)
End If
End Sub
dim mX as long
dim mY as long