在加载窗体时想以一定的动画效果来显示,预备用下面这个函数来实现:
Private Declare Function AnimateWindow Lib "user32" (ByVal hWnd As Long, ByVal mytime As Long, ByVal style As Long) As BooleanPrivate Sub Form_Load()
outspread = AnimateWindow(Me.hWnd, 1000, 16)
Me.Refresh
'AnimateWindow 第一个参数是句柄
'AnimateWindow 第二个参数是打开的速度(值越大速度越慢,否则相反)
'AnimateWindow 第三个参数是打开的样式
'说明第三个参数
'0 没有模式
'1 从左向右展开
'2 从右向左展开
'4 从上向下
'5 从左上角到右下角
'6 从右上角到左下角
'8 从下向上
'9 从左下角到右上角
'10 从右下角到左上角
'16 从中间向四边张开
End Sub
AnimateWindow Me.hWnd,1000,16
Me.Refresh
现在的问题是,用这个函数可以实现窗体以一定的形式展开,但是展开的时候窗体是黑色的,且形式较为单一,请问,如何使得展开时窗体的颜色不为黑色,而为窗体本来的颜色呢?
另外有没有办法实现更好看的展开方式呢?比如窗体从无到有淡出,或者螺旋展开,就像ppT里面图片有很多好看的方式出现的,请指教,谢谢!
Private Declare Function AnimateWindow Lib "user32" (ByVal hWnd As Long, ByVal mytime As Long, ByVal style As Long) As BooleanPrivate Sub Form_Load()
outspread = AnimateWindow(Me.hWnd, 1000, 16)
Me.Refresh
'AnimateWindow 第一个参数是句柄
'AnimateWindow 第二个参数是打开的速度(值越大速度越慢,否则相反)
'AnimateWindow 第三个参数是打开的样式
'说明第三个参数
'0 没有模式
'1 从左向右展开
'2 从右向左展开
'4 从上向下
'5 从左上角到右下角
'6 从右上角到左下角
'8 从下向上
'9 从左下角到右上角
'10 从右下角到左上角
'16 从中间向四边张开
End Sub
AnimateWindow Me.hWnd,1000,16
Me.Refresh
现在的问题是,用这个函数可以实现窗体以一定的形式展开,但是展开的时候窗体是黑色的,且形式较为单一,请问,如何使得展开时窗体的颜色不为黑色,而为窗体本来的颜色呢?
另外有没有办法实现更好看的展开方式呢?比如窗体从无到有淡出,或者螺旋展开,就像ppT里面图片有很多好看的方式出现的,请指教,谢谢!
'dwtime -- 是动画持续的时间,默认值为200;
'dwflags -- 是动画方式,可以取&H1、&H2、&H3、&H4、&H5、&H6、&H8、&H9、和&H10共8个值,分别代表左右、右左、上下、左上到右下、右上到左下、下上、左下到右上以及中间到四周等。
'AW_HIDE 在窗体卸载时若想使用本函数就得加上此常量
'AW_ACTIVATE 在窗体通过本函数打开后,默认情况下会失去焦点,除非加上本常量
'AW_SLIDE 窗体移动滑出滑入
'AW_BLEND 淡入淡出效果(适用于WIN2000)Private Declare Function AnimateWindow Lib "user32" (ByVal hwnd As Long, ByVal dwTime As Long, ByVal dwFlags As Long) As LongPrivate Const AW_HIDE = &H10000 '在窗体卸载时若想使用本函数就得加上此常量
Private Const AW_ACTIVATE = &H20000 '平常窗体出的方式,即突发式
Private Const AW_SLIDE = &H40000 '在窗体通过本函数打开后,默认情况下会失去焦点,除非加上本常量
Private Const AW_BLEND = &H80000 '渐入式,由透明逐渐出现
Private Const AW_CENTER = &H10 '由中心逐渐出现
Private Const AW_HOR_NEGATIVE = &H2 '由右至左渐出
Private Const AW_HOR_POSITIVE = &H1 '由左至右渐出
Private Const AW_VER_NEGATIVE = &H8 '由下到上渐出
Private Const AW_VER_POSITIVE = &H4 '由上到下渐出Private Sub Form_Load() AnimateWindow hwnd, 1500, AW_CENTER Or AW_SLIDE Or AW_ACTIVATE '中间向四周展开并获取焦点
Me.RefreshEnd SubPrivate Sub Form_Unload(Cancel As Integer) AnimateWindow hwnd, 1500, AW_BLEND Or AW_ACTIVATE Or AW_HIDE
Me.Refresh
End Sub
ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As LongConst PROP_PREVPROC = "PrevProc"
Const PROP_FORM = "FormObject"Private Declare Function SetProp Lib "user32" Alias "SetPropA" ( _
ByVal hWnd As Long, _
ByVal lpString As String, _
ByVal hData As Long) As Long
Private Declare Function GetProp Lib "user32" Alias "GetPropA" ( _
ByVal hWnd As Long, _
ByVal lpString As String) As Long
Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" ( _
ByVal hWnd As Long, _
ByVal lpString As String) As LongPrivate Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
Dest As Any, _
Src As Any, _
ByVal DestL As Long)Const WM_PRINTCLIENT = &H318Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePrivate Declare Function GetClientRect Lib "user32" ( _
ByVal hWnd As Long, _
lpRect As RECT) As LongPrivate Declare Function apiOleTranslateColor Lib "oleaut32" Alias "OleTranslateColor" ( _
ByVal lOleColor As Long, _
ByVal lHPalette As Long, _
lColorRef As Long) As LongEnum AnimateWindowFlags
AW_HOR_POSITIVE = &H1
AW_HOR_NEGATIVE = &H2
AW_VER_POSITIVE = &H4
AW_VER_NEGATIVE = &H8
AW_CENTER = &H10
AW_HIDE = &H10000
AW_ACTIVATE = &H20000
AW_SLIDE = &H40000
AW_BLEND = &H80000
End EnumPrivate Declare Function apiAnimateWindow Lib "user32" Alias "AnimateWindow" ( _
ByVal hWnd As Long, _
ByVal dwTime As Long, _
ByVal dwFlags As Long) As LongPrivate Declare Function MulDiv Lib "kernel32" ( _
ByVal Mul As Long, _
ByVal Nom As Long, _
ByVal Den As Long) As LongPrivate Declare Function CreateSolidBrush Lib "gdi32" ( _
ByVal crColor As Long) As Long
Private Declare Function BitBlt Lib "gdi32" ( _
ByVal hDestDC As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal dwRop As Long) As LongPrivate Declare Function GetDC Lib "user32" ( _
ByVal hWnd As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" ( _
ByVal hDC As Long) As Long
Private Declare Function ReleaseDC Lib "user32" ( _
ByVal hWnd As Long, _
ByVal hDC As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" ( _
ByVal hDC As Long) As Long
Private Declare Function FillRect Lib "user32" ( _
ByVal hDC As Long, _
lpRect As RECT, _
ByVal hBrush As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" ( _
ByVal hObject As Long) As Long
Private Declare Function SelectObject Lib "gdi32" ( _
ByVal hDC As Long, _
ByVal hObject As Long) As LongPrivate 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'
' AnimateWindow
'
' Wrapper for AnimateWindow api
'
Public Sub AnimateWindow( _
ByVal Form As Form, _
ByVal dwTime As Long, _
ByVal dwFlags As AnimateWindowFlags) ' Set the properties
SetProp Form.hWnd, PROP_PREVPROC, GetWindowLong(Form.hWnd, GWL_WNDPROC)
SetProp Form.hWnd, PROP_FORM, ObjPtr(Form)
' Subclass the window
SetWindowLong Form.hWnd, GWL_WNDPROC, AddressOf AnimateWinProc ' Call AnimateWindow API
apiAnimateWindow Form.hWnd, dwTime, dwFlags ' Unsubclass the window
SetWindowLong Form.hWnd, GWL_WNDPROC, GetProp(Form.hWnd, PROP_PREVPROC) ' Remove the properties
RemoveProp Form.hWnd, PROP_FORM
RemoveProp Form.hWnd, PROP_PREVPROC ' Refresh the form
'Form.RefreshEnd Sub'
' AnimateWinProc
'
' Window procedure for AnimateWindow
'
Private Function AnimateWinProc( _
ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Dim lPrevProc As Long
Dim lForm As Long
Dim oForm As Form ' Get the previous WinProc pointer
lPrevProc = GetProp(hWnd, PROP_PREVPROC) ' Get the form object
lForm = GetProp(hWnd, PROP_FORM)
MoveMemory oForm, lForm, 4& Select Case Msg Case WM_PRINTCLIENT
Dim tRect As RECT
Dim hBr As Long ' Get the window client size
GetClientRect hWnd, tRect ' Create a brush with the
' form background color
hBr = CreateSolidBrush(OleTranslateColor(oForm.BackColor)) ' Fill the DC with the
' background color
FillRect wParam, tRect, hBr ' Delete the brush
DeleteObject hBr If Not oForm.Picture Is Nothing Then
Dim lScrDC As Long
Dim lMemDC As Long
Dim lPrevBMP As Long ' Create a compatible DC
lScrDC = GetDC(0&)
lMemDC = CreateCompatibleDC(lScrDC)
ReleaseDC 0, lScrDC ' Select the form picture in the DC
lPrevBMP = SelectObject(lMemDC, oForm.Picture.Handle) ' Draw the picture in the DC
BitBlt wParam, _
0, 0, _
HM2Pix(oForm.Picture.Width), HM2Pix(oForm.Picture.Height), _
lMemDC, 0, 0, vbSrcCopy ' Release the picture
SelectObject lMemDC, lPrevBMP ' Delete the DC
DeleteDC lMemDC End If End Select ' Release the form object
MoveMemory oForm, 0&, 4& ' Call the original window procedure
AnimateWinProc = CallWindowProc(lPrevProc, hWnd, Msg, wParam, lParam)End Function'
' HM2Pix
'
' Converts HIMETRIC to Pixel
'
Private Function HM2Pix(ByVal Value As Long) As Long HM2Pix = MulDiv(Value, 1440, 2540) / Screen.TwipsPerPixelXEnd Function'
' OleTranslateColor
'
' Wrapper for OleTranslateColor API
'
Private Function OleTranslateColor(ByVal Clr As Long) As Long
apiOleTranslateColor Clr, 0, OleTranslateColor
End Function
调用:
Call AnimateWindow(Me, 500, AW_BLEND)