Seite 1 von 1

Gadgets und Fensterelemente

Verfasst: 27.09.2012 22:45
von Illumany
Hallo Leute,

dies ist mein erster Eintrag hier im Forum. Seid gegrüßt liebe PBler!
Ich bin Programmier-Wiedereinsteiger nach so 'n paar Jahrhunderten und kenne mich mit PB noch nicht sonderlich gut aus.
Zur Zeit versuche ich den Gadget- und Fensterelemente-Kram zu verstehen.
Dazu habe ich ein gefundenes MDI-Beispiel auf ein Einzelfenster zusammengestrichen und versuche das jetzt zu einem Bildlader umzubauen, um die Zusammenhänge besser zu verstehen. Ich dachte, der ganze Menükram und Gadgetkram wird irgendwie in Listen verwaltet und wenn ich ein Gadget oder Menü in ein Fenster setze, "wissen" die folgenden Gadgets, welcher Platz schon besetzt ist. Bei mir haut das aber nicht hin. Immer verschwindet der Scrollschieber des ScrollAreaGadget() und solche Sachen. Muss man denn die Offsets der Elemente (x und y usw) von Hand anpassen? Oder was mache ich sonst falsch? Wo kann ich mehr über die Philosophie erfahren. Die Hilfetexte sind irgendwie immer so inselartig zusammenhanglos. Kann mir jemand auf die Sprünge helfen?

P.S. Viele Knöppe haben noch keine Funktion - das hat aber nix zu sagen. Mir gets um die Fensterelemente.


Code: Alles auswählen

#WINDOW = 0
#TOOLBAR = 0
#MENU = 0
#MDI_Base = 1
#IMAGE = 0
#WITH = 50

Enumeration           ; Konstanten vorbereiten
  #MENU_Open
  #MENU_Close
  #MENU_CloseAll
  #MENU_Quit
  #MENU_TileV
  #MENU_TileH
  #MENU_Cascade
  #MENU_Arrange
  #MENU_Previous
  #MENU_Next
  #MENU_FirstMDI
  #MENU_Draw_Canvas
  #MENU_Draw_Light
  #MENU_Draw_Shadow
EndEnumeration

Enumeration
  #Bmp_Canvas
  #Bmp_Light
  #Bmp_Shadow
EndEnumeration

Enumeration
  #SCROLL_Gad
  #IMAGE_Gad
EndEnumeration

UseJPEGImageDecoder()   ; Dokumentenhandler einbinden
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()[size=85][/size]

Procedure Message_Printer(Message)
  Static Counter, LastMessage
  If Message = LastMessage
    Counter = Counter + 1
  Else
    Debug ("Message: "+Str(LastMessage)+"Anzahl: "+Str(Counter))
    
    Counter = 0
    Debug ("Message: "+Str(Message))
    LastMessage = Message
  EndIf
EndProcedure

#WindowFlags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu  ;|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget

