Gadgets und Fensterelemente

Anfängerfragen zum Programmieren mit PureBasic.
Illumany
Beiträge: 8
Registriert: 22.09.2012 08:15
Wohnort: Friesland

Gadgets und Fensterelemente

Beitrag 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]
Alles Gute!
ILLUMANY - Programmieramateur
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Gadgets und Fensterelemente

Beitrag 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()
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Gadgets und Fensterelemente

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Gadgets und Fensterelemente

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Illumany
Beiträge: 8
Registriert: 22.09.2012 08:15
Wohnort: Friesland

Re: Gadgets und Fensterelemente

Beitrag 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
Alles Gute!
ILLUMANY - Programmieramateur
Illumany
Beiträge: 8
Registriert: 22.09.2012 08:15
Wohnort: Friesland

Gadgets und Fensterelemente - Philosophie

Beitrag 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
Alles Gute!
ILLUMANY - Programmieramateur
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Gadgets und Fensterelemente

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Illumany
Beiträge: 8
Registriert: 22.09.2012 08:15
Wohnort: Friesland

Re: Gadgets und Fensterelemente

Beitrag 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.
Alles Gute!
ILLUMANY - Programmieramateur
Antworten