对枕善居中 Vista 界面模仿窗体示例(修正版)的进一步修改解决方案
对枕善居中 Vista 界面模仿窗体示例(修正版)的进一步修改
源文件在枕善居的 http://www.mndsoft.com/blog/article.asp?id=859 中。
可以用VB作出Vista的效果,很漂亮。
但是美中不足,例程中移动窗口时,窗口显示的图像消失,停止移动窗口后图像才显示。其原因是移动主窗口时隐藏了另一个有图像的窗口。
经过一番研究,修改了这个遗憾。
移动Aero窗体时,不用隐藏同时可以移动skin窗体。这样看起来只有一个窗体。
在Aero窗体:
添加全局声明:
Private gblAeroIsMoving As Boolean
Private gblAeroMoveX As Single
Private gblAeroMoveY As Single
Private Declare Function GetActiveWindow Lib "user32 " () As Long
修改Picture1_MouseDown过程:
'只留下以下代码,其余的注释掉
MakeTrans (TheSystemDir() & "\VistaW.png ")
SetOnTop Skin.hWnd, True
MakeTrans (TheSystemDir() & "\Vista.png ")
'这两个 MakeTrans 有什么意义还没有搞懂,似乎没有也一样
'加入以下代码
gblAeroIsMoving = True
gblAeroMoveX = X
gblAeroMoveY = Y
添加过程:
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If gblAeroIsMoving = True Then
Me.Move Me.Left + X - gblAeroMoveX, Me.Top + Y - gblAeroMoveY
Skin.Move (Me.Left + X - gblAeroMoveX) + 198, (Me.Top + Y - gblAeroMoveY) + 220
End If
End Sub
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
gblAeroIsMoving = False
End Sub
添加一个Timer,Interval为100
这种方法一定很笨,但如果没有,如果改变活动窗口,Skin窗口还会一直在最前面
Private Sub Timer1_Timer()
If GetActiveWindow = Me.hwnd Then
SetOnTop Skin.hwnd, True
Else
SetOnTop Skin.hwnd, False
End If
End Sub
经过我这样修改,两个窗体中的 MoveForm 函数可以删除了(不理解作者为什么不把完全一样的函数放在模块)。以下的过程也可以删除:
Skin窗体的 Command2_Click,包括这个按钮
API声明 Public Declare Function ReleaseCapture Lib "user32 " () As Long
现在剩下的问题就是,点击Aero窗体的上面移动窗体时,图像抖动。点击上面的关闭等按钮,图像也抖动。
但我想不出更好的办法了。那位同好能够继续完善?
------解决方案--------------------
关注中!先顶
------解决方案--------------------
学习
------解决方案--------------------
源文件在枕善居的 http://www.mndsoft.com/blog/article.asp?id=859 中。
可以用VB作出Vista的效果,很漂亮。
但是美中不足,例程中移动窗口时,窗口显示的图像消失,停止移动窗口后图像才显示。其原因是移动主窗口时隐藏了另一个有图像的窗口。
经过一番研究,修改了这个遗憾。
移动Aero窗体时,不用隐藏同时可以移动skin窗体。这样看起来只有一个窗体。
在Aero窗体:
添加全局声明:
Private gblAeroIsMoving As Boolean
Private gblAeroMoveX As Single
Private gblAeroMoveY As Single
Private Declare Function GetActiveWindow Lib "user32 " () As Long
修改Picture1_MouseDown过程:
'只留下以下代码,其余的注释掉
MakeTrans (TheSystemDir() & "\VistaW.png ")
SetOnTop Skin.hWnd, True
MakeTrans (TheSystemDir() & "\Vista.png ")
'这两个 MakeTrans 有什么意义还没有搞懂,似乎没有也一样
'加入以下代码
gblAeroIsMoving = True
gblAeroMoveX = X
gblAeroMoveY = Y
添加过程:
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If gblAeroIsMoving = True Then
Me.Move Me.Left + X - gblAeroMoveX, Me.Top + Y - gblAeroMoveY
Skin.Move (Me.Left + X - gblAeroMoveX) + 198, (Me.Top + Y - gblAeroMoveY) + 220
End If
End Sub
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
gblAeroIsMoving = False
End Sub
添加一个Timer,Interval为100
这种方法一定很笨,但如果没有,如果改变活动窗口,Skin窗口还会一直在最前面
Private Sub Timer1_Timer()
If GetActiveWindow = Me.hwnd Then
SetOnTop Skin.hwnd, True
Else
SetOnTop Skin.hwnd, False
End If
End Sub
经过我这样修改,两个窗体中的 MoveForm 函数可以删除了(不理解作者为什么不把完全一样的函数放在模块)。以下的过程也可以删除:
Skin窗体的 Command2_Click,包括这个按钮
API声明 Public Declare Function ReleaseCapture Lib "user32 " () As Long
现在剩下的问题就是,点击Aero窗体的上面移动窗体时,图像抖动。点击上面的关闭等按钮,图像也抖动。
但我想不出更好的办法了。那位同好能够继续完善?
------解决方案--------------------
关注中!先顶
------解决方案--------------------
学习
------解决方案--------------------