Change PanelGadget Orientation?

Just starting out? Need help? Post your questions and find answers here.
johnfermor
User
User
Posts: 29
Joined: Wed Dec 31, 2003 3:17 pm

Change PanelGadget Orientation?

Post by johnfermor »

Hi

Is it possible to change the orientation of a panelgadget in the same way as with a VB Tabstrip? Or is this one for the WishList?

For Example;

Image

Cheers ...
User avatar
Flype
Addict
Addict
Posts: 1542
Joined: Tue Jul 22, 2003 5:02 pm
Location: In a long distant galaxy

Post by Flype »

hello

some infos here ( go to the 'tab styles' lines ) : http://www.autohotkey.com/docs/misc/Styles.htm

and here how to set styles...

Code: Select all

#TCS_SCROLLOPPOSITE = $1
#TCS_BOTTOM         = $2
#TCS_RIGHT          = $2
#TCS_MULTISELECT    = $4
#TCS_FLATBUTTONS    = $8
#TCS_FORCEICONLEFT  = $10
#TCS_FORCELABELLEFT = $20
#TCS_HOTTRACK       = $40
#TCS_VERTICAL       = $80
#TCS_MULTILINE      = $200

Procedure SetStyle(Handle, style.l) 
  SetWindowLong_(Handle, #GWL_STYLE, GetWindowLong_(Handle, #GWL_STYLE) | style) 
EndProcedure 

OpenWindow(0, 300, 300, 300, 300, #PB_Window_SystemMenu, "Tab test", 0)
CreateGadgetList(WindowID()) 
PanelGadget(0, 0, 0, 300, 300) 
For i = 1 To 9
  AddGadgetItem(0, i - 1, "Onglet " + Str(i)) 
Next 
CloseGadgetList() 
  
SetStyle(GadgetID(0),#TCS_MULTILINE) 
SetGadgetState(0,0) 
  
Repeat : Until WaitWindowEvent()=#WM_CLOSE 
No programming language is perfect. There is not even a single best language.
There are only languages well suited or perhaps poorly suited for particular purposes. Herbert Mayer
gilles_k
New User
New User
Posts: 9
Joined: Thu May 15, 2003 7:38 am

Post by gilles_k »

Thanks Flype.

Justement c'est ce que cherchais. :wink:
PB
PureBasic Expert
PureBasic Expert
Posts: 7581
Joined: Fri Apr 25, 2003 5:24 pm

Post by PB »

Flype, thanks for the flag information, but I can't get a working example of
vertical tab buttons. When I try, only some buttons work and others don't.
Also, the text on the tabs is still horizontal and not vertical. Any ideas?
I compile using 5.31 (x86) on Win 7 Ultimate (64-bit).
"PureBasic won't be object oriented, period" - Fred.
Sparkie
PureBatMan Forever
PureBatMan Forever
Posts: 2307
Joined: Tue Feb 10, 2004 3:07 am
Location: Ohio, USA

Post by Sparkie »

Be aware that PanelGadget's with tabs on the sides or bottom are not supported with XP skins enabled. msdn info here

I've had some success with the native PanelGadget but for now it seems easier to use Win32 API to create your own. This is what I've come up with so far. This code creates a TabControl (PanelGadget) with tabs on the left side.

Not sure how efficient this would be in a real project, but here it is none the less. ;)

Code: Select all

#TCS_TABS = 0
#TCS_BOTTOM = 2       ; Place tabs on bottom
#TCS_RIGHT = 2        ; Place tabs on right
#TCS_FLATBUTTONS = 8
#TCS_VERTICAL = $80   ; Place tabs on left
#TCS_BUTTONS = $100
#TCS_MULTILINE = $200 ; Required if using #TCS_VERTICAL
#Panel_0 = 100
Enumeration
  #Container_0
  #Container_1
  #Button_0
  #Button_1
  #ExplorerList_0
  #ExplorerTree_0
EndEnumeration
Procedure myWindowCallback(hwnd, msg, wparam, lparam)
  Shared tabToHideID
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_NOTIFY
      *pnmhdr.NMHDR = lparam
      If *pnmhdr\code = #TCN_SELCHANGING 
        *ptcnmhdr.NMHDR = lparam
        ; --> Get Tab that is losing focus (this ID = #Container_0 or #Container_1)
        tabToHideID = SendMessage_(*ptcnmhdr\hwndFrom, #TCM_GETCURSEL, 0, 0)
      EndIf
      If *pnmhdr\code = #TCN_SELCHANGE 
        *ptcnmhdr.NMHDR = lparam
        ; --> Get Tab that is gaining focus (this ID = #Container_0 or #Container_1)
        tabToShowID = SendMessage_(*ptcnmhdr\hwndFrom, #TCM_GETCURSEL, 0, 0)
        If *ptcnmhdr\idFrom = #Panel_0
          ; --> Show / hide tab contents
          HideGadget(tabToShowID, 0)
          HideGadget(tabToHideID, 1)
        EndIf
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure
If OpenWindow(0, 0, 0, 400, 200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Sparkies Custom PanelGadget") And CreateGadgetList(WindowID(0)) 
  SetWindowCallback(@myWindowCallback())
  panelX = 10
  panelY = 10
  panelW = WindowWidth() - 20
  panelH = WindowHeight() - 20
  ; --> Define style and create PanelGadget()
  ; --> To use standard tabs
  tcStyle = #TCS_TABS | #TCS_MULTILINE | #TCS_VERTICAL
  ; --> To use buttons
  ;tcStyle = #TCS_BUTTONS | #TCS_MULTILINE | #TCS_VERTICAL
  ; --> To use flat buttons
  ;tcStyle = #TCS_FLATBUTTONS | #TCS_BUTTONS | #TCS_MULTILINE | #TCS_VERTICAL
  hPanel = CreateWindowEx_(#WS_EX_LEFT | #WS_EX_LTRREADING | #WS_EX_RIGHTSCROLLBAR, "SysTabControl32", "PanelGadget1", #WS_OVERLAPPED | #WS_CHILD | #WS_VISIBLE | #WS_CLIPSIBLINGS | #WS_GROUP | #WS_TABSTOP | tcStyle, panelX, panelY, panelW, panelH, WindowID(), #Panel_0, GetModuleHandle_(0) , 0)
  ; --> Load and set font to use for tabs (optional)
  tabFont = LoadFont(0, "Arial", 10, #PB_Font_Bold)
  SendMessage_(hPanel, #WM_SETFONT, tabFont, 1)
  pgadItem.TC_ITEM
  ; --> init Tab #1
  tabText1$ = "Tab #1"
  pgadItem\mask = #TCIF_TEXT
  pgadItem\pszText = @tabText1$
  pgadItem\cchTextMax = Len(tabText1$)
  ; --> Insert tab #1
  SendMessage_(hPanel, #TCM_INSERTITEM, #Container_0, pgadItem) 
  ; Get rect for tab for placement of our ContainerGadgets to follow
  SendMessage_(hPanel, #TCM_GETITEMRECT, #Container_0, @tcRect.RECT)
  ; --> Need to work on a better placement formula, but this seems to work for now
  ContainerGadget(#Container_0, panelX+(tcRect\right-tcRect\left)+3, panelY+tcRect\top, panelW-(tcRect\right-tcRect\left)-6, panelH-6)
  ; --> Add some gadgets to Tab #1 (#Conatiner_0 is parent)
  ButtonGadget(#Button_0, 100, 10, 120, 20, "Hello, we are in Tab #1")
  ExplorerListGadget(#ExplorerList_0, 10, 35, 330, 120, "c:\")
  CloseGadgetList()
  ; --> init Tab #2
  tabText2$ = "Tab #2"
  pgadItem\mask = #TCIF_TEXT
  pgadItem\pszText = @tabText2$
  pgadItem\cchTextMax = Len(tabText2$)
  SendMessage_(hPanel, #TCM_INSERTITEM, #Container_1, pgadItem) 
  ; --> Need to work on a better placement formula, but this seems to work for now
  ContainerGadget(#Container_1, panelX+(tcRect\right-tcRect\left)+3, panelY+tcRect\top, panelW-(tcRect\right-tcRect\left)-6, panelH-6)
  ; --> Add some gadgets to Tab #1 (#Conatiner_1 is parent)
  ButtonGadget(#Button_1, 100, 10, 120, 20, "Hello, we are in Tab #2")
  ExplorerTreeGadget(#ExplorerTree_0, 10, 35, 330, 120, "c:\")
  CloseGadgetList()
  ; --> We start off in Tab #1 so we hide Tab #2 contents (#Container_1)
  HideGadget(#Container_1, 1)
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow 
EndIf 
End
What goes around comes around.

PB 5.21 LTS (x86) - Windows 8.1
johnfermor
User
User
Posts: 29
Joined: Wed Dec 31, 2003 3:17 pm

Post by johnfermor »

Thanks guys. Just what I needed!
Dr. Dri
Enthusiast
Enthusiast
Posts: 243
Joined: Sat Aug 23, 2003 6:45 pm

Post by Dr. Dri »

Sparkie wrote:I've had some success with the native PanelGadget but for now it seems easier to use Win32 API to create your own.
Do you have an example with a native PB PanelGadget working with bottom tabs ??
I would like to choose between native and api Panel please.

Dri
TerryHough
Enthusiast
Enthusiast
Posts: 781
Joined: Fri Apr 25, 2003 6:51 pm
Location: NC, USA
Contact:

Post by TerryHough »

@Sparkie

As usual you have great solutions.

However, I tried working with your example to make the tabs appear
on the right and on the bottom without success.

Any suggestions?

Terry
Sparkie
PureBatMan Forever
PureBatMan Forever
Posts: 2307
Joined: Tue Feb 10, 2004 3:07 am
Location: Ohio, USA

Post by Sparkie »

@Dr. Dri: Still looking for the old code. I may have to re-do it. If I remember correctly, the PanelGadget has hidden static controls and it was blocking the tab clicks when they were on the bottom.

@TerryHough: Thank you. :)

I'll have a closer look and see what I can come up with.
What goes around comes around.

PB 5.21 LTS (x86) - Windows 8.1
TerryHough
Enthusiast
Enthusiast
Posts: 781
Joined: Fri Apr 25, 2003 6:51 pm
Location: NC, USA
Contact:

Post by TerryHough »

@Sparkie
On closer examination, tabs on the bottom or right is working. They are
just getting covered up by the ContainerGadget and/or its contents.
Sparkie
PureBatMan Forever
PureBatMan Forever
Posts: 2307
Joined: Tue Feb 10, 2004 3:07 am
Location: Ohio, USA

Post by Sparkie »

@Dr. Dri: Here's the non-working code I had laying around. There was more to it, but I cut it out because it wasn't helping things work. :(

Code: Select all

#TCS_BOTTOM = 2
#TCS_RIGHT = 2
#TCS_VERTICAL = $80
If OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget") And CreateGadgetList(WindowID(0)) 
  hPgad = PanelGadget(0,8,8,306,203) 
  AddGadgetItem (0,-1,"Panel 1") 
  AddGadgetItem (0,-1,"Panel 2") 
  ButtonGadget(2, 10, 15, 80, 24,"Button 1") 
  ButtonGadget(3, 95, 15, 80, 24,"Button 2") 
  CloseGadgetList() 
  SetWindowLong_(GadgetID(0), #GWL_STYLE, GetWindowLong_(GadgetID(0), #GWL_STYLE) | #TCS_BOTTOM)
  pgStatic1 = FindWindowEx_(hPgad, 0, "Static", 0)
  MoveWindow_(pgStatic1, 0, 0, 260, 180, 1)
  pgStatic2 = FindWindowEx_(hPgad, pgStatic1, "Static", 0)
  MoveWindow_(pgStatic2, 0, 0, 260, 180, 1)
  Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow 
EndIf 
@Dr. Dri and TerryHough: Sorry I haven't had time to take a closer at this. I hope to be able to be around here a little more some time next month. :)
What goes around comes around.

PB 5.21 LTS (x86) - Windows 8.1
freak
PureBasic Team
PureBasic Team
Posts: 5940
Joined: Fri Apr 25, 2003 5:21 pm
Location: Germany

Post by freak »

You should note that these different orientations do not work with ComCtl32.dll version 6 (which comes with XP)
and will therefore not display correctly on a XP system with skins enabled.
(it looks quite ugly actually)

You should use the OSVersion() command to check for XP systems and
use the normal orientation in that case to be save.
quidquid Latine dictum sit altum videtur
Dr. Dri
Enthusiast
Enthusiast
Posts: 243
Joined: Sat Aug 23, 2003 6:45 pm

Post by Dr. Dri »

interesting code (i don't understand everything...) but changing tab only works once... and after reading freak's reply i think i won't use this kinda panels...

Dri
Dr. Dri
Enthusiast
Enthusiast
Posts: 243
Joined: Sat Aug 23, 2003 6:45 pm

Post by Dr. Dri »

I've looked closer to your snippet. And now i understand why it only works once. I moved a part of the code and it's okay... Still they was a problem after adding tabs... But i was easy too understand why... Here is my working code thanks to your... (i think it's easy to handle it with a loop...)

Code: Select all

#TCS_BOTTOM = 2
#TCS_RIGHT = 2
#TCS_VERTICAL = $80
If OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget") And CreateGadgetList(WindowID(0))
  hPgad = PanelGadget(0,8,8,306,203)
  AddGadgetItem (0,-1,"Panel 1")
  AddGadgetItem (0,-1,"Panel 2")
  AddGadgetItem (0,-1,"Panel 3")
  AddGadgetItem (0,-1,"Panel 4")
  ButtonGadget(2, 10, 15, 80, 24,"Button 1")
  ButtonGadget(3, 95, 15, 80, 24,"Button 2")
  CloseGadgetList()
  SetWindowLong_(GadgetID(0), #GWL_STYLE, GetWindowLong_(GadgetID(0), #GWL_STYLE) | #TCS_BOTTOM)
  Repeat
    pgStatic1 = FindWindowEx_(hPgad, 0, "Static", 0)
    MoveWindow_(pgStatic1, 0, 0, 260, 180, 1)
    pgStatic2 = FindWindowEx_(hPgad, pgStatic1, "Static", 0)
    MoveWindow_(pgStatic2, 0, 0, 260, 180, 1)
    pgStatic3 = FindWindowEx_(hPgad, pgStatic2, "Static", 0)
    MoveWindow_(pgStatic3, 0, 0, 260, 180, 1)
    pgStatic4 = FindWindowEx_(hPgad, pgStatic3, "Static", 0)
    MoveWindow_(pgStatic4, 0, 0, 260, 180, 1)
  Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
Dri ;)
Dr. Dri
Enthusiast
Enthusiast
Posts: 243
Joined: Sat Aug 23, 2003 6:45 pm

Post by Dr. Dri »

with the loop (for/next)

Code: Select all

#TCS_BOTTOM = 2
#TCS_RIGHT = 2
#TCS_VERTICAL = $80
If OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget") And CreateGadgetList(WindowID(0))
  hPgad = PanelGadget(0,8,8,306,203)
  AddGadgetItem (0,-1,"Panel 1")
  AddGadgetItem (0,-1,"Panel 2")
  AddGadgetItem (0,-1,"Panel 3")
  AddGadgetItem (0,-1,"Panel 4")
  ButtonGadget(2, 10, 15, 80, 24,"Button 1")
  ButtonGadget(3, 95, 15, 80, 24,"Button 2")
  CloseGadgetList()
  SetWindowLong_(GadgetID(0), #GWL_STYLE, GetWindowLong_(GadgetID(0), #GWL_STYLE) | #TCS_BOTTOM)
  Repeat
    pgStatic = 0
    For i = 1 To CountGadgetItems(0)
      pgStatic = FindWindowEx_(hPgad, pgStatic, "Static", 0)
      MoveWindow_(pgStatic, 0, 0, 260, 180, 1)
    Next i
  Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
Dri ^^
Post Reply