Seite 2 von 3

Verfasst: 14.08.2007 12:35
von ts-soft
Snapcode, Autor weiß ich nicht, engl. Forum:

Code: Alles auswählen

Procedure SnapWindowCallBack(hWnd.l, Event.l, wParam.l, lParam.l )
  Protected scrRect.RECT, scrW.l, scrH.l, wndRect.RECT, wndW.l, wndH.l
  If Event = #WM_WINDOWPOSCHANGED
   
    SystemParametersInfo_(#SPI_GETWORKAREA, 0, @scrRect, 0)     
      scrW = scrRect\right  - scrRect\left
      scrH = scrRect\bottom - scrRect\top     
   
    GetWindowRect_(hWnd, @wndRect)
      wndW = wndRect\right  - wndRect\left
      wndH = wndRect\bottom - wndRect\top
   
    If wndRect\left-scrRect\left < 16 And wndRect\left-scrRect\left > 0 : wndRect\left = 0 : EndIf
    If wndRect\top-scrRect\top < 16 And wndRect\top-scrRect\top  > 0 : wndRect\top  = 0 : EndIf
    If scrRect\right-wndRect\right  < 16 And scrRect\right-wndRect\right > 0: wndRect\left = scrRect\right-wndW : EndIf
    If scrRect\bottom-wndRect\bottom < 16 And scrRect\bottom-wndRect\bottom > 0: wndRect\top  = scrRect\bottom-wndH : EndIf
   
    ResizeWindow(0, wndRect\left, wndRect\top, #PB_Ignore, #PB_Ignore)
   
  EndIf
 
  ProcedureReturn #PB_ProcessPureBasicEvents
 
EndProcedure 
Vielleicht mal mehr in den Foren lesen? üben, lernen, suchen?

Oder Programme schreiben, die man schreiben kann. Bei der Planung
weiß ich was ich machen kann und was nicht. Entweder ich mache es wie
ich es kann oder ich suche selber. Bei kleineren Anpassungsproblemen
kann man ja noch fragen.

Andockbare Fenster sind keine Anfängerfragen, also lasse es weg, bis Du
soweit bist, meine Meinung dazu.

Verfasst: 14.08.2007 15:07
von Andreas
Xaby hat geschrieben: Am liebsten wäre mir ein kleines Fenster, was im Vordergrund bleibt, aber nur über meinem Hauptfenster, nicht über anderen Fenstern.

Das sollte eine kleine Titelleiste haben oder auch keine.
Am liebsten wären mir auch Buttons oder ImageGadgets, die mir MenuNummern zurück geben.

Größe muss nicht verändert werden können.

Und schließen soll man sie eigentlich auch nicht können.
So ein Fenster kann man auch selber mit 2 PanelGadgets simulieren
Zum Verschieben muss allerdings ein Callback verwendet werden.

In derArt z.B.

Code: Alles auswählen

Global OldCB.l

Procedure ContainerCB(wnd,msg,wparam,lparam)
  Select msg
  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))
    ButtonGadget(0, 10,10,80,24,"OK")
    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
  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: 14.08.2007 15:13
von Xaby
@Andreas
Genau so etwas habe ich gemeint. Wenn ich nun noch herausfinde, wie ich das Toolbar-Fenster über mein Hauptfenster ziehen kann, dann ist prima. :allright:

@tztztssss

Wieder ein typischer Beitrag von dir.
Du liebst die Menschen oder?

Wenn ich alles könnte, dann bräuchte ich das Forum doch nicht.
Es gibt keine dummen Fragen nur dumme Antworten.

Andockbare Fenster ist das letzte, was ich brauche.

Da hab ich auch schon Code von Fluid Byte gesehen.

Was ich meinte sind diese Werkzeugleisten, die sich so verhalten wie die Startleiste bei Windows.
Achso, entschuldige, der Meister hat ja nur Linux :mrgreen:

