How to skin menus?

Just starting out? Need help? Post your questions and find answers here.
User avatar
Mok
User
User
Posts: 11
Joined: Thu Sep 30, 2010 3:36 pm

How to skin menus?

Post by Mok »

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.
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8451
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: How to skin menus?

Post by netmaestro »

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
BERESHEIT
User avatar
Mok
User
User
Posts: 11
Joined: Thu Sep 30, 2010 3:36 pm

Re: How to skin menus?

Post by Mok »

If I want to skin a PanelGadget in the Visual Studio way, will I have to ownerdraw it too? (SetGadgetColor() does not work)
PureLust
Enthusiast
Enthusiast
Posts: 477
Joined: Mon Apr 16, 2007 3:57 am
Location: Germany, NRW

Re: How to skin menus?

Post by PureLust »

Mok wrote:If I want to skin a PanelGadget ...
Maybe you will find a helpfull code snipped in the CODE ARCHIV (just scroll down to: PanelGadget).

Greetz, PL
[Dynamic-Dialogs] - create complex GUIs the easy way
[DeFlicker] - easily deflicker your resizeable Windows
[WinFX] - Window Effects (incl. 'click-through' Window)
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: How to skin menus?

Post by RASHAD »

@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

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
User avatar
Mok
User
User
Posts: 11
Joined: Thu Sep 30, 2010 3:36 pm

Re: How to skin menus?

Post by Mok »

@RASHAD: I thought abou this too... but I believed that there'd be some WinAPI stuff.
However, thanks :wink:
Post Reply