AeroForm.ctl
上传用户:jnjasmy
上传日期:2015-01-04
资源大小:637k
文件大小:41k
源码类别:

GDI/图象编程

开发平台:

Visual Basic

  1. VERSION 5.00
  2. Begin VB.UserControl AeroForm 
  3.    Alignable       =   -1  'True
  4.    AutoRedraw      =   -1  'True
  5.    ClientHeight    =   3600
  6.    ClientLeft      =   0
  7.    ClientTop       =   0
  8.    ClientWidth     =   4800
  9.    BeginProperty Font 
  10.       Name            =   "Arial"
  11.       Size            =   9
  12.       Charset         =   0
  13.       Weight          =   400
  14.       Underline       =   0   'False
  15.       Italic          =   0   'False
  16.       Strikethrough   =   0   'False
  17.    EndProperty
  18.    ScaleHeight     =   240
  19.    ScaleMode       =   3  'Pixel
  20.    ScaleWidth      =   320
  21.    ToolboxBitmap   =   "AeroForm.ctx":0000
  22.    Begin VB.PictureBox Picture2 
  23.       AutoRedraw      =   -1  'True
  24.       BackColor       =   &H00C00000&
  25.       BorderStyle     =   0  'None
  26.       Height          =   570
  27.       Left            =   480
  28.       Picture         =   "AeroForm.ctx":0312
  29.       ScaleHeight     =   38
  30.       ScaleMode       =   3  'Pixel
  31.       ScaleWidth      =   100
  32.       TabIndex        =   3
  33.       Top             =   2160
  34.       Width           =   1500
  35.    End
  36.    Begin VB.PictureBox pCaptionButtons 
  37.       AutoRedraw      =   -1  'True
  38.       BorderStyle     =   0  'None
  39.       Height          =   570
  40.       Left            =   1800
  41.       ScaleHeight     =   38
  42.       ScaleMode       =   3  'Pixel
  43.       ScaleWidth      =   100
  44.       TabIndex        =   2
  45.       Top             =   1320
  46.       Width           =   1500
  47.    End
  48.    Begin VB.CommandButton Command1 
  49.       Caption         =   "Aero Form"
  50.       BeginProperty Font 
  51.          Name            =   "宋体"
  52.          Size            =   9
  53.          Charset         =   134
  54.          Weight          =   400
  55.          Underline       =   0   'False
  56.          Italic          =   0   'False
  57.          Strikethrough   =   0   'False
  58.       EndProperty
  59.       Height          =   615
  60.       Left            =   0
  61.       TabIndex        =   1
  62.       Top             =   0
  63.       Width           =   615
  64.    End
  65.    Begin VB.PictureBox Picture1 
  66.       AutoRedraw      =   -1  'True
  67.       BackColor       =   &H00FFFFFF&
  68.       BorderStyle     =   0  'None
  69.       BeginProperty Font 
  70.          Name            =   "Arial"
  71.          Size            =   9
  72.          Charset         =   0
  73.          Weight          =   700
  74.          Underline       =   0   'False
  75.          Italic          =   0   'False
  76.          Strikethrough   =   0   'False
  77.       EndProperty
  78.       ForeColor       =   &H00000000&
  79.       Height          =   375
  80.       Left            =   0
  81.       ScaleHeight     =   25
  82.       ScaleMode       =   3  'Pixel
  83.       ScaleWidth      =   206
  84.       TabIndex        =   0
  85.       Top             =   0
  86.       Visible         =   0   'False
  87.       Width           =   3090
  88.    End
  89. End
  90. Attribute VB_Name = "AeroForm"
  91. Attribute VB_GlobalNameSpace = False
  92. Attribute VB_Creatable = True
  93. Attribute VB_PredeclaredId = False
  94. Attribute VB_Exposed = True
  95. Option Explicit
  96. '========================================================================================
  97. ' Subclasser declarations
  98. '========================================================================================
  99. Private Enum eMsgWhen
  100.     [MSG_AFTER] = 1                                                           'Message calls back after the original (previous) WndProc
  101.     [MSG_BEFORE] = 2                                                          'Message calls back before the original (previous) WndProc
  102.     [MSG_BEFORE_AND_AFTER] = MSG_AFTER Or MSG_BEFORE                          'Message calls back before and after the original (previous) WndProc
  103. End Enum
  104. Private Type tSubData                                                         'Subclass data type
  105.     hWnd                   As Long                                            'Handle of the window being subclassed
  106.     nAddrSub               As Long                                            'The address of our new WndProc (allocated memory).
  107.     nAddrOrig              As Long                                            'The address of the pre-existing WndProc
  108.     nMsgCntA               As Long                                            'Msg after table entry count
  109.     nMsgCntB               As Long                                            'Msg before table entry count
  110.     aMsgTblA()             As Long                                            'Msg after table array
  111.     aMsgTblB()             As Long                                            'Msg Before table array
  112. End Type
  113. Private sc_aSubData()      As tSubData                                        'Subclass data array
  114. Private Const ALL_MESSAGES As Long = -1                                       'All messages added or deleted
  115. Private Const GMEM_FIXED   As Long = 0                                        'Fixed memory GlobalAlloc flag
  116. Private Const GWL_WNDPROC  As Long = -4                                       'Get/SetWindow offset to the WndProc procedure address
  117. Private Const PATCH_04     As Long = 88                                       'Table B (before) address patch offset
  118. Private Const PATCH_05     As Long = 93                                       'Table B (before) entry count patch offset
  119. Private Const PATCH_08     As Long = 132                                      'Table A (after) address patch offset
  120. Private Const PATCH_09     As Long = 137                                      'Table A (after) entry count patch offset
  121. Private Declare Sub RtlMoveMemory Lib "kernel32" (Destination As Any, Source As Any, ByVal Length As Long)
  122. Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long
  123. Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
  124. Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
  125. Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
  126. Private Declare Function SetWindowLongA Lib "user32" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  127. '//
  128. Private Enum eBorderStyle
  129.   None = 0
  130.   Fixed = 1
  131.   Sizable = 2
  132.   Dialog = 3
  133. End Enum
  134. Private Const LF_FACESIZE = 32
  135. Private Type LOGFONT
  136.    lfHeight As Long
  137.    lfWidth As Long
  138.    lfEscapement As Long
  139.    lfOrientation As Long
  140.    lfWeight As Long
  141.    lfItalic As Byte
  142.    lfUnderline As Byte
  143.    lfStrikeOut As Byte
  144.    lfCharSet As Byte
  145.    lfOutPrecision As Byte
  146.    lfClipPrecision As Byte
  147.    lfQuality As Byte
  148.    lfPitchAndFamily As Byte
  149.    lfFaceName(LF_FACESIZE) As Byte
  150. End Type
  151. Private Const FW_NORMAL = 400
  152. Private Const FW_BOLD = 700
  153. Private Const FF_DONTCARE = 0
  154. Private Const DEFAULT_QUALITY = 0
  155. Private Const DEFAULT_PITCH = 0
  156. Private Const DEFAULT_CHARSET = 1
  157. Private Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
  158. Private Declare Function MulDiv Lib "kernel32" (ByVal nNumber As Long, ByVal nNumerator As Long, ByVal nDenominator As Long) As Long
  159. Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
  160. Private Const LOGPIXELSY = 90
  161. Private Declare Function GetWindowDC Lib "user32" (ByVal hWnd As Long) As Long
  162. Private Declare Function SetMenu Lib "user32" (ByVal hWnd As Long, ByVal hMenu As Long) As Long
  163. Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
  164. Private Declare Function CopyImage Lib "user32" (ByVal Handle As Long, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
  165. Private Const CaptionHeight = 25
  166. Private Const LeftWidth = 9
  167. Private Const RightWidth = 9
  168. Private Const BottomHeight = 9
  169. Private FBorderStyle As eBorderStyle, FMaxButton As Boolean, FMinButton As Boolean
  170. Private WorkArea               As RECT
  171. Private mDC As Long  ' Memory hDC
  172. Private mainBitmap As Long ' Memory Bitmap
  173. Private blendFunc32bpp As BLENDFUNCTION
  174. Private Token As Long ' Needed to close GDI+
  175. Private oldBitmap As Long
  176. Private MainWnd As Long
  177. Private MainRect As RECT
  178. Private pIcon As New c32bppDIB
  179. Private iFrame(3) As New c32bppDIB
  180. Private bClose(1) As New c32bppDIB, bCloseS(1) As New c32bppDIB, bMaxRes(2) As New c32bppDIB, bMin(1) As New c32bppDIB
  181. Private clH As Boolean, clHl As Boolean, clD As Boolean, clRct As RECT
  182. Private mxH As Boolean, mxHl As Boolean, mxD As Boolean, mxRct As RECT
  183. Private mnH As Boolean, mnHl As Boolean, mnD As Boolean, mnRct As RECT
  184. Private R As RECT, CR As RECT, R1 As RECT
  185. Private FormActive As Boolean
  186. Private pCapt As New c32bppDIB, cRect As RECT
  187. Private Sub pCaptionButtons_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  188.   If clH Then
  189.     clD = True
  190.   ElseIf mxH Then
  191.     mxD = True
  192.   ElseIf mnH Then
  193.     mnD = True
  194.   End If
  195.   UpdateButtons
  196. End Sub
  197. Private Sub pCaptionButtons_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  198.   clH = X > clRct.Left And X < clRct.Right And Y > clRct.Top And Y < clRct.Bottom
  199.   If clH <> clHl Then UpdateButtons: clHl = clH: Exit Sub
  200.   mxH = X > mxRct.Left And X < mxRct.Right And Y > mxRct.Top And Y < mxRct.Bottom And FMaxButton
  201.   If mxH <> mxHl Then UpdateButtons: mxHl = mxH: Exit Sub
  202.   mnH = X > mnRct.Left And X < mnRct.Right And Y > mnRct.Top And Y < mnRct.Bottom And FMinButton
  203.   If mnH <> mnHl Then UpdateButtons: mnHl = mnH: Exit Sub
  204. End Sub
  205. Private Sub pCaptionButtons_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  206.   If clH Then
  207.     SendMessage UserControl.Parent.hWnd, WM_SYSCOMMAND, SC_CLOSE, 0&
  208.   ElseIf mxH Then
  209.     If UserControl.Parent.WindowState = 0 Then
  210.       SendMessage UserControl.Parent.hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0&
  211.     Else
  212.       SendMessage UserControl.Parent.hWnd, WM_SYSCOMMAND, SC_RESTORE, 0&
  213.     End If
  214.   ElseIf mnH Then
  215.     If UserControl.Parent.WindowState <> 1 Then
  216.       SendMessage UserControl.Parent.hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0&
  217.     Else
  218.       SendMessage UserControl.Parent.hWnd, WM_SYSCOMMAND, SC_RESTORE, 0&
  219.     End If
  220.   End If
  221.   clH = False: mxH = False: mnH = False
  222.   clD = False: mxD = False: mnD = False
  223.   UpdateButtons
  224. End Sub
  225. Private Sub pCaptionButtons_Resize()
  226.   With pCaptionButtons
  227.     clRct.Left = .ScaleWidth - 10 - 44: clRct.Top = 14
  228.     clRct.Right = clRct.Left + 44: clRct.Bottom = clRct.Top + 18
  229.     mxRct.Left = .ScaleWidth - 10 - 44 - 26: mxRct.Top = 14
  230.     mxRct.Right = mxRct.Left + 26: mxRct.Bottom = mxRct.Top + 18
  231.     mnRct.Left = .ScaleWidth - 10 - 44 - 26 - 26: mnRct.Top = 14
  232.     mnRct.Right = mnRct.Left + 26: mnRct.Bottom = mnRct.Top + 18
  233.   End With
  234. End Sub
  235. Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  236.   Dim lngReturnValue As Long
  237.   If Button = 1 Then
  238.     Call ReleaseCapture
  239.     lngReturnValue = SendMessage(MainWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
  240.   End If
  241. End Sub
  242. Private Sub UserControl_Paint()
  243.     Debug.Print "sfsdfd"
  244. End Sub
  245. Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  246.   If Ambient.UserMode Then
  247.     Command1.Visible = False
  248.     MainWnd = UserControl.Parent.hWnd
  249.     
  250.     Subclass_Start MainWnd
  251.     Subclass_AddMsg MainWnd, WM_GETMINMAXINFO
  252.     Subclass_AddMsg MainWnd, WM_SYSCOMMAND
  253.     Subclass_AddMsg MainWnd, WM_MOVING
  254.     Subclass_AddMsg MainWnd, WM_LBUTTONDOWN
  255.     Subclass_AddMsg MainWnd, WM_SIZE
  256.     Subclass_AddMsg MainWnd, WM_SHOWWINDOW
  257.     Subclass_AddMsg MainWnd, WM_SETFOCUS
  258.     Subclass_AddMsg MainWnd, MSM_NCACTIVATE
  259.     Subclass_AddMsg MainWnd, WM_NCLBUTTONDOWN
  260.     Subclass_AddMsg MainWnd, WM_PAINT
  261.     Subclass_AddMsg MainWnd, WM_ACTIVATEAPP
  262.     Subclass_AddMsg MainWnd, WM_CLOSE
  263.     Subclass_AddMsg MainWnd, WM_DESTROY
  264.     Subclass_AddMsg MainWnd, WM_KILLFOCUS
  265.     Subclass_AddMsg MainWnd, WM_MOVE
  266.   
  267.     If Not TypeOf UserControl.Parent Is MDIForm Then
  268.       FBorderStyle = UserControl.Parent.BorderStyle
  269.       If FBorderStyle = 4 Then FBorderStyle = Fixed
  270.       If FBorderStyle = 5 Then FBorderStyle = Sizable
  271.       
  272.       FMaxButton = UserControl.Parent.MaxButton
  273.       FMinButton = UserControl.Parent.MinButton
  274.     Else
  275.       FBorderStyle = Sizable
  276.       FMaxButton = True
  277.       FMinButton = True
  278.     End If
  279.     pIcon.LoadPicture_StdPicture UserControl.Parent.Icon
  280.     iFrame(0).LoadPicture_File App.Path & "ImagesWindowFrameTop.png"
  281.     iFrame(1).LoadPicture_File App.Path & "ImagesWindowFrameBottom.png"
  282.     iFrame(2).LoadPicture_File App.Path & "ImagesWindowFrameLeft.png"
  283.     iFrame(3).LoadPicture_File App.Path & "ImagesWindowFrameRight.png"
  284.     bCloseS(0).LoadPicture_File App.Path & "ImagesCloseButtonSingle.png"
  285.     bCloseS(1).LoadPicture_File App.Path & "Imagesclose-s-glow.png"
  286.     bClose(0).LoadPicture_File App.Path & "ImagesCloseButton.png"
  287.     bClose(1).LoadPicture_File App.Path & "Imagesclose-glow.png"
  288.     bMaxRes(0).LoadPicture_File App.Path & "ImagesMaxButton.png"
  289.     bMaxRes(1).LoadPicture_File App.Path & "Imagesmax-glow.png"
  290.     bMaxRes(2).LoadPicture_File App.Path & "ImagesResButton.png"
  291.     bMin(0).LoadPicture_File App.Path & "ImagesMinButton.png"
  292.     bMin(1).LoadPicture_File App.Path & "Imagesmin-glow.png"
  293.     
  294. '    RepaintWindow
  295.   End If
  296. End Sub
  297. Private Sub UserControl_Resize()
  298.   On Error Resume Next
  299.   If Ambient.UserMode Then
  300.     Picture1.Move LeftWidth, 0, ScaleWidth - 28 - 75 - 68, CaptionHeight
  301.     cRect.Right = Picture1.ScaleWidth: cRect.Bottom = Picture1.ScaleHeight
  302.     pCaptionButtons_Resize
  303.   Else
  304.     UserControl.Width = 48 * Screen.TwipsPerPixelX
  305.     UserControl.Height = 48 * Screen.TwipsPerPixelY
  306.     Command1.Move 0, 0, ScaleWidth, ScaleHeight
  307.   End If
  308. End Sub
  309. Private Sub UserControl_Show()
  310.   On Error Resume Next
  311.   If Not TypeOf UserControl.Parent Is MDIForm Then UserControl.Parent.BackColor = RGB(240, 240, 240)
  312. End Sub
  313. Private Sub UserControl_Terminate()
  314.   On Error Resume Next
  315.   Subclass_StopAll
  316.   Call GdiplusShutdown(Token)
  317.   SelectObject mDC, oldBitmap
  318.   DeleteObject mainBitmap
  319.   DeleteObject oldBitmap
  320.   DeleteDC mDC
  321. End Sub
  322. Private Sub GetWorkArea()
  323.     SystemParametersInfo 48&, 0&, WorkArea, 0&
  324. End Sub
  325. '========================================================================================
  326. ' UserControl subclass procedure
  327. '========================================================================================
  328. Public Sub zSubclass_Proc(ByVal bBefore As Boolean, _
  329.                           ByRef bHandled As Boolean, _
  330.                           ByRef lReturn As Long, _
  331.                           ByRef lhWnd As Long, _
  332.                           ByRef uMsg As Long, _
  333.                           ByRef wParam As Long, _
  334.                           ByRef lParam As Long _
  335.                           )
  336.   On Error Resume Next
  337.   Select Case lhWnd
  338.   Case MainWnd
  339.     Select Case uMsg
  340.     Case WM_GETMINMAXINFO
  341.         Dim MMI As MINMAXINFO, cy&, cx&
  342.         cy = GetSystemMetrics(SM_CYCAPTION)
  343.         cx = GetSystemMetrics(SM_CXFRAME)
  344.         GetWorkArea
  345.         CopyMemory MMI, ByVal lParam, LenB(MMI)
  346.         'set the minmaxinfo data to the
  347.         'minimum and maximum values set
  348.         'by the option choice
  349.         With MMI
  350.             .ptMaxPosition.X = WorkArea.Left - cx + 8
  351.             .ptMaxPosition.Y = WorkArea.Top - cy - cx + 24
  352.             .ptMaxSize.X = (WorkArea.Right - WorkArea.Left) - .ptMaxPosition.X - cx '+ cX + cX - 16
  353.             .ptMaxSize.Y = (WorkArea.Bottom - WorkArea.Top) - .ptMaxPosition.Y - cx '+ cX + cX - cY '- CaptionHeight
  354.             .ptMinTrackSize.X = 200
  355.             .ptMinTrackSize.Y = 100
  356.         End With
  357.         CopyMemory ByVal lParam, MMI, LenB(MMI)
  358.     
  359.     Case WM_NCLBUTTONDOWN
  360.       Resize False, False, SWP_NOZORDER
  361.     
  362.     Case WM_SIZE
  363.       Call Resize((uMsg = WM_SIZE), True, , True)
  364.     
  365.     Case WM_MOVING
  366.       Call Resize((uMsg = WM_SIZE), True)
  367.     
  368.     Case WM_MOVE
  369.       Call Resize((uMsg = WM_SIZE), True)
  370.       
  371.     Case WM_LBUTTONDOWN
  372.       Call Resize((uMsg = WM_SIZE), False)
  373.     
  374.     Case WM_ACTIVATEAPP
  375.       Select Case wParam
  376.       Case WA_ACTIVE, WA_CLICKACTIVE
  377.         FormActive = True
  378.       Case WA_INACTIVE
  379.         FormActive = False
  380.       End Select
  381.       Call Resize(True, False, , True)
  382.       
  383.     Case MSM_NCACTIVATE
  384.       On Local Error Resume Next
  385.       Select Case wParam
  386.       Case WA_ACTIVE, WA_CLICKACTIVE
  387.         FormActive = True
  388.       Case WA_INACTIVE
  389.         FormActive = False
  390.       End Select
  391.       Call Resize(True, False, , True)
  392.     
  393.     Case WM_SETFOCUS
  394.       FormActive = True
  395.       Call Resize(True, False, , False)
  396.     
  397.     Case WM_SHOWWINDOW
  398.       Dim curWinLong As Long
  399.       'Border
  400.       curWinLong = GetWindowLong(UserControl.hWnd, GWL_EXSTYLE)
  401.       curWinLong = curWinLong Or WS_EX_TOOLWINDOW
  402.       SetWindowLong UserControl.hWnd, GWL_EXSTYLE, curWinLong
  403.       Call SetParent(UserControl.hWnd, GetParent(MainWnd))
  404.       curWinLong = GetWindowLong(UserControl.hWnd, GWL_EXSTYLE)
  405.       curWinLong = curWinLong Or WS_EX_LAYERED
  406.       SetWindowLong UserControl.hWnd, GWL_EXSTYLE, curWinLong
  407.       
  408.       'Caption Buttons
  409.       curWinLong = GetWindowLong(pCaptionButtons.hWnd, GWL_EXSTYLE)
  410.       curWinLong = curWinLong Or WS_EX_TOOLWINDOW
  411.       SetWindowLong pCaptionButtons.hWnd, GWL_EXSTYLE, curWinLong
  412.       Call SetParent(pCaptionButtons.hWnd, GetParent(MainWnd))
  413.       curWinLong = GetWindowLong(pCaptionButtons.hWnd, GWL_EXSTYLE)
  414.       curWinLong = curWinLong Or WS_EX_LAYERED
  415.       SetWindowLong pCaptionButtons.hWnd, GWL_EXSTYLE, curWinLong
  416.       Call Resize(True, True, , True)
  417.     
  418.     Case WM_CLOSE
  419.     
  420.     Case WM_DESTROY
  421.     
  422.     End Select
  423.   End Select
  424. End Sub
  425. Public Sub Resize(SetWndRect As Boolean, SetPosition As Boolean, Optional lFlag As Long = SWP_FRAMECHANGED, Optional bRepaint As Boolean)
  426.   Dim cy, lStyle, cx
  427.   On Error Resume Next
  428.   
  429.   cy = GetSystemMetrics(SM_CYCAPTION)
  430.   cx = GetSystemMetrics(SM_CXFRAME)
  431.       
  432.   GetWindowRect MainWnd, MainRect
  433.   If SetWndRect = True Then
  434.     Dim lRet As Long
  435.     Dim GRET As Long
  436.     
  437.     ' form g鰎黱黰