aniModule.bas
上传用户:hx800c
上传日期:2020-12-02
资源大小:792k
文件大小:8k
源码类别:

编辑框

开发平台:

Visual Basic

  1. Attribute VB_Name = "AniModule"
  2. '---------------------------------------------------------------------------------------
  3. 'Copyright  :   JoyPrakash Saikia 2002
  4. 'Module     :   AniModule
  5. 'Author     :   JoyPrakash Saikia
  6. 'Created    :   15/06/2002
  7. 'Purpose    :   TO Make AnimateWindow in Action
  8. '---------------------------------------------------------------------------------------
  9. Option Explicit
  10. '/*
  11. ' *   windows 2000 ,Windows XP windows 98 2nd edition  and Windows ME  has an API function Called
  12. '       AnimateWindow. But there is problem in VB FORMs, when you use this function for a form
  13. ' with Frames ,GRID etc. , then it leaves some black spots on it. This is very annoying situation
  14. ' So I have used subclassing to animate the windows without Flikering.
  15. '
  16. ' -joyprakash Saikia
  17. ' */
  18. Private mP_Currentform As Form
  19. Public Enum ESetWindowPosStyles
  20.     SWP_SHOWWINDOW = &H40
  21.     SWP_HIDEWINDOW = &H80
  22.     SWP_FRAMECHANGED = &H20
  23.     SWP_NOACTIVATE = &H10
  24.     SWP_NOCOPYBITS = &H100
  25.     SWP_NOMOVE = &H2
  26.     SWP_NOOWNERZORDER = &H200 ' Don't do owner Z ordering
  27.     SWP_NOREDRAW = &H8
  28.     SWP_NOREPOSITION = SWP_NOOWNERZORDER
  29.     SWP_NOSIZE = &H1
  30.     SWP_NOZORDER = &H4
  31.     SWP_DRAWFRAME = SWP_FRAMECHANGED
  32. End Enum
  33. Public Const AW_HOR_POSITIVE = &H1
  34. Public Const AW_HOR_NEGATIVE = &H2
  35. Public Const AW_VER_POSITIVE = &H4
  36. Public Const AW_VER_NEGATIVE = &H8
  37. Public Const AW_CENTER = &H10
  38. Public Const AW_HIDE = &H10000
  39. Public Const AW_ACTIVATE = &H20000
  40. Public Const AW_SLIDE = &H40000
  41. Public Const AW_BLEND = &H80000
  42. 'property VAriable for TransitionType  for the SkinCTL
  43. Public Declare Function AnimateWindow Lib "user32" _
  44.     (ByVal hwnd As Long, _
  45.     ByVal dwTime As Long, ByVal dwFlags As Long) As Long
  46. Public Const WM_PRINTCLIENT = &H318
  47. Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
  48.     (Destination As Any, Source As Any, ByVal Length As Long)
  49. Public Declare Function GetWindowLong Lib "user32" Alias _
  50.     "GetWindowLongA" (ByVal hwnd As Long, _
  51.     ByVal nIndex As Long) As Long
  52. Public Declare Function SetWindowLong Lib "user32" Alias _
  53.     "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, _
  54.     ByVal dwNewLong As Long) As Long
  55.  Public Const GWL_WNDPROC = (-4)
  56. Public Declare Function GetProp Lib "user32" Alias "GetPropA" _
  57.     (ByVal hwnd As Long, ByVal lpString As String) As Long
  58. Public Declare Function SetProp Lib "user32" Alias "SetPropA" _
  59.     (ByVal hwnd As Long, ByVal lpString As String, _
  60.     ByVal hData As Long) As Long
  61. Public Declare Function RemoveProp Lib "user32" Alias "RemovePropA" _
  62.     (ByVal hwnd As Long, ByVal lpString As String) As Long
  63. Public Declare Function CallWindowProc Lib "user32" Alias _
  64.     "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
  65.     ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, _
  66.     ByVal lParam As Long) As Long
  67. Public Declare Function OleTranslateColor _
  68.     Lib "oleaut32.dll" _
  69.     (ByVal lOleColor As Long, _
  70.     ByVal lHPalette As Long, _
  71.     lColorRef As Long) As Long
  72. Private Declare Function CreateSolidBrush Lib "gdi32" _
  73.     (ByVal crColor As Long) As Long
  74. Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, _
  75.     lpRect As RECT, ByVal hBrush As Long) As Long
  76. Private Type RECT
  77.     Left As Long
  78.     Top As Long
  79.     Right As Long
  80.     Bottom As Long
  81. End Type
  82. Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
  83. Private Type OSVERSIONINFO
  84.     dwOSVersionInfoSize As Long
  85.     dwMajorVersion As Long
  86.     dwMinorVersion As Long
  87.     dwBuildNumber As Long
  88.     dwPlatformId As Long
  89.     szCSDVersion As String * 128
  90. End Type
  91.  Sub PrintClient(ByVal hdc As Long, ByVal Frm As Form, ByVal lParam As Long)
  92.     Dim rct As RECT
  93.     Dim hBr As Long
  94.     'Fill in the hDC with the form's
  95.     'background color. Otherwise the form
  96.     'may appear Totally Garbage.
  97.     rct.Left = 0
  98.     rct.Top = 0
  99.     rct.Right = Frm.ScaleX(Frm.ScaleWidth, Frm.ScaleMode, vbPixels)
  100.     rct.Bottom = Frm.ScaleY(Frm.ScaleHeight, Frm.ScaleMode, vbPixels)
  101.     hBr = CreateSolidBrush(TranslateColor(Frm.BackColor))
  102.     FillRect hdc, rct, hBr
  103.     DeleteObject hBr
  104. End Sub
  105. Public Function TranslateColor(inCol As Long) As Long
  106.     Dim retCol As Long
  107.     OleTranslateColor inCol, 0&, retCol
  108.     TranslateColor = retCol
  109. End Function
  110. Public Function AnimWndProc(ByVal hwnd As Long, ByVal wMsg As Long, _
  111. ByVal wParam As Long, ByVal lParam As Long) As Long
  112.     Dim lProc As Long
  113.     Dim lPtr As Long
  114.     Dim Frm As Form
  115.     lProc = GetProp(hwnd, "ExAnimWndProc")
  116.     lPtr = GetProp(hwnd, "ExAnimWndPtr")
  117.     'Catch the WM_PRINTCLIENT message so the form
  118.     'won't look like garbage when it appears.
  119.     If wMsg = WM_PRINTCLIENT Then
  120.         CopyMemory Frm, lPtr, 4
  121.         PrintClient wParam, mP_Currentform, lParam
  122.         CopyMemory Frm, 0&, 4
  123.     End If
  124.     AnimWndProc = CallWindowProc(lProc, hwnd, wMsg, wParam, lParam)
  125. End Function
  126. Public Sub SubclassAnim(Frm As Form)
  127.     Dim l As Long
  128.     If GetProp(Frm.hwnd, "ExAnimWndProc") <> 0 Then
  129.         'Already subclassed
  130.         Exit Sub
  131.     End If
  132.     l = GetWindowLong(Frm.hwnd, GWL_WNDPROC)
  133.     SetProp Frm.hwnd, "ExAnimWndProc", l
  134.     SetProp Frm.hwnd, "ExAnimWndPtr", ObjPtr(Frm)
  135.     SetWindowLong Frm.hwnd, GWL_WNDPROC, AddressOf AnimWndProc
  136. End Sub
  137. Public Sub UnSubclassAnim(Frm As Form)
  138.     Dim l As Long
  139.     l = GetProp(Frm.hwnd, "ExAnimWndProc")
  140.     If l = 0 Then
  141.         'Isn't subclassed anyway
  142.         Exit Sub
  143.     End If
  144.     SetWindowLong Frm.hwnd, GWL_WNDPROC, l
  145.     RemoveProp Frm.hwnd, "ExAnimWndProc"
  146.     RemoveProp Frm.hwnd, "ExAnimWndPtr"
  147. End Sub
  148. '--end block--'
  149. Public Sub AnimateOnLoad(CurrentFrm As Form, ByVal Transition As Long, delay As Long)
  150.   If FindCorrectVersion = True Then
  151.          Set mP_Currentform = CurrentFrm
  152.          SubclassAnim CurrentFrm
  153.         AniModule.AnimateWindow CurrentFrm.hwnd, delay, _
  154.          Transition
  155.         UnSubclassAnim CurrentFrm
  156.          ' Added On 20th July For the Memory Leak
  157.        Set mP_Currentform = Nothing
  158.  End If
  159. End Sub
  160. Public Sub ActivateForm(Frm As Form)
  161. 'Purpose    :   you Can use this Procedure If you Still See Some Part of the Form is not Refreshed
  162. '
  163.         Dim cnt As Control
  164.         For Each cnt In Frm.Controls
  165.                 If Not (TypeOf cnt Is Frame) Then cnt.Refresh
  166.                 Next
  167.         Frm.Refresh
  168. End Sub
  169. Public Sub AnimateOnUnLoad(CurrentFrm As Form, delay As Long, Optional Fade As Boolean = False)
  170.  
  171.  If FindCorrectVersion = True Then
  172.  Set mP_Currentform = CurrentFrm
  173.      SubclassAnim CurrentFrm
  174.      If Fade = True Then
  175.        AnimateWindow CurrentFrm.hwnd, delay, _
  176.         AW_BLEND Or &H10000
  177.       Else
  178.         AnimateWindow CurrentFrm.hwnd, delay, _
  179.          AW_HOR_POSITIVE Or AW_VER_NEGATIVE Or AW_HIDE
  180.       End If
  181.         UnSubclassAnim CurrentFrm
  182.          ' Added On 20th July For the Memory Leak
  183.        Set mP_Currentform = Nothing
  184.     End If
  185. End Sub
  186. Function FindCorrectVersion() As Boolean
  187. 'Used for Checking OS
  188. Dim OSInfo As OSVERSIONINFO
  189. Dim Ret As Long
  190. OSInfo.dwOSVersionInfoSize = Len(OSInfo)
  191.     'Get the Windows version
  192.     Ret = GetVersionEx(OSInfo)
  193.     If Ret = 0 Then FindCorrectVersion = False: Exit Function
  194.     With OSInfo
  195.     If .dwPlatformId = 1 And .dwBuildNumber >= 22 Then
  196.         'windows 98 2nd Edition or more
  197.       FindCorrectVersion = True
  198.     ElseIf .dwPlatformId = 2 And .dwMajorVersion >= 5 Then
  199.            'Windows 2000 or windowsXP
  200.         FindCorrectVersion = True
  201.     End If
  202.  End With
  203. End Function