Seite 3 von 3

Verfasst: 15.08.2007 17:04
von Andreas
Xaby hat geschrieben:
Ich habe ein großes ImageGadget(), ein ListViewGadget und dann ist mein Fenster auch schon voll. Also ich habe keine Fläche vom Fenster, die von Gadgets nicht belegt ist.
Setz die anderen Gadgets nach hinten, dann kannst du wieder schieben.

Code: Alles auswählen

Global OldCB.l

Procedure ContainerCB(wnd,msg,wparam,lparam)
  Select msg
  Case #WM_MOVE
    RedrawWindow_(wnd,0,0,#RDW_ALLCHILDREN|#RDW_UPDATENOW|#RDW_INVALIDATE)
  Case #WM_NCHITTEST
    ProcedureReturn #HTCAPTION
  EndSelect
  ProcedureReturn CallWindowProc_(oldCB,wnd,msg,wparam,lparam)
EndProcedure

If OpenWindow(0, #PB_Ignore,#PB_Ignore,640,480, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  If CreateGadgetList(WindowID(0))
    ImageGadget(100,0,0,WindowWidth(0),WindowHeight(0),0,#PB_Image_Border) 
    ContainerGadget(1, 120, 40, 306, 140, #PB_Container_Raised)
    ContainerGadget(2, 0, 20, 300, 114, #PB_Container_Single)
    CloseGadgetList()
    TextGadget(3, 10,4,100,16,"Meine Tools")
    CloseGadgetList()
    SetGadgetColor(1,#PB_Gadget_BackColor,RGB(128,0,0))
    SetGadgetColor(3,#PB_Gadget_BackColor,RGB(128,0,0))
    SetGadgetColor(3,#PB_Gadget_FrontColor,RGB(255,255,0))
    If CreateToolBar(0, GadgetID(2))
      ;Nur zum testen
      For I = 0 To 64
        ToolBarStandardButton(i,Random(14))
      Next i
      OldCB = SetWindowLong_(GadgetID(1),#GWL_WNDPROC,@ContainerCB());Callback für Container(1) setzen
      SendMessage_(ToolBarID(0),#TB_SETSTYLE,0,$50000041|#TBSTYLE_WRAPABLE);Neuen Style für Toolbar setzn
      SendMessage_(ToolBarID(0),#TB_AUTOSIZE,0,0);Toolbar neuzeichnen
    EndIf

    ;#########
    ;hier wird das Imagegadget nach hinten gesetzt
    ;#########
    SetWindowPos_(GadgetID(100),#HWND_BOTTOM,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE) 
  EndIf
  
  Repeat
    EventID = WaitWindowEvent()
    Select EventID
    Case #PB_Event_Menu
      MessageRequester("Menüpunkt",Str(EventMenu()),0)
    Case #PB_Event_Gadget
      Select EventGadget()
      Case 0
        Quit = 1
      EndSelect
    Case #PB_Event_CloseWindow
      Quit = 1
    EndSelect
  Until Quit = 1
EndIf
End

Verfasst: 15.08.2007 22:34
von edel
DarkDragon hat geschrieben:
ts-soft hat geschrieben:Es kann nur einer den Fokus haben, ansonsten eigenes OS schreiben.
Ne es geht auch Hauptfenster und Childfenster. Wie weiß ich allerdings nicht. Man sieht es häufig in Programmen.

Bild
Nein es kann nur ein Fenster den Fokus haben. Man "vergisst"
lediglich einen inaktiven Rahmen zu zeichnen.

Verfasst: 16.08.2007 08:13
von Xaby
Gibt es eine einfache Möglichkeit, alle Gadgets nach hinten zu setzen, bis auf die, wo ich meine Container verschieben will ...

oder kann ich die in den Vordergrund schieben?
Wenn ja, wie wende ich #HWND_TOP richtig an.
Als ich das auf meinen Container angewendet habe, war er einfach weg.

Sonst muss ich das ja bei jedem Gadget extra machen, oder kann ich einen Standard für das Erstellen bei einem Gadget festlegen.

So wie man zum Beispiel einen Schriftsatz festlegt ...

dass das dann für alle folgenden Gadgets gilt ...

:freak:

Verfasst: 16.08.2007 08:49
von Xaby

Code: Alles auswählen

Global OldCB.l 

Procedure ContainerCB(wnd,msg,wparam,lparam) 
  Select msg 
    Case #WM_MOVE 
      RedrawWindow_(wnd,0,0,#RDW_ALLCHILDREN|#RDW_UPDATENOW|#RDW_INVALIDATE) 
    Case #WM_NCHITTEST 
      ProcedureReturn #HTCAPTION 
  EndSelect 
  ProcedureReturn CallWindowProc_(oldCB,wnd,msg,wparam,lparam) 
EndProcedure 

CreateImage(0,640,480)


If OpenWindow(0, #PB_Ignore,#PB_Ignore,640,380, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget) 
  If CreateGadgetList(WindowID(0)) 
    ScrollAreaGadget(99,20,20,400,340,640,480,10,#PB_ScrollArea_Raised)
      ImageGadget(100,0,0,WindowWidth(0),WindowHeight(0),ImageID(0),#PB_Image_Border) 
    CloseGadgetList()
    ListIconGadget(98,440,20,180,340,"Paul",100,#PB_ListIcon_CheckBoxes|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)  
    For i=0 to 30
      AddGadgetItem(98,-1,Str(Random(3000)))
    Next
    
    ContainerGadget(1, 120, 40, 306, 140, #PB_Container_Raised) 
    ContainerGadget(2, 0, 20, 300, 114, #PB_Container_Single) 
    CloseGadgetList() 
    TextGadget(3, 10,4,100,16,"Meine Tools") 
    CloseGadgetList() 
    SetGadgetColor(1,#PB_Gadget_BackColor,RGB(128,0,0)) 
    SetGadgetColor(3,#PB_Gadget_BackColor,RGB(128,0,0)) 
    SetGadgetColor(3,#PB_Gadget_FrontColor,RGB(255,255,0)) 
    If CreateToolBar(0, GadgetID(2)) 
      ;Nur zum testen 
      For I = 0 To 64 
        ToolBarStandardButton(i,Random(14)) 
      Next i 
      OldCB = SetWindowLong_(GadgetID(1),#GWL_WNDPROC,@ContainerCB());Callback für Container(1) setzen 
      SendMessage_(ToolBarID(0),#TB_SETSTYLE,0,$50000041|#TBSTYLE_WRAPABLE);Neuen Style für Toolbar setzn 
      SendMessage_(ToolBarID(0),#TB_AUTOSIZE,0,0);Toolbar neuzeichnen 
    EndIf 
    
    ;######### 
    ;hier wird das Imagegadget nach hinten gesetzt 
    ;######### 
    SetWindowPos_(GadgetID(99),#HWND_BOTTOM,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE) 
    SetWindowPos_(GadgetID(98),#HWND_BOTTOM,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE) 
    
   ;SetGadgetState(100,ImageID(0))
    
  EndIf 
  
  
  
  Repeat 
    EventID = WaitWindowEvent() 
    Select EventID 
      Case #PB_Event_Menu 
        MessageRequester("Menüpunkt",Str(EventMenu()),0) 
      Case #PB_Event_Gadget 
        Select EventGadget() 
          Case 0 
            Quit = 1 
        EndSelect 
      Case #PB_Event_CloseWindow 
        Quit = 1 
    EndSelect 
  Until Quit = 1 
EndIf 
End 
So, nun hab ich es mal etwas so gemacht, wie es bei mir aussieht.

Problem ist, dass ich meine Toolbar gar nicht richtig sehen kann meistens

Verfasst: 18.08.2007 13:25
von mk-soft
Habe es mal ohne Container erstellt mit eigenen Fenster in Toolbox-Style

Code: Alles auswählen

;- Konstanten
Enumeration ; Window ID
  #Window
  #ToolBox
EndEnumeration

Enumeration ; Menu ID
  #Menu
EndEnumeration

Enumeration ; MenuItem ID
  #Menu_Exit
EndEnumeration

Enumeration ; Statusbar ID
  #Statusbar
EndEnumeration

Enumeration ; Gadget ID
  
EndEnumeration

; ***************************************************************************************

;- Globale Variablen
Global exit = 0

Macro MAKELONG(a,b)
  ((a & $FFFF) | (b << 16))
EndMacro


Procedure CreateToolWindow(window, x, y, dx, dy, Titel.s, parend)

  Protected style, x1, y1
  
  x1 = WindowX(parend) + x
  y1 = WindowY(parend) + y
  
  style = #PB_Window_SystemMenu ; Mit Close Button
  
  If OpenWindow(window, x1, y1, dx, dy, titel, style | #PB_Window_Invisible, WindowID(parend))
    SetWindowLong_(WindowID(window), #GWL_EXSTYLE, GetWindowLong_(WindowID(window), #GWL_EXSTYLE) | #WS_EX_PALETTEWINDOW)
    ; Code here
    If CreateToolBar(0, WindowID(window))
      ;Nur zum testen
      For I = 1 To 50
        ToolBarStandardButton(i,Random(14))
        If I % 4 = 0
          ;ToolBarSeparator()
        EndIf
      Next i
      style = SendMessage_(ToolBarID(0),#TB_GETSTYLE,0,0)
      SendMessage_(ToolBarID(0),#TB_SETSTYLE,0,style|#TBSTYLE_WRAPABLE);Neuen Style für Toolbar setzn
      SendMessage_(ToolBarID(0),#TB_AUTOSIZE,0,0);Toolbar neuzeichnen
    EndIf

    ; Code end
    HideWindow(window, #False)
  EndIf

EndProcedure


;- Fenster
style = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #WS_EX_PALETTEWINDOW
If OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 400, 300, "Fenster", style)
  ; Menu
  If CreateMenu(#Menu, WindowID(#Window))
    MenuTitle("&Datei")
      MenuItem(#Menu_Exit, "Be&enden")
  EndIf
  ; Statusbar
  CreateStatusBar(#Statusbar, WindowID(#Window))
  ; Gadgets
  If CreateGadgetList(WindowID(#Window))
  
  EndIf
  
  CreateToolWindow(#ToolBox, 10,40,5*22,10*22, "Toolbox", #Window)
  
  ;-- Hauptschleife
  Repeat
    event   = WaitWindowEvent()
    window  = EventWindow()
    menu    = EventMenu()
    type    = EventType()
    Select event
      Case #PB_Event_Menu                       ; ein Menü wurde ausgewählt
        Select menu
          Case #Menu_Exit
            Exit = 1
          Default
            MessageRequester("Menüpunkt",Str(EventMenu()),0)
        EndSelect
      Case #PB_Event_Gadget                     ; ein Gadget wurde gedrückt
      Case #PB_Event_CloseWindow                ; das Schließgadget vom Fenster wurde gedrückt
        Select window
          Case #Window
            Exit = 1
          Case #Toolbox
            MessageRequester("Toolbox","Close Button" ,0)
        EndSelect
        
      Case #PB_Event_Repaint                    ; der Fensterinhalt wurde zerstört und muss neu gezeichnet werden (nützlich für 2D Grafik-Operationen) 
      Case #PB_Event_SizeWindow                 ; das Fenster wurde in der Größe verändert
      Case #PB_Event_MoveWindow                 ; das Fenster wurde verschoben
      Case #PB_Event_ActivateWindow             ; das Fenster wurde aktiviert (hat den Fokus erhalten)
      Case #PB_Event_SysTray                    ; das SysTray wurde aktiviert
    
    EndSelect
    
  Until Exit
EndIf

FF :wink:

P.S. Edit: Style erst lesen und neue eigenschaft hinzufügen

Verfasst: 18.08.2007 13:54
von PureLust
Und wenn Du jetzt noch >das hier< von edel einbaust, dürfte Xaby endlich rundum glücklich sein. ;)

Verfasst: 20.08.2007 09:02
von Xaby
Ist schon ganz cool.

Nur eins sieht manchmal noch komisch aus.

Wenn man das Neuzeichnen deaktiviert, aber ein Fenster darüber zieht, bleibt das Fenster grau. Und wenn man dann eine Toolbox anklickt, bekommt das Hauptfenster keinen neuen Fokus und bleibt damit grau.

Irgendwie müsste man es so machen, dass das Neuzeichnen nicht komplett ausgestellt ist. Denn wenn ein Fenster außerhalb der Anwendung den Fokus bekommt, müssen alle Toolboxen grau werden und wenn eine der Toolboxen oder das Hauptfenster ihn hat, müssen wieder alle so tun als wären sie aktiviert.

Mir würde jetzt spontan einfallen, dass man das in einer Schleife macht und allen vorhandenen Fenstern der betreffenden Anwendung nach einander den Fokus gibt.

mmm. Wisst ihr, was ich meine :freak:

Aber ansonsten ist das wirklich gut. Schon mal vielen Dank an alle, die mithelfen, eine coole Toolbox zu bekommen.

Achja und das Problem aus dem verlinkten Thema, würde ich hier gern auch aufgreifen.

Denn der Rahmen beim Ziehen eines "normalen" Fensters ist wesentlich dünner als bei einer "ToolBox"

Und wie bekomme ich [x] an eine ToolBox, die kleiner ist als 100 Pixel Breite? Kann man diese 100 verstellen. Denn das ist auch bei dem GrößenverstellGadget von nöten.

Denn Randlos und GrößenverstellGadget zusammen machen das Fenster immer 100 Pixel oder größer.

:allright: