Good evening!
With the aid of CreateImageMenu() and #PB_Menu_ModernLook it's quite simple to create a pretty and futuristic-looking menu, but can I also skin it by myself? I want to create a "Visual Studio"-like menu, but how?
Thanking you in anticipation, Mok.
How to skin menus?
- netmaestro
- PureBasic Bullfrog
- Posts: 8451
- Joined: Wed Jul 06, 2005 5:42 am
- Location: Fort Nelson, BC, Canada
Re: How to skin menus?
You'd have to ownerdraw the menu for that. It's by no means trivial, and though you may find an example via search on these forums here is a good c++ tutorial.
http://www.codeproject.com/KB/menus/owndraw.aspx
http://www.codeproject.com/KB/menus/owndraw.aspx
BERESHEIT
Re: How to skin menus?
If I want to skin a PanelGadget in the Visual Studio way, will I have to ownerdraw it too? (SetGadgetColor() does not work)
Re: How to skin menus?
Maybe you will find a helpfull code snipped in the CODE ARCHIV (just scroll down to: PanelGadget).Mok wrote:If I want to skin a PanelGadget ...
Greetz, PL
[Dynamic-Dialogs] - create complex GUIs the easy way
[DeFlicker] - easily deflicker your resizeable Windows
[WinFX] - Window Effects (incl. 'click-through' Window)
[DeFlicker] - easily deflicker your resizeable Windows
[WinFX] - Window Effects (incl. 'click-through' Window)
Re: How to skin menus?
@Mok
The word skin confuses me a little bit
Look at what NM & PureLust advised you to do
And next is some code for you as a start
Good luck
1- Ownerdrawn Menu and PopUp Menu
2- Workaround for PanelGadget
You can use Normal image or Solid color image or whatever you want
The word skin confuses me a little bit
Look at what NM & PureLust advised you to do
And next is some code for you as a start
Good luck
1- Ownerdrawn Menu and PopUp Menu
Code: Select all
Global SFColor.l, SBColor.l,DFColor.l,DBColor.l ,Icons.l
Structure new_mm
hFont.l
Text.s
hIco.l
EndStructure
Global Dim menu.new_mm(13)
Procedure Menu_Owner(wnd, msg, wParam, lParam)
Select msg
Case #WM_MEASUREITEM
hdc = GetDC_(wnd)
*nmm.MEASUREITEMSTRUCT = lParam
*lnew_mm.new_mm = *nmm\itemData
GetTextExtentPoint32_(hdc,*lnew_mm\Text,Len(*lnew_mm\Text),@size.SIZE);
*nmm\itemWidth = size\cx + Icons
*nmm\itemHeight = size\cy
ReleaseDC_(wnd,hdc)
Case #WM_DRAWITEM
*nmd.DRAWITEMSTRUCT = lParam
*llnew_mm.new_mm = *nmd\itemData
If *nmd\itemState & #ODS_SELECTED
SetTextColor_(*nmd\hDC,SFColor)
SetBkColor_(*nmd\hDC,SBColor)
ExtTextOut_(*nmd\hDC,*nmd\rcItem\left + Icons,*nmd\rcItem\top,#ETO_OPAQUE,*nmd\rcItem,*llnew_mm\Text,Len(*llnew_mm\Text),0)
;DrawIconEx_(*nmd\hDC,*nmd\rcItem\left,*nmd\rcItem\top,*llnew_mm\hIco,14,14,0,0,3)
Else
SetTextColor_(*nmd\hDC,DFColor)
SetBkColor_(*nmd\hDC,DBColor)
ntx = *nmd\rcItem\left + Icons
nty = *nmd\rcItem\top
ExtTextOut_(*nmd\hDC,*nmd\rcItem\left + Icons,*nmd\rcItem\top,#ETO_OPAQUE,*nmd\rcItem,*llnew_mm\Text,Len(*llnew_mm\Text),0)
;DrawIconEx_(*nmd\hDC,*nmd\rcItem\left,*nmd\rcItem\top,*llnew_mm\hIco,14,14,0,0,3)
EndIf
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Icons = 15 ;Can be 0
If OpenWindow(0, 0, 0,400,300, "PopupMenu Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SetWindowColor(0,$000000)
mhnd = CreateMenu(0, WindowID(0))
MenuTitle("File")
MenuItem( 1, "")
MenuItem( 2, "")
MenuItem( 3, "")
MenuBar()
MenuItem( 4, "")
MenuTitle("Edition")
MenuItem(5, "")
MenuItem(6, "")
MenuItem(7, "")
menu(0)\Text = " Load"
menu(1)\Text = " Save"
menu(2)\Text = " Save As...."
menu(3)\Text = " Quit"
menu(4)\Text = " Cut"
menu(5)\Text = " Copy"
menu(6)\Text = " Paste"
;hMenu = GetMenu_(WindowID(0))
ModifyMenu_(MenuID(0),1,#MF_BYCOMMAND|#MF_OWNERDRAW,1,menu(0))
ModifyMenu_(MenuID(0),2,#MF_BYCOMMAND|#MF_OWNERDRAW,2,menu(1))
ModifyMenu_(MenuID(0),3,#MF_BYCOMMAND|#MF_OWNERDRAW,3,menu(2))
ModifyMenu_(MenuID(0),4,#MF_BYCOMMAND|#MF_OWNERDRAW,4,menu(3))
ModifyMenu_(MenuID(0),5,#MF_BYCOMMAND|#MF_OWNERDRAW,5,menu(4))
ModifyMenu_(MenuID(0),6,#MF_BYCOMMAND|#MF_OWNERDRAW,6,menu(5))
ModifyMenu_(MenuID(0),7,#MF_BYCOMMAND|#MF_OWNERDRAW,7,menu(6))
; GetWindowRect_(WindowID(0), wr.RECT)
; OpenWindow(1,wr\left+90 ,wr\top+25,314,20,"",#WS_POPUP,WindowID(0))
; SetWindowColor(1,$000000)
; SetActiveWindow(0)
;**********************************************************************************
hPMenu = CreatePopupMenu(1)
MenuItem(10, "")
MenuItem(11, "")
MenuItem(12, "")
MenuBar()
OpenSubMenu("")
MenuItem(13, "")
MenuItem(14, "")
CloseSubMenu()
MenuBar()
MenuItem( 15, "")
menu(7)\Text = " Cut"
menu(8)\Text = " Copy"
menu(9)\Text = " Paste"
menu(10)\Text = " Options"
menu(11)\Text = " Window..."
menu(12)\Text = " Gadget..."
menu(13)\Text = " Quit"
ModifyMenu_(hPMenu,10,#MF_BYCOMMAND|#MF_OWNERDRAW,10,menu(7))
ModifyMenu_(hPMenu,11,#MF_BYCOMMAND|#MF_OWNERDRAW,11,menu(8))
ModifyMenu_(hPMenu,12,#MF_BYCOMMAND|#MF_OWNERDRAW,12,menu(9))
ModifyMenu_(hPMenu,13,#MF_BYCOMMAND|#MF_OWNERDRAW,13,menu(11))
ModifyMenu_(hPMenu,14,#MF_BYCOMMAND|#MF_OWNERDRAW,14,menu(12))
ModifyMenu_(hPMenu,15,#MF_BYCOMMAND|#MF_OWNERDRAW,15,menu(13))
;SubMenu
ModifyMenu_(hPMenu,4,#MF_BYPOSITION|#MF_OWNERDRAW,0,menu(10))
DFColor = $FD0202
DBColor = $01FFFE
SFColor = $00FFFF
SBColor = $EAAB0D
SetWindowCallback(@Menu_Owner())
; Result = GetMenuItemCount_(MenuID(0))
; For i = 0 To Result - 1
; Debug GetMenuItemCount_(GetSubMenu_(MenuID(0),i))
; Next
; Debug GetMenuItemCount_(MenuID(1))
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
If EventGadget() = 0 And EventType() = #PB_EventType_RightClick
DisplayPopupMenu(1, WindowID(0))
EndIf
Case #WM_RBUTTONDOWN
DisplayPopupMenu(1, WindowID(0))
Case #PB_Event_Menu
Select EventMenu() ; To see which menu has been selected
Case 1 ; Load
MessageRequester("PureBasic", "Load", 0)
Case 10 ; Cut
MessageRequester("PureBasic", "Cut", 0)
Case 11 ; Copy
MessageRequester("PureBasic", "Copy", 0)
Case 12 ; Paste
MessageRequester("PureBasic", "Paste", 0)
Case 4,15 ; Quit
Quit = 1
EndSelect
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit = 1
EndIf
End
2- Workaround for PanelGadget
You can use Normal image or Solid color image or whatever you want
Code: Select all
LoadImage(0, "error_out.bmp") ;300 x 200 pix
LoadImage(1, "girl2.bmp") ;300 x 200 pix
OpenWindow(0,0,0,640,480,"", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
panc = PanelGadget(0, 10, 10, 300, 200)
;SetWindowLongPtr_(PanC, #GWL_STYLE, GetWindowLongPtr_(PanC, #GWL_STYLE)|#TCS_VERTICAL)
;SetWindowTheme_(GadgetID(0), @null.w, @null.w)
AddGadgetItem(0, -1, "1")
ListIconGadget(3, 15, 15,200,100,"TEST",60 ,#PB_ListIcon_GridLines)
ImageGadget(4,0,0, 300,200, ImageID(0))
DisableGadget(4,1)
AddGadgetItem(0, -1, "2")
ButtonGadget(5, 10, 15, 80, 24,"Button 1")
ButtonGadget(6, 95, 15, 80, 24,"Button 2")
ImageGadget(7, 0,0,300,200, ImageID(1))
DisableGadget(7,1)
CloseGadgetList()
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case 0
Num =GetGadgetState(0)
If Num = 0
;Some Code
ElseIf Num = 1
;Some Code
EndIf
Case 5
MessageRequester("This is a window title","Hello World!"+Chr(10)+"What Now??",#MB_ICONWARNING)
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Egypt my love
Re: How to skin menus?
@RASHAD: I thought abou this too... but I believed that there'd be some WinAPI stuff.
However, thanks
However, thanks
