Seite 1 von 2

Vertikale Trenner in horizontalem Menü

Verfasst: 30.07.2013 10:25
von Daffy0815
Hallo,

weis jemand wie man in folgendem Beispielcode Trennstriche zwischen den Menüpunkten einfügen kann damit es so aussieht wie auf dem Beispielfoto?

Code: Alles auswählen

If OpenWindow(#WindowNum, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateMenu(#MenuNum, WindowID(#WindowNum))
    MenuItem(1, "Erster Eintrag")
    MenuItem(2, "Zweiter Eintrag")
    MenuItem(3, "Dritter Eintrag")
  EndIf
 
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Menu
        If GetActiveWindow() = #WindowNum
          Select EventMenu()
            Case 1
              Debug "Erster Eintrag"
            Case 2
              Debug "Zweiter Eintrag"
            Case 3
            Debug "Dritter Eintrag"
        EndSelect
      EndIf
    EndIf  
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
Bild

Gruß

Daffy

Re: Vertikale Trenner in horizontalem Menü

Verfasst: 30.07.2013 10:39
von RSBasic
Danke, dass du einen extra Thread erstellt hast. Wenn du das jedes Mal zukünftig machen wirst, wäre das super.

So wie es in deinem Screenshot abgebildet ist, nimm am besten gleich eine leicht modifizierte ToolBar:

Code: Alles auswählen

EnableExplicit

Define EventID
Define TBID

Procedure ToolBarText(hwnd,ButtonID,Text.s)
  Protected tbi.TBBUTTONINFO
  
  tbi.TBBUTTONINFO
  tbi\cbSize = SizeOf(TBBUTTONINFO)
  tbi\dwMask = #TBIF_TEXT | #TBIF_STYLE
  tbi\fsStyle = #BTNS_BUTTON | #BTNS_AUTOSIZE
  tbi\pszText = @Text
  SendMessage_(hwnd,#TB_SETBUTTONINFO,ButtonID,tbi)
  
EndProcedure

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  If CreateToolBar(0,WindowID(0))
    SetWindowLongPtr_(ToolBarID(0), #GWL_STYLE, GetWindowLongPtr_(ToolBarID(0), #GWL_STYLE) | #TBSTYLE_LIST)
    ToolBarImageButton(1,0)
    ToolBarSeparator()
    ToolBarImageButton(2,0)
    ToolBarSeparator()
    ToolBarImageButton(3,0)
    
    ToolBarText(ToolBarID(0), 1, "Erster Eintrag")
    ToolBarText(ToolBarID(0), 2, "Zweiter Eintrag")
    ToolBarText(ToolBarID(0), 3, "Dritter Eintrag")
    
    TBID = SendMessage_(ToolBarID(0), #TB_GETIMAGELIST, 0, 0)
    ImageList_SetIconSize_(TBID, 0, 16)
    SendMessage_(ToolBarID(0), #TB_SETIMAGELIST, 0, TBID)
    SendMessage_(ToolBarID(0), #TB_AUTOSIZE, 0, 0)
    
  EndIf
  
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Menu
      Select EventMenu()
        Case 1
          Debug "Erster Eintrag"
        Case 2
          Debug "Zweiter Eintrag"
        Case 3
          Debug "Dritter Eintrag"
      EndSelect
    EndIf 
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf

Re: Vertikale Trenner in horizontalem Menü

Verfasst: 30.07.2013 11:10
von Daffy0815
@RSBasic

Danke!

Allergings kann ich mich langsam des Gefühls nicht erwehren, dass die Erstellung von Programmen in PureBasic ganz ohne die Verwendung Windows-API's bzw. die Erstellung entsprechender Prozeduren zu deren Aufruf fast unmöglich ist.

Gruß

Daffy

Re: Vertikale Trenner in horizontalem Menü

Verfasst: 30.07.2013 11:24
von Kiffi
Daffy0815 hat geschrieben:Allergings kann ich mich langsam des Gefühls nicht erwehren, dass die Erstellung von Programmen in PureBasic ganz ohne die Verwendung Windows-API's bzw. die Erstellung entsprechender Prozeduren zu deren Aufruf fast unmöglich ist.
Wer Sonderwünsche hat, die über Standardfunktionalitäten hinausgehen, muss halt in die Trickkiste greifen. Das ist übrigens in allen Programmiersprachen so und keine Eigenart von PureBasic.

Grüße ... Kiffi

Re: Vertikale Trenner in horizontalem Menü

Verfasst: 30.07.2013 11:28
von Daffy0815
@Kiffi

Das mag sein, dann habe ich wohl nur "Sonderwünsche".
Ich habe lediglich festgestellt, dass so ziemlich alles was ich bis jetzt versucht habe immer in einer Prozedur mit "...._" endete.

Gruß

Daffy

Re: Vertikale Trenner in horizontalem Menü

Verfasst: 30.07.2013 11:46
von Bisonte
Um die API Geschichte zu umgehen, kannst du auch alles in einem CanvasGadget abwickeln,
was dann ein "klitzekleinesbisschen" aufwändiger wäre ;)

Allerdings sieht das Fenster im Screenshot eher wie ein PanelGadget aus... von der Funktion her, als ein Menu...

Re: Vertikale Trenner in horizontalem Menü

Verfasst: 30.07.2013 13:49
von Daffy0815
@RSBasic

Das Beispiel funktioniert ja schon recht gut hat aber leider einen Haken!

Nachdem ich nun tagelang mit Menüs experimentiert habe und mir alle möglichen Proceduren "zusammengenagelt" habe um zu erreichen das diese Menüs und die dazugehörigen Fenster sich entsprechend den in der Systemsteuerung unter "Anzeige" gemachten Einstellungen automatisch richtig skalieren ist das hier natürlich nicht mehr der Fall.

Hier ist ja der größenbestimmende Punkt nicht mehr "Menü" sondern "Symbole".
Wenn man hier jetzt die Größe ändert ist die ganze schöne Leiste "erster, zweiter, dritter Eintrag" vermurkst.

Gruß

Daffy

PS. muss jetzt erst mal weg...

Re: Vertikale Trenner in horizontalem Menü

Verfasst: 30.07.2013 16:02
von RSBasic
Bisonte hat geschrieben:Allerdings sieht das Fenster im Screenshot eher wie ein PanelGadget aus... von der Funktion her, als ein Menu...
Das finde ich nicht, weil PanelGadget (SysTabControl32) keine Möglichkeit anbietet, vertikale Trennlinien zwischen Tabs anzuzeigen. Das geht nur bei Menu und ToolBar. Oder man erstellt es mit CanvasGadget komplett selber, aber da muss man aber auch alles andere programmieren, was deutlich aufwändiger ist, weil man das Rad komplett neu erfinden muss, wie du es bereits sagtest.
Daffy0815 hat geschrieben:Allergings kann ich mich langsam des Gefühls nicht erwehren, dass die Erstellung von Programmen in PureBasic ganz ohne die Verwendung Windows-API's bzw. die Erstellung entsprechender Prozeduren zu deren Aufruf fast unmöglich ist.
PureBasic ist eine plattformunabhängige Programmiersprache und wurde entwickelt, um z.B. die vom Betriebssystem bereitgestellten Controls zu verwenden und wichtig hierbei ist, dass die angebotene Funktionalität i.d.R. auf allen Systemen (Windows (WinAPI/Win32), Linux (GTK), MacOS (ich glaube Cocoa)) gleich ist.
Wenn man nun eine zusätzliche Eigenschaft wie z.B. vertikale Trennlinie nativ anbieten möchte, dann muss dafür gesorgt werden, dass es auch auf Linux und MacOS ebenfalls gibt, so dass die Programmausgabe überall gleich aussieht und funktioniert, egal wo man seinen Code kompilieren möchte.
Jedes Betriebssystem besitzt eigene Programmierschnittstellen, wie z.B. WinAPI bei Windows. Damit kann man alles mögliche machen. Und da es so umfangreich und komplex ist, kann der Hauptentwickler von PB natürlich nicht alles umsetzen und dafür sorgen, dass es auch mit GTK funktioniert. Das würde viele Jahre dauern, dass alles für alle Betriebssysteme anzubieten. Deshalb muss man, wenn man Sonderwünsche bezüglich der Umgestaltung und Anpassung der Controls hat, auch öfters auf WinAPI zugreifen, weil PureBasic niemals die vollständige Funktionspalette von WinAPI anbieten kann. Wenn die angebotene Standard-Funktionalität für den Benutzer ausreicht, dann ist es gut, dann funktionieren die Anwendungen problemlos auch auf Linux und MacOS, aber wenn man Sonderwünsche hat, dann muss man eben WinAPI nutzen. Da ich z.B. meine Programme eh nur für Windows entwickle, hab ich kein Problem, WinAPI zu nutzen.
Ich bin sogar froh, dass PB die WinAPI-Möglichkeit anbietet. Wäre es nicht möglich, wär ich aber ganz schnell weg.
Daffy0815 hat geschrieben:Wenn man hier jetzt die Größe ändert ist die ganze schöne Leiste "erster, zweiter, dritter Eintrag" vermurkst.
Bei solchen Sachen immer ein Screenshot mitliefern, weil ein Außenstehender nicht hellsehen kann.^^

Re: Vertikale Trenner in horizontalem Menü

Verfasst: 30.07.2013 16:05
von andi256
@Daffy0815
uff
... wenn man da die letzten Tage durchs Forum blättert ... bewundere ich deine Hartnäckigkeit wie du ein funktionierendes "Menü System" mit Gewalt kaputt kriegen willst...

(Also ich hab zick Programme in unserer Firma mit unterschiedlichsten Auflösungen / Einstellungen / Schriftgössen / XP / Win7 / skin / klassischer .. etc .... am laufen und immer mit den Standard-(PB)–Menu … Das Menu passt sich wunderbar an !)

Und meine persönliche Meinung:
jedes Programm das mir seine eigene Gui aufzwingt und sei es nur eine geänderte Farbe ... mag ich nicht :-)

*DUCK * und wieder weg
Andi256

Re: Vertikale Trenner in horizontalem Menü

Verfasst: 30.07.2013 17:04
von Bisonte
RSBasic hat geschrieben:
Bisonte hat geschrieben:Allerdings sieht das Fenster im Screenshot eher wie ein PanelGadget aus... von der Funktion her, als ein Menu...
Das finde ich nicht, weil PanelGadget (SysTabControl32) keine Möglichkeit anbietet, vertikale Trennlinien zwischen Tabs anzuzeigen. Das geht nur bei Menu und ToolBar. Oder man erstellt es mit CanvasGadget komplett selber, aber da muss man aber auch alles andere programmieren, was deutlich aufwändiger ist, weil man das Rad komplett neu erfinden muss, wie du es bereits sagtest.
pssst...
Bisonte hat geschrieben:Allerdings sieht das Fenster im Screenshot eher wie ein PanelGadget aus... von der Funktion her, als ein Menu...
weil ich seh da kein "Menu" aufklappen (oder so ähnlich) ... also eher wie ein PanelGadget mit eigener Tableiste. Weil eine Menuezeile geht eigentlich immer über
die komplette Fensterbreite und dort sind ja noch 2 Buttons im weg... daher kommt meine Vermutung ;)