Reihenfolge der Befehle und deren Ausführung

Anfängerfragen zum Programmieren mit PureBasic.
Klaus_1963
Beiträge: 96
Registriert: 25.06.2009 09:09

Reihenfolge der Befehle und deren Ausführung

Beitrag von Klaus_1963 »

Habe ein "seltsames" Problemchen. Vielleicht könnt Ihr mir das unterschiedliche Verhalten der beiden unten aufgeführten Programmvarianten erklären. Der Unterschied besteht lediglich darin, dass bei der einen Variante zuerst die Linie und dann der Button gezeichnet werden soll, in der 2. Variante zuerst der Button, dann die Linie. Warum wird die Variante 2 so wie erwartet ausgeführt? Warum fehlt bei Variante 1 die horizontale Linie? Vermutlich ist es ja ganz klar, vorausgesetzt man weis es... Vielen Dank im Voraus für Eure Hilfe.

Programmvariante 1:

Code: Alles auswählen

x=200
y=200
IB=400
IH=400

OpenWindow(1, x, y, IB, IH, "Wieso???")

StartDrawing(WindowOutput(1))
  Line(0,20,399,0,RGB(230,5,2))
StopDrawing()

ButtonGadget(1,50,200,100,30,"Ahaso")

Repeat
    Repeat
      Event = WindowEvent()
      If Event = #PB_Event_CloseWindow : Quit = 1 : EndIf
    Until Event = 0
Until Quit = 1
Programmvariante 2:

Code: Alles auswählen

x=200
y=200
IB=400
IH=400

OpenWindow(1, x, y, IB, IH, "Wieso???")

ButtonGadget(1,50,200,100,30,"Ahaso")

StartDrawing(WindowOutput(1))
  Line(0,20,399,0,RGB(230,5,2))
StopDrawing()

Repeat
    Repeat
      Event = WindowEvent()
      If Event = #PB_Event_CloseWindow : Quit = 1 : EndIf
    Until Event = 0
Until Quit = 1
:wink: :wink: :wink:
PureBasic 5.72 LTS / Windows / MacOS / Linux Mint / starker Kaffee / noch stärkerer Kaffee / reines Koffein intravenös...
Motto: Hauptsache es funktioniert - aber schnell und richtig!
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

hat was mit der GadetList des Windows zu tun. Wenn du beispielsweise im
ersten Beispiel als Flag vom Window noch #PB_Window_NoGadgets angibst,
also keine GadgetList erstellst, wird die Linie gezeichnet,
aber natürlich der Button nicht, denn es ist ja keine Gadgetliste da.

Da die zweite Variante aber ebenfalls funktionstüchtig ist und du so kein größeres
Problem hast, ist die zweite Variante die Lösung :wink:
Win11 x64 | PB 6.20
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

:lol: :lol:
Das PB Forum ist schneller als die Polizei erlaubt
Bild
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Beitrag von NicknameFJ »

Ich habe da eine andere Theorie.

Beim Aufruf von ButtonGadget wird der aktuelle Fensterinhalt als ungültig markiert. Da Du nicht ein einem Callback auf WM_Paint (oder wie die Nachricht heist) reagierst wird das Fenster beim nächsten Refresh neu mit dem Grauen Muster gezeichnet und Deine Linie ist nicht mehr zu sehen.


Grüße

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

FJ hat recht.

direkt aufs Fenster zeichnen bringt wenig, wenn man das nicht bei jedem Refresh neuzeichnet.

... und das ist oft zu viel Aufwand, besser auf ein Image zeichnen.
das kann man in ein ImageGadget packen und das deaktivieren, dann hat man nen funktionierenden Hintergrund.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Klaus_1963
Beiträge: 96
Registriert: 25.06.2009 09:09

Beitrag von Klaus_1963 »

Die Antwort von FJ klingt plausibel. Dann hat mich der Refresh gewissermassen ausgetrickst :-). Vielen Dank an alle.

Klaus
PureBasic 5.72 LTS / Windows / MacOS / Linux Mint / starker Kaffee / noch stärkerer Kaffee / reines Koffein intravenös...
Motto: Hauptsache es funktioniert - aber schnell und richtig!
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

aber solltest du aus irgendwelchen unbekannten Gründen kein Bock auf in Imagegadget haben und unbedingt deine rote Linie ins Window malen wollen, so ist auch das möglich.

du mußt halt wie bereits erwähnt, auf das Event WM_Paint reagieren. z.B. so

Code: Alles auswählen

x=200 
y=200 
IB=400 
IH=400 

hwnd = OpenWindow(1, x, y, IB, IH, "Wieso???") 

ButtonGadget(1,50,200,100,30,"Ahaso") 

Repeat 
    
      Event = WaitWindowEvent(1) 
      
      If event = #WM_PAINT
         
         StartDrawing(WindowOutput(1)) 
         Line(0,20,399,0,RGB(230,5,2)) 
         StopDrawing() 
      
      ElseIf event = #PB_Event_Gadget
         wb = EventGadget()
         Select wb
           Case 1 : Debug "Button gedrückt"
         EndSelect  
      EndIf
    
Until Event = #PB_Event_CloseWindow  
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag von Rokur »

Anstatt #WM_PAINT kannst du auch die PB eigene Konstante #PB_Event_Repaint verwenden. :wink:
Klaus_1963
Beiträge: 96
Registriert: 25.06.2009 09:09

Beitrag von Klaus_1963 »

Dank Euch lichtet sich so langsam der Nebel der meinen Geist umgibt :-). PureBasic gefällt mir immer besser, noch besser die community. Noch eine kleine schüchterne Frage am Rande: wie zukunftssicher ist denn PureBasic? Wenn ich das jetzt lerne möchte ich natürlich ein paar Jahre davon profitieren. Weis da jemand was?
PureBasic 5.72 LTS / Windows / MacOS / Linux Mint / starker Kaffee / noch stärkerer Kaffee / reines Koffein intravenös...
Motto: Hauptsache es funktioniert - aber schnell und richtig!
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Fuer Anfaenger ein guter Einstieg, ein Job findest du damit aber sicherlich
nicht, da nimmste besser einer der "grossen" Sprachen.
Antworten