首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB多个窗体如何同步移动位置

2013-01-04 
VB多个窗体怎么同步移动位置?本帖最后由 sdjnliuxu 于 2012-12-17 00:26:02 编辑有3个窗体,Form1、Form2、Fo

VB多个窗体怎么同步移动位置?
本帖最后由 sdjnliuxu 于 2012-12-17 00:26:02 编辑 有3个窗体,Form1、Form2、Form3,设置固定位置打开

我是用按钮切换窗体的

比如窗体1里:
Private Sub Command1_Click()
Form2.Show
Unload Me
End Sub

问题是:3个窗体单独打开哪一个的时侯,如果移动了窗体,
点按钮再打开另一个窗体时,位置会自动回到设置的固定位置打开
而不是跟随前一个窗体的位置?

请问怎么设置才能3个窗体单独打开哪一个,在屏幕上移动位置后,
再打开其他窗体时,位置保持移动后的位置,而不是原来窗体设定的位置??

我是新学的VB,请高手们一定帮帮忙!多谢啦!!



[解决办法]
窗体关闭时,记录位置,计算出其他2个窗体的位置,下次打开任意一个窗体就移动到该位置。
此方法适用于运行中,如果退出程序再打开程序也要记录位置的,只有写入文件装载的时候再读取了……
[解决办法]
同意楼上,需要保存打开的最后一个窗体的位置,然后让新打开的窗体移动那个位置上去.

你可以在一个标准模块中定义两个变量,分别保存最后使用的窗体的TOP与LEFT:

'位于标准模块中
public lastTop as single,lastLeft as single


接着,在需要保存位置的窗体中需要在其unload事件里保存位置:

private sub formxx_unload(cancel as integer)
    lasttop=me.top
    lastleft=me.left
end sub


然后在显示窗体时,移动过去就好了:

Private Sub Command1_Click()
    load form2            '此时窗体不可见
    form2.move lastleft,lasttop    '移动位置
    Form2.Show             '使窗体可见
    Unload Me
End Sub

[解决办法]

'创建一个工程,包含Form1、Form2和一个标准模块,Form1是启动对象
'From1代码
Option Explicit

Private Sub Form_Load()
    prevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
    SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf WndProc
    Form2.Show
End Sub

Private Sub Form_Unload(Cancel As Integer)
    SetWindowLong Me.hwnd, GWL_WNDPROC, prevWndProc
End Sub
'标准模块代码
Option Explicit
Public 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
Public Declare Function SetWindowLong Lib "user32 " Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetWindowLong Lib "user32 " Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_MOVE = &H3
Public Const WM_SIZE = &H5
Public prevWndProc As Long                   ' ' ' '默认窗口程序地址

Public Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error GoTo ShowErr
    '处理窗体移动的消息


    If Msg = WM_MOVE Or Msg = WM_SIZE Then
        Form2.Move Form1.Left, Form1.Top + Form1.Height
    End If
    WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
    Exit Function
ShowErr:
    MsgBox Err.Source & "- " & Err.Description
End Function

热点排行