Die Startleiste(n) kann man mit Verknüpfungen füllen, man kann sie an jeden Rand ziehen oder wenn man sie wegzieht aus der Leiste hinaus, dann entsteht ein Fenster mit Titel und den Symbolen.

Und so ein automatisches Fenster wollte ich. Nicht mehr und nicht weniger.

Muss doch da schon was geben.

Wo ich mich nicht selbst um die ganzen Abfragen kümmern muss, sondern das durch sich selbst irgendwie verwaltet wird.

Einfach eine Toolbar mit erweiterten Optionen.
Oder so wie die Links im Explorer. Die kann man verschieben, man kann sie anzeigen lassen oder auch nicht. Man kann das Menu fixieren oder nicht und dann die Links verschieben. Zu den Links kann man ganz einfach Symbole hinzufügen ...

Die Links sind jetzt auf die Menüleiste(n) im Explorer beschrängt, aber so wie im Office (egal ob MS oder Open) ...

Befehle hinzufügen und wegwählen. ...

Das Thema wurde schon oft angesprochen und ich hab es auch schon oft gesucht und immer nur Brocken gefunden. Und immer kamen nur so dumme Antworten wie kuck in der Hilfe oder wozu ist das Codearchive da. Die Wahrheit ist, es weiß keiner wie es geht oder keiner will es verraten.

Und die Ragbars waren ja nicht wirklich das, was ich meinte.
Zwar ein Ansatz, aber noch viel zu kompliziert.

Da sind wir wieder an der Stelle, das PB bei größeren Projekten, selbst wenn man sich macht, weil man Spaß dran hat oder um sich selbst was beizubringen ... einfach unübersichtlich werden.

Und wenn ich dann noch Code für meine Menüs einfügen muss und den selbst entwickeln muss. Na dann gute Nacht.
Dann verliere auch ich die Lust. Denn Basic sollte dazu da sein, sich um Kernprobleme kümmern zu können.

Und wenn man zum Beispiel ein Zeichenprogramm oder so etwas machen möchte, sollte es nicht das Kernproblem sein, wie man einen Pinsel auswählen kann, sondern wie der Pinsel malt.

Hau, ich habe gespricht. :?

Verfasst: 14.08.2007 15:25
von ts-soft
Sowas macht z.B. Toolbar Pro (PBOSL), Beispiele sind enthalten. Deinen
Beschreibungen kann ich leider nicht folgen, die sind zwar blumig, aber
unlogisch :mrgreen:

Am besten Du forderst mich nicht auf, was zu antworten, ich verstehe Dich nicht, bin Dir also nicht nützlich.

Hab auch keine Lust immer Romane zu lesen, in denen das wesentlich meist fehlt

Verfasst: 14.08.2007 15:42
von Xaby
Naja, wenigstens verstehen mich DarkDragon und Andreas :mrgreen:
Vielleicht schaffe ich es ja noch, und dann versteht mich die halbe Welt :D :allright:

Verfasst: 14.08.2007 19:18
von mk-soft
Xaby hat geschrieben:Naja, wenigstens verstehen mich DarkDragon und Andreas :mrgreen:
Vielleicht schaffe ich es ja noch, und dann versteht mich die halbe Welt :D :allright:
Ein echten Programmierer versteht so wie so kein Mensch

Verfasst: 15.08.2007 09:38
von Xaby
@Andreas

Ich möchte ein Kind von dir.

Ein ContainerGadget mit der #GadgetID
und es ist geil :mrgreen:

