Seite 1 von 2
Imager
Verfasst: 22.07.2007 14:27
von pede
Hallo Leute
Ich wollte jetzt n Programm schreiben, das so wie ein gaaaanz simples Paint funktioniert, d. h. im Moment:
der Benutzer klickt auf die Zeichenfläche, dann wird genau da n Rechteck gezeichnet und das Bild soll er dann via Button abspeichern können.
Nun zu meinem Problem: ich weiß nicht wie ich das neue Bild abspeichern soll.
Die Zeichenfläche ist bei mir ein ImageGadget...
Der Benutzer malt also effektiv aufs Window...
wie kann ich das dann speichern?
lg
Re: Imager
Verfasst: 22.07.2007 14:32
von Kiffi
pede hat geschrieben:wie kann ich das dann speichern?
mit SaveImage()
Grüße ... Kiffi
Verfasst: 22.07.2007 14:44
von Yoshi
Ich hätte es mit OpenSaveRequester versucht, geht das auch?
Verfasst: 22.07.2007 14:44
von pede
SaveImage() kann ja gar nicht funktionieren, da ich ja nicht auf ImageGadget male, sondern direkt aufs Window....
hmmm ohne code wirds wohl schwer zu verstehen sein...
Code: Alles auswählen
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)
;- Window Constants
;
Enumeration
#Window_imager
EndEnumeration
;- Gadget Constants
;
Enumeration
#Image_1
#Image_2
#Frame3D_0
#Button_save
EndEnumeration
;- Image Plugins
;- Image Globals
Global Image0
Global Image1
;- Catch Images
Image0 = CatchImage(0, ?Image0)
Image1 = CatchImage(1, ?Image1)
;- Images
DataSection
Image0:
IncludeBinary "C:\Dokumente und Einstellungen\Pede\Desktop\test.bmp"
Image1:
IncludeBinary "C:\Dokumente und Einstellungen\Pede\Desktop\test1.bmp"
EndDataSection
;Meine Variablen
Structure Punkt
x.l
y.l
EndStructure
MausPos.Punkt
Procedure Open_Window_imager()
If OpenWindow(#Window_imager, 216, 0, 839, 598, "Imager", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Window_imager))
ImageGadget(#Image_1, 30, 60, 350, 430, Image0)
ImageGadget(#Image_2, 420, 60, 380, 450, Image1)
Frame3DGadget(#Frame3D_0, 10, 30, 390, 520, "")
ButtonGadget(#Button_save, 470, 560, 160, 30, "Neues Bild")
EndIf
EndIf
EndProcedure
Ende = 0
Open_Window_imager()
Repeat
Event=WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
Ende = 1
Case #PB_Event_Gadget
Select EventGadget()
Case #Image_1
Select EventType()
Case #PB_EventType_LeftClick
MausPos\x = WindowMouseX(#Window_imager)
MausPos\y = WindowMouseY(#Window_imager)
;MessageRequester("Bild 1 angeklickt", "x: " + Str(MausPos\x) + Chr(13) + "y: " + Str(MausPos\y))
StartDrawing(WindowOutput(#Window_imager))
Box(MausPos\x, Mauspos\y, 20, 20, RGB(0, 255, 255))
StopDrawing()
EndSelect
Case #Button_save
... Hier liegt das Prob!
EndSelect
EndSelect
Until Ende = 1
Verfasst: 22.07.2007 14:50
von Kaeru Gaman
pede hat geschrieben:SaveImage() kann ja gar nicht funktionieren, da ich ja nicht auf ImageGadget male, sondern direkt aufs Window....
pede hat geschrieben:Die Zeichenfläche ist bei mir ein ImageGadget...
ich empfehle dir dringend, dich zuerst einmal zu entscheiden...
nein ernsthaft, direkt aufs window zu malen ist unfug.
zeichne mal was drauf und schieb dann ein anderes fenster drüber, dann wirst du sehen warum...
_______________________________________________
Yoshi hat geschrieben:Ich hätte es mit OpenSaveRequester versucht, geht das auch?
was soll das fürn befehl sein? was für ne PB version hast du? kraut-punkt-rüben?
Re: Imager
Verfasst: 22.07.2007 14:53
von Kiffi
pede hat geschrieben:Die Zeichenfläche ist bei mir ein ImageGadget...
pede hat geschrieben:SaveImage() kann ja gar nicht funktionieren, da ich ja nicht auf ImageGadget male

ja, was denn nu?
Frisch aus der PB-Hilfe:
Code: Alles auswählen
If OpenWindow(0, 100, 100, 500, 300, "PureBasic - Image")
If CreateImage(0, 255, 255)
StartDrawing(ImageOutput(0))
For k=0 To 255
FrontColor(RGB(k,0, k)) ; a rainbow, from black to pink
Line(0, k, 255, 0)
Next
DrawingMode(1)
FrontColor(RGB(255,255,255)) ; print the text to white !
DrawText(40, 50, "Gespeichert unter C:\pede.bmp")
StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
EndIf
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Repaint
StartDrawing(WindowOutput(0))
DrawImage(ImageID(0), 20, 10)
StopDrawing()
EndIf
SaveImage(0, "c:\pede.bmp")
Until EventID = #PB_Event_CloseWindow ; If the user has pressed on the close button
EndIf
Grüße ... Kiffi
Verfasst: 22.07.2007 15:13
von pede
auch wenn ich das gemalene direkt ins Image speichere, auf dem Window anzeigen muss ichs trotzdem...
das nutzt also auch nichts?
und wieso verschieben sich die Punkte wenn ich mit nem anderen Fenster drüberfahr?
Verfasst: 22.07.2007 15:21
von Kaeru Gaman
> auch wenn ich das gemalene direkt ins Image speichere, auf dem Window anzeigen muss ichs trotzdem...
du musst nur das ImageGadget refreshen, sobald du das image geändert hast,
damit der aktuelle status angezeigt wird.
ein einfaches SetGadgetState( #Imagegadget, #Imagenummer ) genügt vollkommen.
dann wirds auch nicht mehr verpfuscht.
aufs window zeichnen egal ob drawline oder drawimage ist wie gesagt unfug.
wenn sich bei dir nur was verschiebt, ist das zufall, normalerweise verschwindet das komplett.
ein window hat keinen buffer für etwas, was man draufzeichnet.
Verfasst: 22.07.2007 15:36
von pede
hmm klingt gut und logisch, aber irgendwie bin ich total
Code: Alles auswählen
Case #PB_EventType_LeftClick
MausPos\x = WindowMouseX(#Window_imager)
MausPos\y = WindowMouseY(#Window_imager)
StartDrawing(ImageOutput(#image_1))
Box(MausPos\x, Mauspos\y, 20, 20, RGB(0, 255, 255))
StopDrawing()
SaveImage(#image_1, "C:\Dokumente und Einstellungen\Pede\Desktop\test_save.bmp")
LoadImage(#image_refresh, "C:\Dokumente und Einstellungen\Pede\Desktop\test_save.bmp")
SetGadgetState(#image_1, #image_refresh)
#image_1 = Nummer vom Imagegadget
Das Bild auf das ich male hat ja gar keine Nummer...

Verfasst: 22.07.2007 15:44
von Kaeru Gaman
bestätigt.
du malst auf das
IMAGE mit der ID
#image_1, auch in deinem code tust du das.
das
IMAGE mit der ID
#image_1 kannst du dann auf dem Image
Gadget mit einer anderen ID darstellen.
in deinem code weiter oben erzeugst du ein Image
Gadget mit der ID
#image_1
dem versuchst du ein label zuzuweisen statt eines images.
also, da fehlt es wirklich vorne und hinten...
bitte arbeite doch erstmal die Help und die Beispiele für Images durch.