 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Colle
Anmeldungsdatum: 25.05.2007 Beiträge: 21
|
Verfasst am: 21.01.2008, 12:26 Titel: bmp-Datei im Screen löschen |
|
|
Hallo da draußen!
Zur Zeit verwende ich zur Ausgabe von Grafiken im Screen bmp-Dateien, die ich mit der Befehlskombination:
Code: |
Bild = ImageCreate (Höhe, Breite)
Bload "Bild.Bmp", Bild
Put (x, y), Bild, Pset
|
in mein Programm einbinde.
Die Frage, die sich mir schon lange stellt, ist die, ob eine Möglichkeit existiert, die im Screen angezeigte bmp-Datei wieder zu entfernen.
Der Puffer lässt sich ja mit imagedestroy löschen.
Wie kann ich aber eine einzelne bmp-Datei wieder aus dem Screen entfernen?
Vielen Dank schon mal im Voraus für eure Mühe!  |
|
Nach oben |
|
 |
Stormy

Anmeldungsdatum: 10.09.2004 Beiträge: 567 Wohnort: Sachsen - wo die schönen Frauen wachsen ;)
|
|
Nach oben |
|
 |
Colle
Anmeldungsdatum: 25.05.2007 Beiträge: 21
|
Verfasst am: 21.01.2008, 12:41 Titel: |
|
|
Hallo Stormy,
danke für dein Interesse.
Dadurch, dass ich mit deinem Befehl ein schwarzes Rechteck über mein Bild lege, ist mir leider nicht geholfen.
Zur Zeit versuche ich, im FreeBasic-Screen (mit meinen Anfängerkenntnissen) ein Pull-Down-Menü nachzuempfinden.
Dazu wird nach dem Anklicken eines Buttons eine bmp-Menügrafik geladen.
Nach der Wahl eines Menüinhalts soll die bmp-Grafik wieder verschwinden.
Momentan arbeite ich noch so, dass ich bmp-Dateien einfach mit anderen bmp-Dateien überlagere.
Praktisch eine Multilayer-Technik.
Eleganter und viel praktischer wäre es aber, wenn die bmp-Dateien verschwinden würden, ohne Überlagerung bzw. ohne den vorhandenen Hintergrund im Screen zu beeinträchtigen. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 21.01.2008, 14:36 Titel: |
|
|
Ok, ich glaub zu verstehen was du meinst...
Also das bild ist auf dem screen nicht wirklich gespeichert. Die bilddaten überschreiben nur an der stelle wo du das bild auf dem bildschirm hinpackst den speicher der angezeigten bildschirmseite.
mach dir per PCOPY oder per SCREENCOPY eine kopie deines bildschirminhaltes bevor du das bild per PUT das bild auf deinem screen ausgibst.
Wenn das bild wieder verschwinden soll schreibst du mit dem gleichen befehl die kopierte bildschirmseite einfach zurück.
Sag bescheid wenn du ein beispiel dazu brauchst. Die hilfedateien die so im umlauf sind zeigen einem schon ganz gut wie das funktioniert... |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 21.01.2008, 15:24 Titel: |
|
|
Bestimt sowas die das hier?
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=430
Der Trick bei diesem Beispiel ist einfach das das Komplette im normazustand gespeichert wurde und immer wieder neu "geputet" wird..
Dazwischen wird das Menu einfach in den Screen reingefahren.
Dannach wird einfach auf eine Taste gewartet und der Hintergrund wird erneut "geputet". Das ist alles. _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 21.01.2008, 17:59 Titel: |
|
|
@OneCypher:
ScreenCopy bzw. PCopy machen aber afaik eigtl. was anderes.
Get/Put passt da schon eher. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Colle
Anmeldungsdatum: 25.05.2007 Beiträge: 21
|
Verfasst am: 21.01.2008, 20:49 Titel: |
|
|
Guten Abend euch allen und vielen Dank für eure Mühe!
Heute habe ich leider nicht mehr genug Zeit, um mir das verlinkte Beispiel von AndT anzusehen.
Ich habe es einmal als neues Dokument gestartet, bringe es aber nicht ans Laufen, da ich zu viele Fehlermeldungen erhalte.
@OneCypher
Klar, wenn du Beispiele verlinken oder deren Code hier einfügen könntest, wäre das klasse!
Zitat: | Wenn das bild wieder verschwinden soll schreibst du mit dem gleichen befehl die kopierte bildschirmseite einfach zurück. |
Wie genau funktioniert das?
Ich hänge mal ein denkbar einfaches Beispiel an:
Code: | cls
dim x as double
screen 14,32
locate 4,5:Input "Variable x:",x
SCREENCOPY
LINE (0,0)-(200,200),rgb (100,200,24),bf
getkey
screencopy
sleep
|
Nachdem man den Input getätigt hat, wird der Screeninhalt von dem grünen Feld überlagert.
Auf die nächste Aktion - hier getkey - sollte doch der zuvor mit screencopy kopierte Screeninhalt wieder erscheinen und so das Farbfeld verschwinden lassen? |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 21.01.2008, 21:34 Titel: |
|
|
ScreenCopy hat wie gesagt eine komplett andere Bedeutung. Siehe http://www.fb-referenz.de/SCREENCOPY _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 21.01.2008, 23:28 Titel: |
|
|
Hi,
ein Beispiel mit 2 Images:
Code: | Screen 17,32
Color -1,RGB(0,0,55) 'weiße Schrift, blauer Hintergrund
Cls 'Bilschirm löschen mit Hintergrundfarbe
Dim As Any Ptr Bild, Hintergrund
Dim As Integer x=150, y=50, breit=150, hoch=30
Bild = ImageCreate (breit, hoch, RGB(100,100,100)) 'grauer Hintergrund
'BLOAD "Bild.Bmp", Bild
Draw String Bild ,(8,8),"Dies ist ein Bild",RGB(255,0,0)'Text in das Image schreiben
Draw String (x,y),"Dies ist ein Text" 'Text auf Bildschirm
Hintergrund = ImageCreate (breit, hoch)
Do
Sleep 1000
x=Rnd()*400
y=Rnd()*300
Get (x,y)-(x+breit-1,y+hoch-1),Hintergrund 'Bildschirmausschnitt als Image sichern
Put (x, y), Bild, PSet 'zeichne Bild
Sleep 1000
Put (x, y), Hintergrund, PSet 'Bildschirmausschnitt zurück
Loop Until InKey=Chr(27)
ImageDestroy Bild
ImageDestroy Hintergrund
| Ein Beispiel mit 2 Bildschirmseiten:
Code: | Screen 17, 32, 2 '2 Bildschirmseiten
Color -1,RGB(0,0,55) 'weiße Schrift, blauer Hintergrund
Cls 'Bilschirm löschen mit Hintergrundfarbe
Dim As Any Ptr Bild
Dim As Integer x=150, y=50, breit=150, hoch=30
Bild = ImageCreate (breit, hoch, RGB(100,100,100)) 'grauer Hintergrund
'BLOAD "Bild.Bmp", Bild
Draw String Bild ,(8,8),"Dies ist ein Bild",RGB(255,0,0) 'Text in das Image schreiben
'ScreenSet 0,0 'ist die Grundeinstellung
Draw String (x,y),"Dies ist ein Text" 'Text auf Bildschirm
Do
Sleep 1000
ScreenCopy 0,1 'kopiere 1.Seite zu 2.Seite
ScreenSet 1,1 'setze auf 2.Seite
Put (Rnd()*400, Rnd()*300), Bild, PSet 'zeichne Bild
Sleep 1000
ScreenSet 1,0 'zeige 1.Seite
Cls 'lösche 2.Seite
Loop Until InKey=Chr(27)
ImageDestroy Bild
|
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 22.01.2008, 11:18 Titel: |
|
|
Fehler?
Bei mir gabs keinen (v0.18.2)
Lösungsvorschlag:
Bevor ein Menü operiert(geöffnet wird etc.) wird der gesamte Screen in ein FB.Image gesichert (z.B als Hintergrund).
Dann wird das Menu auf einer nicht angezeiten Seite als FB.Image erstellt um unschöne nebeneffekte zu vermeiden (heisst dan einfach Menu). _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
Colle
Anmeldungsdatum: 25.05.2007 Beiträge: 21
|
Verfasst am: 23.01.2008, 10:05 Titel: |
|
|
Guten Morgen!
@volta
Vielen Dank für deine Beispiele!
Damit erhalte ich vom Verständnis her einen Ansatz, wie ich mein Ziel erreichen kann. Sobald ich wieder mehr Zeit habe, versuche ich das neu Gelernte umzusetzen.
@AndT
Danke auch dir für deinen Beitrag!
Ich habe schon gedacht, dass es an der von mir verwendeten alten Compilerversion liegen könnte.
Darum werde ich mich demnächst mal kümmern müssen. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 23.01.2008, 14:40 Titel: |
|
|
Also per screencopy ists natürlich ein gutes stück einfacher als den umweg über get->put ... zumal man ja erstmal einen buffer mit imagecreate erstellen muss.. Man kann sich auch die ganzen positionsangaben sparen..
Dein beispiel würde dann so aussehen:
Code: |
DIM x AS DOUBLE
SCREEN 14,32, 2 'als dritter parameter nimmt screen die anzahl der seite entgegen. Wenn ich das richtig in erinnerung hab, werden hierbei 3 seiten reserviert (0,1,2).. wobei hier in dem beispiel die 3. seite nicht benutzt wird.
LOCATE 4,5:INPUT "Variable x:",x
SCREENCOPY 0,1 'Kopiert seite 0 nach 1 (Seite 0 ist die sichtbare seite)
LINE (0,0)-(200,200),RGB (100,200,24),bf
GETKEY
SCREENCOPY 1,0 'Seite 1 wird nach 0 kopiert und damit wieder sichtbar
SLEEP
|
gegen screencopy sprechen nur wenig argumente.. ich glaub ist reine geschmackssache... |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 23.01.2008, 18:16 Titel: |
|
|
OneCypher hat Folgendes geschrieben: | Also per screencopy ists natürlich ein gutes stück einfacher als den umweg über get->put ... zumal man ja erstmal einen buffer mit imagecreate erstellen muss.. Man kann sich auch die ganzen positionsangaben sparen.. |
ist aber nichtsdestotrotz viiiiiel rechenlastiger und IMHO auch unsauber. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 23.01.2008, 19:10 Titel: |
|
|
Rechenlastig könnt ich verstehen... aber warum unsauber? |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 23.01.2008, 19:48 Titel: |
|
|
gerade bei einem menü, bei dem ja auch "außen rum" was passieren kann, sollte man imho nur den teil wiederherstellen, wo auch das menü wirklich war. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 24.01.2008, 14:53 Titel: |
|
|
Okay, darüber kann man wahrscheinlich endlos diskutieren...
(z.B. wenn ich ein menü aufklappe dann soll alles wieder so ausschauen wie vorher wenn ich es wieder zuklappe)
... naja, jeder hat haltn anderen geschmack  |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|