Very cool menu! Feel free to play! [WINDOWS]
Posted: Wed Aug 22, 2012 4:20 am
Hey guys, I made something pretty cool, and I figured I'd share it with y'all.
Save this file as: "Transparent_Menu.pb"
Save this file as: "Transparent_Menu.pb"
Code: Select all
Global szClassNameXy.s = "CMClass"
Enumeration
#MOUSE_IN_TIMER = 1
#TIMER_SHRINK
#TIMER_EXPAND
EndEnumeration
Structure CUSTOM_MENU_CREATE
numFontItems.i
numFontHeader.i
hParent.i
szMenuTitle.s
x.i
y.i
cx.i
cy.i
rgb_title_color.i
rgb_menu_unselected.i
rgb_text_shadow_unselected.i
rgb_menu_hilite.i
rgb_text_shadow_hilite.i
hWnd_To_Notify_Of_Menu_Events.i
bHadBorder.b
EndStructure
Structure CUSTOM_MENU
szItemName.s
enumMenu.i
rcItem.RECT
EndStructure
Structure IND_DC_INFO_2
hDc.i
hBitmap.i
hOrinalBmp.i
EndStructure
Structure DC_INFO_2
hDcParent.IND_DC_INFO_2
hDcFinal.IND_DC_INFO_2
EndStructure
Structure ITEM_OPERATION
iItem.i
iColor.i
rcItem.RECT
EndStructure
Structure CUSTOM_MENU_INFO
szMenuTitle.s
numFont.i
numHeaderFont.i
hParent.i
iLastSelectedItem.i
iCurrentItem.i
mmTimerActive.i
iMenuColor.i
iShadowColor.i
iShadowColorHilite.i
iTitleColor.i
iEndColor.i
bButtonDown.b
hWndToNotify.i
x.i
y.i
cx.i
cy.i
dcs.DC_INFO_2
List itemsToExpand.ITEM_OPERATION()
List itemsToShrink.ITEM_OPERATION()
List cm.CUSTOM_MENU()
EndStructure
Procedure RedrawDC( hWnd, *lpCMI.CUSTOM_MENU_INFO, expand = 0 )
SendMessage_(*lpCMI\hParent, #WM_PRINT, *lpCMI\dcs\hDcParent\hDc, #PRF_CLIENT|#PRF_ERASEBKGND)
BitBlt_(*lpCMI\dcs\hDcFinal\hDc, 0, 0, *lpCMI\cx, *lpCMI\cy, *lpCMI\dcs\hDcParent\hDc, *lpCMI\x, *lpCMI\y, #SRCCOPY)
SelectObject_(*lpCMI\dcs\hDcFinal\hDc, FontID(*lpCMI\numHeaderFont))
GetTextExtentPoint32_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\szMenuTitle, Len(*lpCMI\szMenuTitle), @ts.SIZE)
text_truncated = #False
While (ts\cx > (*lpCMI\cx - 30))
text_truncated = #True
*lpCMI\szMenuTitle = Left(*lpCMI\szMenuTitle, Len(*lpCMI\szMenuTitle) - 1)
GetTextExtentPoint32_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\szMenuTitle, Len(*lpCMI\szMenuTitle), @ts.SIZE)
Wend
If text_truncated = #True
*lpCMI\szMenuTitle + "..."
EndIf
rcDT.RECT\left = 6
rcDT\right = *lpCMI\cx - 9
rcDT\top = 5
rcDT\bottom = rcDT\top + ts\cy
SetTextColor_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\iShadowColor)
SetBkMode_(*lpCMI\dcs\hDcFinal\hDc, #TRANSPARENT)
DrawText_(*lpCMI\dcs\hDcFinal\hDc, @*lpCMI\szMenuTitle, Len(*lpCMI\szMenuTitle), @rcDT.RECT, #DT_LEFT)
rcDT.RECT\left = 5
rcDT\right = *lpCMI\cx - 10
rcDT\top = 5
rcDT\bottom = rcDT\top + ts\cy
SetTextColor_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\iTitleColor)
SetBkMode_(*lpCMI\dcs\hDcFinal\hDc, #TRANSPARENT)
DrawText_(*lpCMI\dcs\hDcFinal\hDc, @*lpCMI\szMenuTitle, Len(*lpCMI\szMenuTitle), @rcDT.RECT, #DT_LEFT)
rcDT\top = rcDT\bottom + 10
ctr = 0
SelectObject_(*lpCMI\dcs\hDcFinal\hDc, GetStockObject_(#NULL_BRUSH))
SelectObject_(*lpCMI\dcs\hDcFinal\hDc, FontID(*lpCMI\numFont))
ForEach *lpCMI\cm()
myTextColor = *lpCMI\iMenuColor
myshadowcolor = *lpCMI\iShadowColor
GetTextExtentPoint32_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\cm()\szItemName, Len(*lpCMI\cm()\szItemName), @ts.SIZE)
If ctr = 0
rcDT\bottom = rcDT\top + ts\cy
EndIf
If rcDT\bottom > *lpCMI\cy
Break
EndIf
text_truncated = #False
While (ts\cx > ((*lpCMI\cx - 30) - (*lpCMI\cx / 8)) )
text_truncated = #True
*lpCMI\cm()\szItemName = Left(*lpCMI\cm()\szItemName, Len(*lpCMI\cm()\szItemName) - 1)
GetTextExtentPoint32_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\cm()\szItemName, Len(*lpCMI\cm()\szItemName), @ts.SIZE)
Wend
If text_truncated = #True
*lpCMI\cm()\szItemName + "..."
EndIf
expanding = #False
shrinking = #False
ResetList(*lpCMI\itemsToExpand())
While NextElement(*lpCMI\itemsToExpand())
If *lpCMI\itemsToExpand()\iItem = ctr
If expand = #True
;*lpCMI\itemsToExpand()\rcItem\left + 5
*lpCMI\itemsToExpand()\rcItem\left + ((*lpCMI\cx / 8) - *lpCMI\cm()\rcItem\left) / 10
*lpCMI\itemsToExpand()\iColor = myTextColor
EndIf
myTextColor = *lpCMI\itemsToExpand()\iColor
rcDT\left = *lpCMI\itemsToExpand()\rcItem\left
CopyStructure(@rcDT, @rcInvalid.RECT, RECT)
If (rcDT\left >= (*lpCMI\cx / 8))
DeleteElement(*lpCMI\itemsToExpand())
EndIf
If ListSize(*lpCMI\itemsToExpand()) = 0
myTextColor = *lpCMI\iEndColor
myshadowcolor = *lpCMI\iShadowColorHilite
KillTimer_(hWnd, #TIMER_EXPAND)
EndIf
expanding = #True
Break
EndIf
Wend
If expanding = #False
ResetList(*lpCMI\itemsToShrink())
While NextElement(*lpCMI\itemsToShrink())
If *lpCMI\itemsToShrink()\iItem = ctr
;*lpCMI\itemsToShrink()\rcItem\left - 5
*lpCMI\itemsToShrink()\rcItem\left - ( (*lpCMI\cx / 8) - *lpCMI\cm()\rcItem\left ) / 10
*lpCMI\itemsToShrink()\iColor = myTextColor
myTextColor = *lpCMI\itemsToShrink()\iColor
rcDT\left = *lpCMI\itemsToShrink()\rcItem\left
shrinking = #True
CopyStructure(@rcDT, @rcInvalid.RECT, RECT)
If rcDT\left < = *lpCMI\cm()\rcItem\left
rcDT\left = *lpCMI\cm()\rcItem\left
DeleteElement(*lpCMI\itemsToShrink())
EndIf
If ListSize(*lpCMI\itemsToShrink()) = 0
myTextColor = *lpCMI\iMenuColor
KillTimer_(hWnd, #TIMER_SHRINK)
EndIf
Break
EndIf
Wend
EndIf
If shrinking = #False And expanding = #False
rcDT\left = *lpCMI\cm()\rcItem\left
Else
redraw = #True
EndIf
CopyStructure(@rcDT, @rcdt2.RECT, RECT)
If ctr = *lpCMI\iCurrentItem
DeleteObject_(SelectObject_(*lpCMI\dcs\hDcFinal\hDc, CreatePen_(#PS_SOLID, 1, myTextColor)))
RoundRect_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\cm()\rcItem\left, *lpCMI\cm()\rcItem\top, *lpCMI\cm()\rcItem\right, *lpCMI\cm()\rcItem\bottom, 20, 20)
EndIf
SetTextColor_(*lpCMI\dcs\hDcFinal\hDc, myshadowcolor);*lpCMI\iShadowColor)
rcdt2\left + 1
rcdt2\right + 1
DrawText_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\cm()\szItemName, Len(*lpCMI\cm()\szItemName), @rcdt2, #DT_LEFT)
SetTextColor_(*lpCMI\dcs\hDcFinal\hDc, myTextColor)
DrawText_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\cm()\szItemName, Len(*lpCMI\cm()\szItemName), @rcDT, #DT_LEFT)
;rcDT\top = rcDT\top + ts\cy ;rcDT\bottom
rcDT\top + ts\cy ;rcDT\bottom
rcDT\bottom + ts\cy
ctr + 1
Next
If redraw = #True
InvalidateRect_(hWnd, 0, 0)
EndIf
If ListSize(*lpCMI\itemsToExpand()) = 0
KillTimer_(hWnd, #TIMER_EXPAND)
EndIf
If ListSize(*lpCMI\itemsToShrink()) = 0
KillTimer_(hWnd, #TIMER_SHRINK)
EndIf
EndProcedure
Procedure Menu_Wnd_Proc( hWnd, uMsg, wParam, lParam )
*lpCMI.CUSTOM_MENU_INFO = GetWindowLongPtr_(hWnd, #GWLP_USERDATA)
Select uMsg
Case #WM_LBUTTONDOWN
*lpCMI\bButtonDown = #True
Case #WM_LBUTTONUP
If *lpCMI\bButtonDown = #True
cItem = -1
cursX = lParam & $0000FFFF
cursY = (lParam & $FFFF0000) >> 16
ForEach *lpCMI\cm()
With *lpCMI\cm()\rcItem
If cursX >= \left And cursX <= \right
If cursY >= \top And cursY <= \bottom
PostMessage_(*lpCMI\hWndToNotify, #WM_COMMAND, *lpCMI\cm()\enumMenu, 0)
Break
EndIf
EndIf
EndWith
Next
EndIf
*lpCMI\bButtonDown = #False
Case #WM_CREATE ;-WM_CREATE
If lParam = 0
ProcedureReturn -1
EndIf
*lpcs.CREATESTRUCT = lParam
*lpCMI = *lpcs\lpCreateParams
SetWindowLongPtr_(hWnd, #GWLP_USERDATA, *lpCMI)
hDcCreate = GetDC_(#Null)
*lpCMI\dcs\hDcFinal\hDc = CreateCompatibleDC_(hDcCreate)
*lpCMI\dcs\hDcFinal\hBitmap = CreateCompatibleBitmap_(hDcCreate, *lpcs\cx, *lpcs\cy)
*lpCMI\dcs\hDcFinal\hOrinalBmp = SelectObject_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\dcs\hDcFinal\hBitmap)
*lpCMI\dcs\hDcParent\hDc = CreateCompatibleDC_(hDcCreate)
GetWindowRect_(*lpCMI\hParent, @rcParent.RECT)
*lpCMI\dcs\hDcParent\hBitmap = CreateCompatibleBitmap_(hDcCreate, rcParent\right - rcParent\left, rcParent\bottom - rcParent\top)
*lpCMI\dcs\hDcParent\hOrinalBmp = SelectObject_(*lpCMI\dcs\hDcParent\hDc, *lpCMI\dcs\hDcParent\hBitmap)
*lpCMI\cx = *lpcs\cx
*lpCMI\cy = *lpcs\cy
*lpCMI\x = *lpcs\x
*lpCMI\y = *lpcs\y
mr.rect\left = 0
mr\top = 0
mr\right = *lpcs\cx
mr\bottom = *lpcs\cy
SelectObject_(*lpCMI\dcs\hDcFinal\hDc, FontID(*lpCMI\numHeaderFont))
SendMessage_(*lpCMI\hParent, #WM_PRINT, *lpCMI\dcs\hDcParent\hDc, #PRF_CLIENT|#PRF_ERASEBKGND)
BitBlt_(*lpCMI\dcs\hDcFinal\hDc, 0, 0, *lpCMI\cx, *lpCMI\cy, *lpCMI\dcs\hDcParent\hDc, *lpCMI\x, *lpCMI\y, #SRCCOPY)
GetTextExtentPoint32_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\szMenuTitle, Len(*lpCMI\szMenuTitle), @ts.SIZE)
NewList *lpCMI\itemsToExpand.ITEM_OPERATION()
NewList *lpCMI\itemsToShrink.ITEM_OPERATION()
text_truncated = #False
While (ts\cx > (*lpcs\cx - 30))
text_truncated = #True
*lpCMI\szMenuTitle = Left(*lpCMI\szMenuTitle, Len(*lpCMI\szMenuTitle) - 1)
GetTextExtentPoint32_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\szMenuTitle, Len(*lpCMI\szMenuTitle), @ts.SIZE)
Wend
If text_truncated = #True
*lpCMI\szMenuTitle + "..."
EndIf
*lpCMI\iCurrentItem = -1
rcDT.RECT\left = 6
rcDT\right = *lpcs\cx - 9
rcDT\top = 5
rcDT\bottom = rcDT\top + ts\cy
SetTextColor_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\iShadowColor)
SetBkMode_(*lpCMI\dcs\hDcFinal\hDc, #TRANSPARENT)
DrawText_(*lpCMI\dcs\hDcFinal\hDc, @*lpCMI\szMenuTitle, Len(*lpCMI\szMenuTitle), @rcDT.RECT, #DT_LEFT)
rcDT.RECT\left = 5
rcDT\right = *lpcs\cx - 10
rcDT\top = 5
rcDT\bottom = rcDT\top + ts\cy
SetTextColor_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\iTitleColor)
SetBkMode_(*lpCMI\dcs\hDcFinal\hDc, #TRANSPARENT)
DrawText_(*lpCMI\dcs\hDcFinal\hDc, @*lpCMI\szMenuTitle, Len(*lpCMI\szMenuTitle), @rcDT.RECT, #DT_LEFT)
SelectObject_(*lpCMI\dcs\hDcFinal\hDc, FontID(*lpCMI\numFont))
SetTextColor_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\iMenuColor)
ctr = 0
rcDT\top = rcDT\bottom + 10
ForEach *lpCMI\cm()
GetTextExtentPoint32_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\cm()\szItemName, Len(*lpCMI\cm()\szItemName), @ts.SIZE)
If ctr = 0
rcDT\bottom = rcDT\top + ts\cy
EndIf
If rcDT\bottom > *lpcs\cy
Break
EndIf
text_truncated = #False
While (ts\cx > ((*lpcs\cx - 30) - (*lpCMI\cx / 8)) )
text_truncated = #True
*lpCMI\cm()\szItemName = Left(*lpCMI\cm()\szItemName, Len(*lpCMI\cm()\szItemName) - 1)
GetTextExtentPoint32_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\cm()\szItemName, Len(*lpCMI\cm()\szItemName), @ts.SIZE)
Wend
If text_truncated = #True
*lpCMI\cm()\szItemName + "..."
EndIf
CopyStructure(@rcDT, @rcdt2.RECT, RECT)
rcdt2\left + 1
rcdt2\right + 1
SetTextColor_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\iShadowColor)
DrawText_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\cm()\szItemName, Len(*lpCMI\cm()\szItemName), @rcdt2, #DT_LEFT)
SetTextColor_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\iMenuColor)
DrawText_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\cm()\szItemName, Len(*lpCMI\cm()\szItemName), @rcDT, #DT_LEFT)
CopyStructure(@rcDT, @*lpCMI\cm()\rcItem, RECT)
;rcDT\top = rcDT\top + ts\cy ;rcDT\bottom
rcDT\top + ts\cy
rcDT\bottom + ts\cy
ctr + 1
Next
ReleaseDC_(#Null, hDcCreate)
ProcedureReturn 0
Case #WM_TIMER
Select wParam
Case #MOUSE_IN_TIMER
GetCursorPos_(@cpos.POINT)
ScreenToClient_(hWnd, @cpos)
stop_timer = #False
If cpos\x < 0 Or cpos\y < 0
stop_timer = #True
Else
If cpos\x > *lpCMI\cx Or cpos\y > *lpCMI\cy
stop_timer = #True
EndIf
EndIf
If stop_timer = #True
need_to_start_shrink_timer = #False
If ListSize(*lpCMI\itemsToShrink()) = 0
need_to_start_shrink_timer = #True
EndIf
ResetList(*lpCMI\itemsToExpand())
While NextElement(*lpCMI\itemsToExpand())
ResetList(*lpCMI\itemsToShrink())
While NextElement(*lpCMI\itemsToShrink())
If *lpCMI\itemsToShrink()\iItem = *lpCMI\itemsToExpand()\iItem
DeleteElement(*lpCMI\itemsToShrink())
EndIf
Wend
AddElement(*lpCMI\itemsToShrink())
*lpCMI\itemsToShrink()\iColor = *lpCMI\itemsToExpand()\iColor
*lpCMI\itemsToShrink()\iItem = *lpCMI\itemsToExpand()\iItem
CopyStructure(@*lpCMI\itemsToExpand()\rcItem, @*lpCMI\itemsToShrink()\rcItem, RECT)
DeleteElement(*lpCMI\itemsToExpand())
Wend
If *lpCMI\iCurrentItem <> -1
SelectElement(*lpCMI\cm(), *lpCMI\iCurrentItem)
AddElement(*lpCMI\itemsToShrink())
*lpCMI\itemsToShrink()\iColor = *lpCMI\iEndColor
;*lpCMI\itemsToShrink()\iColor = $FFFFFF
*lpCMI\itemsToShrink()\iItem = *lpCMI\iCurrentItem
CopyStructure(@*lpCMI\cm()\rcItem, @*lpCMI\itemsToShrink()\rcItem, RECT)
*lpCMI\itemsToShrink()\rcItem\left = (*lpCMI\cx / 8)
*lpCMI\iCurrentItem = -1
EndIf
If ListSize(*lpCMI\itemsToShrink()) > 0
If need_to_start_shrink_timer = #True
SetTimer_(hWnd, #TIMER_SHRINK, 10, #Null)
EndIf
EndIf
KillTimer_(hWnd, #MOUSE_IN_TIMER)
*lpCMI\mmTimerActive = #False
EndIf
Case #TIMER_SHRINK
RedrawDC( hWnd, *lpCMI )
Case #TIMER_EXPAND
RedrawDC( hWnd, *lpCMI, 1 )
EndSelect
ProcedureReturn 1
Case #WM_MOUSEMOVE
If *lpCMI\mmTimerActive = #False
SetTimer_(hWnd, #MOUSE_IN_TIMER, 50, #Null)
*lpCMI\mmTimerActive = #True
EndIf
cItem = -1
cursX = lParam & $0000FFFF
cursY = (lParam & $FFFF0000) >> 16
ctr = 0
ForEach *lpCMI\cm()
With *lpCMI\cm()\rcItem
If cursX >= \left And cursX <= \right
If cursY >= \top And cursY <= \bottom
cItem = ctr
Break
EndIf
EndIf
EndWith
ctr + 1
Next
If *lpCMI\iCurrentItem > -1
If *lpCMI\iCurrentItem <> cItem
; Remove item from expand queue
item_found = #False
ResetList(*lpCMI\itemsToExpand())
While NextElement(*lpCMI\itemsToExpand())
If *lpCMI\itemsToExpand()\iItem = *lpCMI\iCurrentItem
item_found = #True
CopyStructure(@*lpCMI\itemsToExpand()\rcItem, @rcfound.RECT, RECT)
iCopyColor = *lpCMI\itemsToExpand()\iColor
DeleteElement(*lpCMI\itemsToExpand())
EndIf
Wend
AddElement(*lpCMI\itemsToShrink())
*lpCMI\itemsToShrink()\iItem = *lpCMI\iCurrentItem
If item_found = #True
CopyStructure(@rcfound, @*lpCMI\itemsToShrink()\rcItem, RECT)
*lpCMI\itemsToShrink()\iColor = iCopyColor
Else
CopyStructure(@*lpCMI\cm()\rcItem, @rcfound, RECT)
rcfound\left = (*lpCMI\cx / 8)
CopyStructure(@rcfound, @*lpCMI\itemsToShrink()\rcItem, RECT)
*lpCMI\itemsToShrink()\iColor = #White
EndIf
If ListSize(*lpCMI\itemsToShrink()) = 1
SetTimer_(hWnd, #TIMER_SHRINK, 10, #Null)
EndIf
EndIf
EndIf
If cItem <> *lpCMI\iCurrentItem
*lpCMI\iCurrentItem = cItem
If *lpCMI\iCurrentItem <> -1
shrink_found = #False
ResetList(*lpCMI\itemsToShrink())
While NextElement(*lpCMI\itemsToShrink())
If *lpCMI\itemsToShrink()\iItem = *lpCMI\iCurrentItem
shrink_found = #True
CopyStructure(@*lpCMI\itemsToShrink()\rcItem, @rcfound.RECT, RECT)
icolor = *lpCMI\itemsToShrink()\iColor
DeleteElement(*lpCMI\itemsToShrink())
EndIf
Wend
ResetList(*lpCMI\itemsToExpand())
While NextElement(*lpCMI\itemsToExpand())
If *lpCMI\itemsToExpand()\iItem = *lpCMI\iCurrentItem
DeleteElement(*lpCMI\itemsToExpand())
EndIf
Wend
AddElement(*lpCMI\itemsToExpand())
If shrink_found = #False
*lpCMI\itemsToExpand()\iItem = cItem
*lpCMI\itemsToExpand()\iColor = *lpCMI\iMenuColor
CopyStructure(@*lpCMI\cm()\rcItem, @*lpCMI\itemsToExpand()\rcItem, RECT)
Else
*lpCMI\itemsToExpand()\iItem = cItem
*lpCMI\itemsToExpand()\iColor = icolor
CopyStructure(@rcfound, @*lpCMI\itemsToExpand()\rcItem, RECT)
EndIf
If ListSize(*lpCMI\itemsToExpand()) = 1
SetTimer_(hWnd, #TIMER_EXPAND, 10, #Null)
EndIf
EndIf
EndIf
If *lpCMI\iCurrentItem <> -1
nowCursor = LoadCursor_(#Null, #IDC_HAND)
SetClassLongPtr_(hWnd, #GCL_HCURSOR, nowCursor)
DestroyCursor_(SetCursor_(nowCursor))
Else
nowCursor = LoadCursor_(#Null, #IDC_ARROW)
SetClassLongPtr_(hWnd, #GCL_HCURSOR, nowCursor)
DestroyCursor_(SetCursor_(nowCursor))
EndIf
ProcedureReturn 0
Case #WM_DESTROY
; Delete all bitmaps and DC's created
DeleteObject_(SelectObject_(*lpCMI\dcs\hDcFinal\hDc, *lpCMI\dcs\hDcFinal\hOrinalBmp))
DeleteDC_(*lpCMI\dcs\hDcFinal\hDc)
DeleteObject_(SelectObject_(*lpCMI\dcs\hDcParent\hDc, *lpCMI\dcs\hDcParent\hOrinalBmp))
DeleteDC_(*lpCMI\dcs\hDcParent\hDc)
; Free memory
FreeList(*lpCMI\itemsToExpand())
FreeList(*lpCMI\itemsToShrink())
FreeList(*lpCMI\cm())
FreeMemory(*lpCMI)
Case #WM_WINDOWPOSCHANGED
; Resize all drawing operations...
Case #WM_PAINT ;- WM_PAINT
BeginPaint_(hWnd, @ps.PAINTSTRUCT)
BitBlt_(ps\hdc, ps\rcPaint\left, ps\rcPaint\top, (ps\rcPaint\right-ps\rcPaint\left), ps\rcPaint\bottom-ps\rcPaint\top, *lpCMI\dcs\hDcFinal\hDc, ps\rcPaint\left, ps\rcPaint\top, #SRCCOPY)
EndPaint_(hWnd, @ps)
ProcedureReturn 0
EndSelect
ProcedureReturn DefWindowProc_(hWnd, uMsg, wParam, lParam)
EndProcedure
cmwcex.WNDCLASSEX\cbSize = SizeOf(WNDCLASSEX)
cmwcex\hbrBackground = GetStockObject_(#NULL_BRUSH)
cmwcex\hCursor = LoadCursor_(#Null, #IDC_ARROW)
cmwcex\hInstance = GetModuleHandle_(#Null)
cmwcex\lpfnWndProc = @Menu_Wnd_Proc()
cmwcex\lpszClassName = @szClassNameXy
cmwcex\style = #CS_HREDRAW|#CS_VREDRAW
RegisterClassEx_(@cmwcex)
Procedure Set_Menu_Item_Text( hMenu, enumMenu, szText.s )
retVal = #False
*lpCMI.CUSTOM_MENU_INFO = GetWindowLongPtr_(hMenu, #GWLP_USERDATA)
If *lpCMI = 0
ProcedureReturn 0
EndIf
ForEach *lpCMI\cm()
If *lpCMI\cm()\enumMenu = enumMenu
*lpCMI\cm()\szItemName = szText
retVal = #True
RedrawDC(hMenu, *lpCMI)
InvalidateRect_(hMenu, 0, 1)
Break
EndIf
Next
ProcedureReturn retVal
EndProcedure
Procedure.s Get_Menu_Item_Text( hMenu, enumMenu )
retVal.s = ""
*lpCMI.CUSTOM_MENU_INFO = GetWindowLongPtr_(hMenu, #GWLP_USERDATA)
If *lpCMI = 0
ProcedureReturn retVal
EndIf
ForEach *lpCMI\cm()
If *lpCMI\cm()\enumMenu = enumMenu
retVal = *lpCMI\cm()\szItemName
Break
EndIf
Next
ProcedureReturn retVal
EndProcedure
Procedure Create_Custom_Menu( *lpCmc.CUSTOM_MENU_CREATE, List menuitems.CUSTOM_MENU() )
hWnd = #Null
If Not(IsFont(*lpCmc\numFontItems))
*lpCmc\numFontItems = LoadFont(#PB_Any, "Times New Roman", 10)
EndIf
If Not(IsFont(*lpCmc\numFontHeader))
*lpCmc\numFontHeader = LoadFont(#PB_Any, "Times New Roman", 20)
EndIf
*lpCMI.CUSTOM_MENU_INFO = AllocateMemory(SizeOf(CUSTOM_MENU_INFO))
*lpCMI\numFont = *lpCmc\numFontItems
*lpCMI\numHeaderFont = *lpCmc\numFontHeader
*lpCMI\szMenuTitle = *lpCmc\szMenuTitle ;szMenuName
*lpCMI\hParent = *lpCmc\hParent ;hParent
*lpCMI\iMenuColor = *lpCmc\rgb_menu_unselected ;iColor
*lpCMI\iShadowColor = *lpCmc\rgb_text_shadow_unselected ;iShadowColor
*lpCMI\iEndColor = *lpCmc\rgb_menu_hilite ;iEndColor
*lpCMI\iTitleColor = *lpCmc\rgb_title_color
*lpCMI\iShadowColorHilite = *lpCmc\rgb_text_shadow_hilite
If *lpCmc\hWnd_To_Notify_Of_Menu_Events = #Null
*lpCMI\hWndToNotify = *lpCMI\hParent
Else
*lpCMI\hWndToNotify = *lpCmc\hWnd_To_Notify_Of_Menu_Events
EndIf
NewList *lpCMI\cm.CUSTOM_MENU()
dwExStyle = #Null
If *lpCmc\bHadBorder = #True
dwStyle = #WS_CHILD|#WS_VISIBLE|#WS_BORDER
Else
dwStyle = #WS_CHILD|#WS_VISIBLE
EndIf
CopyList(menuitems(), *lpCMI\cm())
hWnd = CreateWindowEx_(dwExStyle, @szClassNameXy, "", dwStyle, *lpCmc\x, *lpCmc\y, *lpCmc\cx, *lpCmc\cy, *lpCmc\hParent, #Null, GetModuleHandle_(#Null), *lpCMI)
If Not( hWnd )
FreeList(*lpCMI\cm())
FreeMemory(*lpCMI)
EndIf
ProcedureReturn hWnd
EndProcedure