If OpenWindow(#WINDOW, 0, 0, 800, 600, "SMOOTH 0.1", #WindowFlags)
  
  If CreateMenu(#MENU, WindowID(#WINDOW))
    MenuTitle("File") ; ----------------------
    MenuItem(#MENU_Open, "Open")
    MenuItem(#MENU_Close, "Close")
    MenuItem(#MENU_CloseAll, "Close All")
    MenuBar()
    MenuItem(#MENU_QUit, "Quit")        
    MenuTitle("Graphics") ; ------------------
    MenuItem(#MENU_Draw_Canvas, "Draw Canvas")
    MenuItem(#MENU_Draw_Light, "Draw Light")
    MenuItem(#MENU_Draw_Shadow, "Draw Shadow")
    MenuItem(#MENU_Previous, "Previous")   
    MenuTitle("Windows") ; -----------------
    MenuItem(#MENU_TileV, "Tile vertically")
    MenuItem(#MENU_TileH, "Tile horizontally")
    MenuItem(#MENU_Cascade, "Cascade")
    MenuItem(#MENU_Previous, "Previous")
    MenuItem(#MENU_Next, "Next")
  EndIf
  If CreateToolBar(#TOOLBAR, WindowID(#WINDOW))
     ToolBarStandardButton(#MENU_Open, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(#MENU_Close, #PB_ToolBarIcon_Delete)
    ToolBarSeparator()
    ToolBarStandardButton(#MENU_Previous, #PB_ToolBarIcon_Undo)
    ToolBarStandardButton(#MENU_Next, #PB_ToolBarIcon_Redo)
  EndIf
  
  SAGadget = ScrollAreaGadget(#SCROLL_Gad,0, 0, WindowWidth(#WINDOW), WindowHeight(#WINDOW), WindowWidth(#WINDOW), WindowHeight(#WINDOW), 10)  ; Scrollfläche erzeugen      
  IMGadget = ImageGadget(#IMAGE_Gad,0,0, WindowWidth(#WINDOW), WindowHeight(#WINDOW), #PB_Image_Border)  ; Bildfläche erzeugen
  
  Quit = 0      ; ----------------- event handler --------------------------
  Repeat
    Event = WaitWindowEvent()           ; Ereignis abholen
    Message_Printer(Event)
   
    If Event = #PB_Event_CloseWindow    ; Fensterschließ-Event?
      Window = EventWindow()            ; von welchem Fenster kam es?
      If Window = #WINDOW               ; falls es das Hauptfenster war, 
        Quit = 1        
      EndIf
    ElseIf Event = #PB_Event_Menu       ; Menü-Event?
      Select EventMenu()                ; Menü# holen
        Case #MENU_Open            
          FileName$ = OpenFileRequester("Open Image", DefaultFile$, "Image Files (*.bmp,*.jpg,*.tiff,*.png,*.tga)|*.bmp;*.jpg;*.tiff;*.png;*.tga|All Files (*.*)|*.*", 0, #PB_Requester_MultiSelection)
          DefaultFile$ = FileName$         
          If LoadImage(#IMAGE, FileName$)     ; es wird ein Bild geladen, Image enthält anschließEnd die Bildnummer    
 
            Debug("IMGadget "+Str(IMGadget))
            SetGadgetState(#IMAGE_Gad,ImageID(#IMAGE)) 
            
          Else
            MessageRequester("Image Viewer","Could not load image: "+FileName$)
          EndIf                    
        Case #MENU_Close
          Debug ("#MENU_Close nicht implementiert")        
        Case #MENU_CloseAll                        
          Debug ("#MENU_CloseAll nicht implementiert")         
        Case #MENU_Quit
          Quit = 1     
;         Case #MENU_TileV
;           SetGadgetState(#GADGET_MDI, #PB_MDI_TileVertically)
;         Case #MENU_TileH
;           SetGadgetState(#GADGET_MDI, #PB_MDI_TileHorizontally)
;         Case #MENU_Cascade
;           SetGadgetState(#GADGET_MDI, #PB_MDI_Cascade)
;         Case #MENU_Arrange
;           SetGadgetState(#GADGET_MDI, #PB_MDI_Arrange)  
;         Case #MENU_Previous
;           SetGadgetState(#GADGET_MDI, #PB_MDI_Previous)   
;         Case #MENU_Next
;           SetGadgetState(#GADGET_MDI, #PB_MDI_Next)
;         Case #MENU_Draw_Canvas         
;         Case #MENU_Draw_Light
;         Case #MENU_Draw_Shadow
          EndSelect
      
    ElseIf Event = #PB_Event_SizeWindow
         ResizeGadget(#SCROLL_Gad, 0, 0, WindowWidth(#WINDOW), WindowHeight(#WINDOW))
    EndIf
    
  Until Quit = 1  
EndIf
[/size]

Re: Gadgets und Fensterelemente

Verfasst: 28.09.2012 00:36
von Josh
Nur mal so grob. Position und Größe des ScrollGadgets stimmen, bei dem Rest bin ich mir nicht sicher. Habe bis jetzt mit dem ScrollGadget noch nichts gemacht. Aber vielleicht als Ansatz zum weiter probieren.

Code: Alles auswählen

  X = 0
  Y = ToolBarHeight (#TOOLBAR)
  W = WindowWidth   (#WINDOW)
  H = WindowHeight  (#WINDOW) - MenuHeight() - ToolBarHeight(#TOOLBAR)
  SAGadget = ScrollAreaGadget(#SCROLL_Gad, X, Y, W, H, W, H, 10)    
  IMGadget = ImageGadget(#IMAGE_Gad,0,0, GetGadgetAttribute(#SCROLL_Gad, #PB_ScrollArea_InnerWidth), GetGadgetAttribute(#SCROLL_Gad, #PB_ScrollArea_InnerHeight),0);, #PB_Image_Border)  ; Bildfläche erzeugen
  CloseGadgetList()

Re: Gadgets und Fensterelemente

Verfasst: 28.09.2012 06:57
von Danilo
Probier mal damit:

Code: Alles auswählen

#WINDOW = 0
#TOOLBAR = 0
#MENU = 0
#MDI_Base = 1
#IMAGE = 0
#WITH = 50

Enumeration           ; Konstanten vorbereiten
  #MENU_Open
  #MENU_Close
  #MENU_CloseAll
  #MENU_Quit
  #MENU_TileV
  #MENU_TileH
  #MENU_Cascade
  #MENU_Arrange
  #MENU_Previous
  #MENU_Next
  #MENU_FirstMDI
  #MENU_Draw_Canvas
  #MENU_Draw_Light
  #MENU_Draw_Shadow
EndEnumeration

Enumeration
  #Bmp_Canvas
  #Bmp_Light
  #Bmp_Shadow
EndEnumeration

Enumeration
  #SCROLL_Gad
  #IMAGE_Gad
EndEnumeration

UseJPEGImageDecoder()   ; Dokumentenhandler einbinden
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

Procedure Message_Printer(Message)
  Static Counter, LastMessage
  If Message = LastMessage
    Counter = Counter + 1
  Else
    Debug ("Message: "+Str(LastMessage)+"Anzahl: "+Str(Counter))
   
    Counter = 0
    Debug ("Message: "+Str(Message))
    LastMessage = Message
  EndIf
EndProcedure

#WindowFlags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu  ;|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget

If OpenWindow(#WINDOW, 0, 0, 800, 600, "SMOOTH 0.1", #WindowFlags)
 
  If CreateMenu(#MENU, WindowID(#WINDOW))
    MenuTitle("File") ; ----------------------
    MenuItem(#MENU_Open, "Open")
    MenuItem(#MENU_Close, "Close")
    MenuItem(#MENU_CloseAll, "Close All")
    MenuBar()
    MenuItem(#MENU_QUit, "Quit")       
    MenuTitle("Graphics") ; ------------------
    MenuItem(#MENU_Draw_Canvas, "Draw Canvas")
    MenuItem(#MENU_Draw_Light, "Draw Light")
    MenuItem(#MENU_Draw_Shadow, "Draw Shadow")
    MenuItem(#MENU_Previous, "Previous")   
    MenuTitle("Windows") ; -----------------
    MenuItem(#MENU_TileV, "Tile vertically")
    MenuItem(#MENU_TileH, "Tile horizontally")
    MenuItem(#MENU_Cascade, "Cascade")
    MenuItem(#MENU_Previous, "Previous")
    MenuItem(#MENU_Next, "Next")
  EndIf
  If CreateToolBar(#TOOLBAR, WindowID(#WINDOW))
     ToolBarStandardButton(#MENU_Open, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(#MENU_Close, #PB_ToolBarIcon_Delete)
    ToolBarSeparator()
    ToolBarStandardButton(#MENU_Previous, #PB_ToolBarIcon_Undo)
    ToolBarStandardButton(#MENU_Next, #PB_ToolBarIcon_Redo)
  EndIf
  
  mh  = MenuHeight()             ; menu höhe
  tbh = ToolBarHeight(#TOOLBAR)  ; toolbar höhe

  SAGadget = ScrollAreaGadget(#SCROLL_Gad,0, tbh, WindowWidth(#WINDOW), WindowHeight(#WINDOW)-tbh-mh, WindowWidth(#WINDOW)-10, WindowHeight(#WINDOW)-tbh-mh-10, 10)  ; Scrollfläche erzeugen     
  IMGadget = ImageGadget(#IMAGE_Gad,0,0, WindowWidth(#WINDOW), WindowHeight(#WINDOW), #PB_Image_Border)  ; Bildfläche erzeugen
  CloseGadgetList()
  Quit = 0      ; ----------------- event handler --------------------------
  Repeat
    Event = WaitWindowEvent()           ; Ereignis abholen
    Message_Printer(Event)
   
    If Event = #PB_Event_CloseWindow    ; Fensterschließ-Event?
      Window = EventWindow()            ; von welchem Fenster kam es?
      If Window = #WINDOW               ; falls es das Hauptfenster war,
        Quit = 1       
      EndIf
    ElseIf Event = #PB_Event_Menu       ; Menü-Event?
      Select EventMenu()                ; Menü# holen
        Case #MENU_Open           
          FileName$ = OpenFileRequester("Open Image", DefaultFile$, "Image Files (*.bmp,*.jpg,*.tiff,*.png,*.tga)|*.bmp;*.jpg;*.tiff;*.png;*.tga|All Files (*.*)|*.*", 0, #PB_Requester_MultiSelection)
          DefaultFile$ = FileName$         
          If LoadImage(#IMAGE, FileName$)     ; es wird ein Bild geladen, Image enthält anschließEnd die Bildnummer   
 
            Debug("IMGadget "+Str(IMGadget))
            SetGadgetState(#IMAGE_Gad,ImageID(#IMAGE))                                       ; neues bild in gadget setzen
            ResizeGadget(#IMAGE_Gad,0,0,ImageWidth(#IMAGE), ImageHeight(#IMAGE))             ; Größe ImageGadget anpassen
            SetGadgetAttribute(#SCROLL_Gad, #PB_ScrollArea_InnerWidth, ImageWidth(#IMAGE))   ; Größe des inneren Scrollbereichs
            SetGadgetAttribute(#SCROLL_Gad, #PB_ScrollArea_InnerHeight, ImageHeight(#IMAGE)) ;   anpassen
          Else
            MessageRequester("Image Viewer","Could not load image: "+FileName$)
          EndIf                   
        Case #MENU_Close
          Debug ("#MENU_Close nicht implementiert")       
        Case #MENU_CloseAll                       
          Debug ("#MENU_CloseAll nicht implementiert")         
        Case #MENU_Quit
          Quit = 1     
;         Case #MENU_TileV
;           SetGadgetState(#GADGET_MDI, #PB_MDI_TileVertically)
;         Case #MENU_TileH
;           SetGadgetState(#GADGET_MDI, #PB_MDI_TileHorizontally)
;         Case #MENU_Cascade
;           SetGadgetState(#GADGET_MDI, #PB_MDI_Cascade)
;         Case #MENU_Arrange
;           SetGadgetState(#GADGET_MDI, #PB_MDI_Arrange) 
;         Case #MENU_Previous
;           SetGadgetState(#GADGET_MDI, #PB_MDI_Previous)   
;         Case #MENU_Next
;           SetGadgetState(#GADGET_MDI, #PB_MDI_Next)
;         Case #MENU_Draw_Canvas         
;         Case #MENU_Draw_Light
;         Case #MENU_Draw_Shadow
          EndSelect
     
    ElseIf Event = #PB_Event_SizeWindow
         ResizeGadget(#SCROLL_Gad, 0, tbh, WindowWidth(#WINDOW), WindowHeight(#WINDOW)-tbh-mh)
    EndIf
   
  Until Quit = 1 
EndIf
Das ScrollAreaGadget muss an der Y-Koordinate um ToolbarHeight() weiter nach unten gesetzt werden,
sonst verdeckt es die Toolbar. Dann muß es in der Höhe um ToolbarHeight() und MenuHeight() veringert werden.

Nach dem laden des Bildes muss die Größe des ImageGadgets an die Größe des Bildes angepasst werden (das geht evtl.
automatisch, aber besser selbst nochmal machen ;)).
Dann muss noch der innere ScrollArea-Bereich auf die gleiche Größe angepasst werden. Das mußt Du selbst machen
und geht nicht automatisch durch PureBasic.

Re: Gadgets und Fensterelemente

Verfasst: 28.09.2012 12:07
von CSHW89
... und vielleicht noch dem ScrollAreaBar den Flag #PB_ScrollArea_Center geben (einfach in der Zeile, in der das Gadget erzeugt wird, hinten noch ein zusätzlichen Parameter angeben ", #PB_ScrollArea_Center"). Das ist ein kleines Bild auch schön in der Mitte ;)

lg Kevin

Re: Gadgets und Fensterelemente

Verfasst: 28.09.2012 15:13
von Illumany
Hey Leute! Das ist ja mal ein Forum. Hätte nicht erwartet, so schnell derart kompetente Antworten zu bekommen. :D

Danke Josh, Dein Tipp hat mir klargemacht, dass da noch etwas Handarbeit erforderlich ist. :D

Ganz besonders bedanken möchte ich mich bei Dir, Danilo. Ich habe Dein Listing ausprobiert und es lief auf Anhieb perfekt.
Das werde ich mir jetzt in Ruhe zu Gemüte führen. :allright:

Auch Dir vielen Dank für den Zentriertipp, Kevin. Probier ich auch aus! :D

Gadgets und Fensterelemente - Philosophie

Verfasst: 04.10.2012 19:46
von Illumany
Hallo Leute,

dank Eurer großartigen Hilfe bin ich jetzt schon ein ganzes Stück weiter. Derzeit entwickele ich das Programm in Richtung auf eine Art Zeichenprogramm um. Dabei versuche ich herauszufinden, welche Ansätze sich eignen, um eine möglichst performante Programmausführung hinzubekommen. Dazu hätte ich ein paar Fragen.

Ich habe ein Hauptfenster mit ScrollArea- und ImageGadget zur Ausgabe für das Bitmap-Dokument. Der Nutzer soll jetzt etwas in das dargestellte Dokument malen können. Mir sind dazu bislang zwei Ansätze eingefallen:

Version A
Ich lasse den Nutzer in das unsichtbare Originaldokument (Bitmap) malen und kopiere jeweils nur den kleinen Ausschnitt vom unsichtbaren Dokument in das Fenster, auf dem sich etwas verändert hat (damit die Sache möglichst latenzarm abläuft). Wie kann ich das mit PureBasic auf Hochsprachenlevel hinbekommen? Gibt es so etwas wie eine Bitblit-Operation vom Speicher in das Fenster?

Version B
Der Nutzer malt direkt auf der Fensterfläche herum und ich wende die Zeichenoperationen zeitgleich auf das unsichtbare Dokument an (oder ich merke mir die Operationen in einer Liste und führe sie durch, nachdem der Nutzer fertig ist). Diese Version könnte ich vermutlich bereits programmieren.

Zusatzfrage: Wenn ich dem ImageGadget (das im Fenster liegt) eine Bitmap zugeordnet habe und diese Bitmap verändere, wird das im Fenster noch nicht sichtbar (siehe Beispiel unten). Mit welcher Operation/Befehl führe ich das Update durch (das ich unten derzeit behelfsmäßig per SetGadgetState() durchführe)?

Code: Alles auswählen

If StartDrawing(ImageOutput(#BMP_Viewport))            ; Das Image im ImageGadget des Fensters heißt #BMP_Viewport, das ImageGadget hat die Nummer #GDG_Image 
   Plot(x, y, RGB(127, 127, 127))                       ; hier wird was verändert
   StopDrawing()                                           ; aber leider hier noch nicht sichtbar
   SetGadgetState(#GDG_Image, ImageID(#BMP_Viewport))  ; erst hier mit Hilfe dieser von mir widerwillig eingefügten Zeile wird der Spacken sichtbar
EndIf

Re: Gadgets und Fensterelemente

Verfasst: 04.10.2012 19:56
von ts-soft
Eigentlich wäre das CanvasGadget hier die richtige Wahl. Beispiel ist in der Hilfe enthalten,
bzw. hier: http://www.purebasic.com/german/documen ... et.pb.html

Re: Gadgets und Fensterelemente

Verfasst: 13.10.2012 10:29
von Illumany
ts-soft hat geschrieben:Eigentlich wäre das CanvasGadget hier die richtige Wahl. Beispiel ist in der Hilfe enthalten,
bzw. hier: http://www.purebasic.com/german/documen ... et.pb.html
Oh ja, vielen Dank. So langsam steige ich dahinter, wie die Unterschiede bei den Bitmap-Gadgets liegen.