Option Explicit
Dim m_hDC As Long
Dim hMenu As Long
Dim hSubMenu As Long
Dim mnuID As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Declare Function CreateSolidBrush Lib "GDI32" (ByVal crColor As Long) As Long
Public Declare Function SelectObject Lib "GDI32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function DeleteObject Lib "GDI32" (ByVal hObject As Long) As Integer
Public Declare Function GetSysColor Lib "user32" (ByVal nIndex As ColConst) As Long
'Color constants for GetSysColor
Public Enum ColConst
COLOR_ACTIVEBORDER = 10
COLOR_ACTIVECAPTION = 2
COLOR_ADJ_MAX = 100
COLOR_ADJ_MIN = -100
COLOR_APPWORKSPACE = 12
COLOR_BACKGROUND = 1
COLOR_BTNFACE = 15
COLOR_BTNHIGHLIGHT = 20
COLOR_BTNSHADOW = 16
COLOR_BTNTEXT = 18
COLOR_CAPTIONTEXT = 9
COLOR_GRAYTEXT = 17
COLOR_HIGHLIGHT = 13
COLOR_HIGHLIGHTTEXT = 14
COLOR_INACTIVEBORDER = 11
COLOR_INACTIVECAPTION = 3
COLOR_INACTIVECAPTIONTEXT = 19
COLOR_MENU = 4
COLOR_MENUTEXT = 7
COLOR_SCROLLBAR = 0
COLOR_WINDOW = 5
COLOR_WINDOWFRAME = 6
COLOR_WINDOWTEXT = 8
End Enum
Public Declare Function GetTextColor Lib "GDI32" (ByVal hdc As Long) As Long
Public Declare Function SetTextColor Lib "GDI32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Public Declare Function TextOut Lib "GDI32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _
ByVal lpString As String, ByVal nCount As Long) As Long
Public Declare Function SetBkMode Lib "GDI32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
Public Const NEWTRANSPARENT = 3 'use with SetBkMode()
Public Declare Function CreatePen Lib "GDI32" (ByVal nPenStyle As Long, ByVal nWidth As Long, _
ByVal crColor As Long) As Long
Public Declare Function MoveToEx Lib "GDI32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _
lpPoint As POINTAPI) As Long
Public Declare Function LineTo Lib "GDI32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Public Declare Function Rectangle Lib "GDI32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, _
ByVal X2 As Long, ByVal Y2 As Long) As Long
Public 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 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
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
'Messages to use in the wndproc
Public Const WM_DRAWITEM = &H2B
Public Const WM_MEASUREITEM = &H2C
Public Const WM_MENUSELECT = &H11F
Public Const WM_COMMAND = &H111
Public Const WM_GETFONT = &H31
Public Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSubMenu As Long
hbmpChecked As Long
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As Long
cch As Long
End Type
Public Const MIIM_TYPE = &H10
Public Type MEASUREITEMSTRUCT
CtlType As Long
CtlID As Long
itemID As Long
itemWidth As Long
itemHeight As Long
ItemData As Long
End Type
Public Type DRAWITEMSTRUCT
CtlType As Long
CtlID As Long
itemID As Long
itemAction As Long
itemState As Long
hwndItem As Long
hdc As Long
rcItem As RECT
ItemData As Long
End Type
Public Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Public Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Public Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, _
ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Long) As Long
Public Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal uItem As Long, _
ByVal ByPosition As Long, lpMenuItemInfo As MENUITEMINFO) As Boolean
Public Const MF_BYCOMMAND = &H0
Public Const MF_BYPOSITION = &H400
Public Const MF_OWNERDRAW = &H100
Public Const MF_SEPARATOR = &H800
Public Const MFT_SEPARATOR = MF_SEPARATOR
Public Const ODS_SELECTED = &H1
Public Sub DrawRect(ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long)
If m_hDC = 0 Then Exit Sub
Call Rectangle(m_hDC, X1, Y1, X2, Y2)
End Sub
Public Function GetPen(ByVal nWidth As Long, ByVal Clr As Long) As Long
GetPen = CreatePen(0, nWidth, Clr)
End Function
Public Function hPrint(ByVal x As Long, ByVal y As Long, ByVal hStr As String, ByVal Clr As Long) As Long
If m_hDC = 0 Then Exit Function
'Equivalent to setting a form's property
'FontTransparent = True
SetBkMode m_hDC, NEWTRANSPARENT
Dim OT As Long
OT = GetTextColor(m_hDC)
SetTextColor m_hDC, Clr
'Print the text
hPrint = TextOut(m_hDC, x, y, hStr, Len(hStr))
'Restore old text color
SetTextColor m_hDC, OT
End Function
Public Property Get TargethDC() As Long
TargethDC = m_hDC
End Property
Public Property Let TargethDC(ByVal vNewValue As Long)
'The hDC to draw to when performing operations
'from this module's subroutines.
m_hDC = vNewValue
End Property
Public Sub OwnerDrawMenu(ByVal ItemData As Long)
'Change the menu's style to owner-draw. You must
'now subclass the form that this menu is on so
'you can respond to the WM_MEASUREITEM and WM_DRAWITEM
'messages.
Dim mii As MENUITEMINFO
mii.cbSize = Len(mii)
mii.fMask = MIIM_TYPE
GetMenuItemInfo hSubMenu, MenuID, False, mii
If ((mii.fType And MF_SEPARATOR) = MF_SEPARATOR) Then
'*Preserve* separator style...
Call ModifyMenu(hSubMenu, MenuID, _
MF_BYCOMMAND Or MF_OWNERDRAW Or MF_SEPARATOR, _
MenuID, ItemData)
Else
Call ModifyMenu(hSubMenu, MenuID, _
MF_BYCOMMAND Or MF_OWNERDRAW, MenuID, ItemData)
End If
End Sub
Public Function OwnMenuProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
OwnMenuProc = m_Form.MsgProc(hwnd, wMsg, wParam, lParam)
End Function
Public Sub SetTopMenu(NewMnu As Long)
hMenu = NewMnu
End Sub
Public Property Get SubMenu() As Long
SubMenu = hSubMenu
End Property
Public Property Let SubMenu(ByVal vNewValue As Long)
hSubMenu = GetSubMenu(hMenu, vNewValue)
End Property