Module1 Option Explicit Public Const GWL_WNDPROC = (-4) Public Const WM_LBUTTONDOWN = &H201 Public Const WM_NCHITTEST = &H84 Public Const WM_NCLBUTTONDOWN = &HA1 Public Const HTCLIENT = 1 Public Const HTCAPTION = 2 Public Const LF_FACESIZE = 32 Public Const DEFAULT_CHARSET = 1 Public Const DT_CALCRECT = &H400 Type LOGFONT lfHeight As Long lfWidth As Long lfEscapement As Long lfOrientation As Long lfWeight As Long lfItalic As Byte lfUnderline As Byte lfStrikeOut As Byte lfCharSet As Byte lfOutPrecision As Byte lfClipPrecision As Byte lfQuality As Byte lfPitchAndFamily As Byte lfFaceName(0 To LF_FACESIZE - 1) As Byte End Type Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long) Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hDC As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long 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 Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public prevWndProc As Long Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If Msg = WM_LBUTTONDOWN Then SendMessage Form1.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, ByVal 0& Else WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam) End If End Function Form1
Private Sub Form_Load() prevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) SetWindowLong Picture1.hwnd, GWL_WNDPROC, AddressOf WndProc End Sub Private Sub Form_Unload(Cancel As Integer) SetWindowLong Picture1.hwnd, GWL_WNDPROC, prevWndProc End Sub Private Sub Picture1_Paint() Dim font As LOGFONT, hOldFont As Long, hFont As Long Dim w As Integer, h As Integer, r As RECT With Picture1 RtlMoveMemory font.lfFaceName(0), _ ByVal CStr(.font.Name), _ LenB(StrConv(.font.Name, vbFromUnicode)) + 1 font.lfHeight = (.font.Size * -20) / Screen.TwipsPerPixelY font.lfEscapement = 2700 font.lfWeight = IIf(.font.Bold, 700, 400) font.lfItalic = .font.Italic font.lfUnderline = .font.Underline font.lfStrikeOut = .font.Strikethrough font.lfCharSet = DEFAULT_CHARSET hFont = CreateFontIndirect(font) hOldFont = SelectObject(.hDC, hFont) r.Left = 0: r.Top = 0 DrawText Me.hDC, .Tag, LenB(StrConv(.Tag, vbFromUnicode)), r, DT_CALCRECT w = r.Right h = r.Bottom .Cls .CurrentX = .ScaleWidth - h / 2 .CurrentY = cmdClose.Height + 15 Picture1.Print .Tag SelectObject .hDC, hOldFont DeleteObject hFont End With End Sub |