OldCB = SetWindowLong_(GadgetID(#GadgetID),#GWL_WNDPROC,@ContainerCB());Callback für Container(1) setzen

Ich liebe es. Ich muss sagen, mir sind fast die Tränen vor Freude gekommen als ich "begriffen" habe, wie es funktioniert.

Frei definierbare Menüs ohne Ende :mrgreen:

Wenn ich die nun über mein Fenster hinaus ziehen möchte, muss ich wieder die Suche bemühen. Es gab so etwas im Forum.
Gadgets über dem Window hinaus zeichnen zu können.

Spontan würde mir einfallen ein transparentes Window zu machen ...

Ich find das so "geil", ich bekomme mich gar nicht mehr ein :D :allright: :allright: :allright:

TestCode

Code: Alles auswählen

Global OldCB.l 

Procedure ContainerCB(wnd,msg,wparam,lparam) 
  Select msg 
    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)) 
    ContainerGadget(100, 8, 10, 288, 50, #PB_Container_BorderLess) 
    SetGadgetColor(100,#PB_Gadget_BackColor,RGB(128,0,0)) 
    ButtonGadget(0, 4,0,40,24,"Exit") 
    ButtonGadget(1, 50,10,180,24,"beweglich und Doppelklick") 
    CloseGadgetList()
    
    OldCB = SetWindowLong_(GadgetID(1),#GWL_WNDPROC,@ContainerCB());Callback für Container(1) setzen 
    OldCB = SetWindowLong_(GadgetID(100),#GWL_WNDPROC,@ContainerCB());Callback für Container(1) setzen 
    
    
  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 
  
  debug GadgetX(100)
  debug GadgetY(100)
EndIf 

End 

Mal was anderes

Verfasst: 15.08.2007 10:27
von Xaby

Code: Alles auswählen

#LightBlue=$FF8080

Global OldCB.l 

Procedure ContainerCB(wnd,msg,wparam,lparam) 
  Select msg 
    Case #WM_NCHITTEST 
      ProcedureReturn #HTCAPTION 
  EndSelect 
  ProcedureReturn CallWindowProc_(oldCB,wnd,msg,wparam,lparam) 
EndProcedure 

Procedure MoveButton(x,y,b,h,Text$,color=#LightBlue)
  GDID=ContainerGadget(#PB_Any, x, y, b, h,#PB_Container_Flat ) 
  SetGadgetColor(GDID,#PB_Gadget_BackColor,Color) 
  Dings=ButtonGadget(#PB_Any, 1,1,b-4,h-4,Text$,#BS_Flat) 
  CloseGadgetList()
  OldCB = SetWindowLong_(GadgetID(GDID),#GWL_WNDPROC,@ContainerCB());Callback für Container(1) setzen 
  ProcedureReturn Dings
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)) 
    AddButton=MoveButton(100,100,100,50,"Add Button")
    Exit=MoveButton(100,200,50,30,"Exit")
    
  EndIf 
  
   
  Repeat 
    EventID = WaitWindowEvent() 
    Select EventID 
      Case #PB_Event_Menu 
        MessageRequester("Menüpunkt",Str(EventMenu()),0) 
      Case #PB_Event_Gadget 
        Select EventGadget() 
          Case Exit 
            Quit = 1 
          Case AddButton
            But=MoveButton(50+10*Random(20),10+10*Random(20),Random(40)*3+30,Random(50)*2+20,"",RGB(Random(255),Random(255),Random(255)))
            SetGadgetText(But,Str(But))
          Default
            MessageRequester("Info: Pressed Button","Number: "+GetGadgetText(EventGadget()))
         EndSelect 
      Case #PB_Event_CloseWindow 
        Quit = 1 
    EndSelect 
  Until Quit = 1 
 

EndIf 

End 
Irgendwie müsste man nun nur noch das Fenster, bzw. die Buttons neu zeichnen, damit es nicht zu hässlichen DarstellungsFehlern kommt.

Und irgendwann ist sicherlich auch der Punkt erreicht, wo Windows nicht mehr mit spielt, wenn man zu oft auf den AddButton klickt.

Wenn man darauf ImageButtons, oder ImageGadgets macht, könnte man sogar ein PuzzleSpiel machen oder ein Ebenen basiertes Malprogramm ...
Vielleicht sogar ein Dune2077 basierend auf Gadgets :mrgreen: :allright:

Einen hab ich noch

Verfasst: 15.08.2007 14:16
von Xaby
Hier mal ein kleiner Test ... :mrgreen:

Code: Alles auswählen

#LightBlue=$FF8080

Global OldCB.l 

Procedure ContainerCB(wnd,msg,wparam,lparam) 
  Select msg 
    Case #WM_NCHITTEST 
      ProcedureReturn #HTCAPTION 
  EndSelect 
  ProcedureReturn CallWindowProc_(oldCB,wnd,msg,wparam,lparam) 
EndProcedure 

Procedure MoveToolBar(x,y,b,h,Text$,Beginning=0,color=#LightBlue)
  GDID=ContainerGadget(#PB_Any, x, y, b, h,#PB_Container_Flat ) 
  SetGadgetColor(GDID,#PB_Gadget_BackColor,Color) 
  ;Dings=ButtonGadget(#PB_Any, 1,1,b-4,h-4,Text$,#BS_Flat) 
  Dings=ContainerGadget(#PB_Any, 1,1,b-4,h-4,#PB_Container_Flat) 
  CloseGadgetList()
  CloseGadgetList()
  OldCB = SetWindowLong_(GadgetID(GDID),#GWL_WNDPROC,@ContainerCB());Callback für Container(1) setzen 
  
  debug Dings
  
  ToolB=CreateToolBar(#PB_Any, GadgetID(Dings)) 
  debug ToolB
  If ToolB
    ToolBarStandardButton(Beginning+0,#PB_ToolBarIcon_New) 
    ToolBarStandardButton(Beginning+1,#PB_ToolBarIcon_Open) 
    ToolBarSeparator()
    ToolBarStandardButton(Beginning+2,#PB_ToolBarIcon_Save) 
  
    SendMessage_(ToolBarID(ToolB),#TB_SETSTYLE,0,$50000041|#TBSTYLE_WRAPABLE);Neuen Style für Toolbar setzn 
    SendMessage_(ToolBarID(ToolB),#TB_AUTOSIZE,0,0);Toolbar neuzeichnen   
  EndIf
  
  ProcedureReturn ToolB;GDID
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)) 
    
    MoveToolBar(200,100,90,32,"Text")
    MoveToolBar(100,100,32,90,"Text",3)
    
    
  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 
Noch mal vielen Dank an Andreas :allright: :allright: :allright:

Ich hab mir nun noch mal die Menüs in PhotoImpact in aller Ruhe angesehen und ich bin der Meinung, es müssen Fenster sein.

Code: Alles auswählen

 Aus der PB-Hilfe, beide Fenster sind hervorgehoben!!!
#Main = 0
#MDIChild = 1
If OpenWindow(#Main, 0, 0, 400, 300, "MDIGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget)
  If CreateGadgetList(WindowID(#Main)) And CreateMenu(#Main, WindowID(#Main))
    MenuTitle("Menu index 0")
    MenuTitle("MDI windows menu")
    MenuItem(0, "self created item")
    MenuItem(1, "self created item")
    
    MDIGadget(0, 0, 0, 0, 0, 1, 2, #PB_MDI_AutoSize)
    AddGadgetItem(0, #MDIChild, "child window")
    CreateGadgetList(WindowID(#MDIChild))
    ; add gadgets here...
    UseGadgetList(WindowID(#Main)) ; wir gehen zurück zur Gadgetliste des Hauptfensters
  EndIf
  Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
Oder wie kann ich ein SizeGadget() an einen Container machen?

Verfasst: 15.08.2007 15:39
von Xaby
Eijeijei

@Andreas

Habe dich ja gelobt und fand das auch ganz prima.
Aber nun wollte ich das mal in mein eigentliches Programm einbauen und musste feststellen, dass ich die "ContainerGadgets" nicht verschieben kann, wenn darunter echte Gadgets sind.

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.

Wenn ich nun genauso die Toolbars erstelle werden sie anfangs angezeigt, versuche ich sie aber anzuklicken, um sie zu verschieben, dann klicke ich das darunterliegende Gadget an.

Das ist natürlich nicht Sinn der Sache.

:roll: