Zeichenbefehle in ImageGadget anwenden

Anfängerfragen zum Programmieren mit PureBasic.
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

Zeichenbefehle in ImageGadget anwenden

Beitrag von JayCool »

Hi Leute, ich steh' vor einem Rätsel::bluescreen:

In der PB-Hilfe zum Befehl StartDrawing() steht Folgendes:
Unter Windows ist es erforderlich, die mittels WindowOutput() direkt in ein Fenster gezeichneten Grafiken nach jedem Verdecken, Minimieren etc. des Fensters manuell neu zu zeichnen ("zu refreshen"). Es ist daher empfehlenswert, Grafiken über ImageOutput() in ein Bild zu zeichnen und dieses als ImageGadget() im Anwendungsfenster darzustellen sowie ggf. mittels SetGadgetState() upzudaten. Windows erledigt dann das Neuzeichnen der Grafiken automatisch.
Jetzt habe ich das mal mit einem eigenen Programm versucht, aber aus irgendwelchen Gründen krieg' ich das nicht hin. Kann mir bitte jemand einen konstruktiven Vorschlag machen, was ich an dem nachstehenden Programm ändern muss, damit das Gitternetz im ImageGadget angezeigt wird:

Code: Alles auswählen

OpenWindow(1,0,0,400,400,"",#PB_Window_Maximize|#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_SystemMenu)

CreateImage(2,650,650)

CreateGadgetList(WindowID(1))

ImageGadget(1,100,100,700,700,ImageID(2),#PB_Image_Border) 

StartDrawing(ImageOutput(2))

For x=150 To 650
  For y=150 To 850 Step 50
    Plot(x, y, RGB($00,$00,$00))
    Plot(y, x, RGB($00,$00,$00))
  Next y
Next x

ImageGadget(1,100,100,700,700,ImageID(2),#PB_Image_Border)

Repeat
  Ereignis = WaitWindowEvent()
Until Ereignis = #PB_Event_CloseWindow
End

Muss ich statt des ImageGadget-Befehls vor dem Repeat vielleicht SetGadgetState(#Gadget, Status) angeben?
Mir ist aber bei SetGadgetState nicht klar, welchen Wert ich bei 'Status' angeben muss.

MfG Jan
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Du hast recht ;) Du musst den SetGadgetState() Befehl nehmen.

Der Parameter "Status" ist in diesem Falle (also bei Bildwechsel)
die ImageID()

In Deinem Fall dann SetGadgetState(1,ImageID(2))

Aber ein Gitter wirst Du wohl nicht sehen, ein Beispiel Warum nicht:

Ostfriesische Nationalflagge : Schwarzer Adler auf schwarzem Grund :lol:

Bei CreateImage ist die Standardfarbe des Images komplett Schwarz.

Deshalb solltest bei den Plot Befehlen die Farbe auf irgendetwas anderes setzen,
als auf schwarz !
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

Beitrag von JayCool »

Hi,

ich hab' das Programm mal dementsprechend geändert, aber es läuft immer noch nicht. :(
Es muss noch irgendwo ein Fehler versteckt sein?!?!?!?!?!?!?

Code: Alles auswählen

OpenWindow(1,0,0,400,400,"",#PB_Window_Maximize|#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_SystemMenu) 

CreateImage(2,650,650) 

CreateGadgetList(WindowID(1)) 

ImageGadget(1,100,100,700,700,ImageID(2),#PB_Image_Border) 

StartDrawing(ImageOutput(2)) 

For x=150 To 650 
  For y=150 To 850 Step 50 
    Plot(x, y, RGB($FF,$FF,$FF)) 
    Plot(y, x, RGB($FF,$FF,$FF)) 
  Next y 
Next x 

ImageGadget(1,100,100,700,700,ImageID(2),#PB_Image_Border)
SetGadgetState(1,ImageID(2))
 

Repeat 
  Ereignis = WaitWindowEvent() 
Until Ereignis = #PB_Event_CloseWindow 
End 
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

JayCool hat geschrieben:Es muss noch irgendwo ein Fehler versteckt sein?!?!?!?!?!?!?
da fehlt noch ein StopDrawing() nachdem alle Zeichenoperationen beendet worden sind.

Grüße ... Kiffi

P.S.: Bitte nicht so viele Ausrufe- und Fragezeichen verwenden.
a²+b²=mc²
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

uahhh das seh ich jetzt erst....

es fehlt das stopdrawing() ;)

zwischen Next x und setgadgetstate...

das Imagegadget(.... kannst du da wegnehmen... doppelt gemoppelt

Edit: Mist da war Kiffi doch um ein paar sekunden schneller ;)
Zuletzt geändert von Bisonte am 13.12.2007 14:47, insgesamt 2-mal geändert.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

Beitrag von JayCool »

Hi @ all!

Jetzt klappts! :bounce:

Ich dachte, der Befehl StopDrawing() wäre genauso überflüssig wie der Befehl End am Ende des Programms. Hab' wieder was dazugelernt.

Vielen Dank erstmal an alle, bis zum nächsten Problem.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

JayCool hat geschrieben:Ich dachte, der Befehl StopDrawing() wäre genauso überflüssig wie der Befehl End am Ende des Programms.
Ich will nur anmerken, dass der Befehl End keines wegs überflüssig
ist. In PB wird am Ende des Quellcodes dieser Befehl lediglich
automatisch aufgerufen, ohne das er angegeben werden muss.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten