ImageGadget ein neues Bild geben

Anfängerfragen zum Programmieren mit PureBasic.
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

ImageGadget ein neues Bild geben

Beitrag von stevie1401 »

Hallo Leute!

Zunächst einmal muss ich sagen, ich habe PB erst neu entdeckt und finde es recht gut.
Auch dieses Forum macht mit den freundlichen Helfern einen tollen Eindruck.

Nun komme ich aus der Freebasic und GFA-Basic Ecke und dort ist vieles vollkommen anders.
Deshalb tue ich mich (noch) etwas schwer einige Dinge zu verstehen.

Ich habe 12 ImageGadgets erstellt, in den Spielkarten geladen sind.
Nun möchte ich den ImageGadgets neue Karten geben, bzw. einige Karten löschen und unsichtbar machen. (Wird ein Kartenspiel).

Es wäre sehr nett, wenn ihr mir ein brauchbares Beispiel nennen könntet.
Hier mein Code:

Code: Alles auswählen

Dim meineKarte.i(12)
Dim nr(12)

For i=1 To 12
  ppic.s=Str(i)+".jpg"  ;Name und Ort der Karte, die erste heisst einfach 1.jpg, die zweite 2.jpg usw
  ppic=meinkartenordner+ppic  ;Ort wo die Karten auf dem Rechner liegen
    nr(i)=LoadImage(#PB_Any,ppic)  ;hier fängt die Verständnisschwierigkeit schon an. Was ist nr(i)? Ich das der Ansprechpunkt des Bildes?

  meineKarte(i) = ImageGadget(#PB_Any, 100+i*50-100, 200, 134, 192, ImageID(nr(i)), #PB_Image_Border)  ;was ist meineKarte(i)? Kann ich über meineKarte(i) das ImageGadget irgendwie      ansprechen?

  GadgetToolTip(meineKarte(i), "tooltiptest")
  
Next i
SetGadgetState(1,ImageID(2)  ;hier möchte ich ImageGadget 1 eine neue Karte geben, funktioniert aber son nicht
 
Bin für jede Hilfe dankbar.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
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: ImageGadget ein neues Bild geben

Beitrag von ts-soft »

Hast Dir ja einen etwas komplizierten Code ausgesucht :D
aber nicht desto trotz wollen wir das ganze mal aufknüddeln.
In nr(i) wird das Image gespeichert. Die ImageID ist dann ImageID(nr(i)).
In meineKarte(i) wird dasselbe für das ImageGadget getan, so das daraus
folgt:

Code: Alles auswählen

SetGadgetState(meineKarte(1), ImageID(nr(2)))
Ich hoffe das funktioniert so, hab es nicht getestet. Es wäre auf jeden fall
besser, wenn Du einen komplett ausführbaren Code bereitstellst, weil solche
"Trockenübungen" doch nicht so erbaulich sind :wink:

Gruß
Thomas
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
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: ImageGadget ein neues Bild geben

Beitrag von stevie1401 »

Der Code ist von mir ;-)
Ich habe es inzwischen verstanden, denke ich.
Allerdings habe ich folgendes festgestellt:
Wenn ich
SetGadgetState(meineKarte(7),0)
mache, wird die siebte Karte gelöscht, aber der Hintergrund wird nicht restauriert, sondern es bleibt ein grauer Hintergrund.
Kann man das irgendwie ändern?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ImageGadget ein neues Bild geben

Beitrag von NicTheQuick »

Was meinst du mit restaurieren? Ein ImageGadget hat normalerweise kein Hintergrund.
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: ImageGadget ein neues Bild geben

Beitrag von ts-soft »

Und ein Hinweis noch: Ein Array ist nullbasiert, Du erzeugst also 2 Arrays mit 13 Elementen,
von 0 - 12. Da könnte man noch optimieren.
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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ImageGadget ein neues Bild geben

Beitrag von Kiffi »

stevie1401 hat geschrieben:aber der Hintergrund wird nicht restauriert, sondern es bleibt ein grauer Hintergrund.
Kann man das irgendwie ändern?
wir wissen nicht, was Dein Hintergrund ist, bzw. wie Du ihn erzeugt hast. Wir kennen auch Deine Ereignis-Schleife nicht. Ohne das alles können wir schlecht helfen.

Aus diesem Grund hat Thomas auch geschrieben:
ts-soft hat geschrieben:Es wäre auf jeden fall besser, wenn Du einen komplett ausführbaren Code bereitstellst
Grüße ... Peter
a²+b²=mc²
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: ImageGadget ein neues Bild geben

Beitrag von stevie1401 »

Hier der ganze Code:

Code: Alles auswählen

OpenWindow(1, 30, 30, 800, 600, "Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
Global ButtonBackColor 
ButtonBackColor = RGB(50, 37, 27)
Global ButtonForeColor 
ButtonForeColor = RGB(207, 186, 167)
  
Global exepath.s,Bilderordner.s,KartenOrdner.s,MeinKartenOrdner.s
exepath=GetCurrentDirectory()
Bilderordner=exepath+"inc/bilder/"
Kartenordner=BilderOrdner+"karten/"
MeinkartenOrdner=KartenOrdner+"Karten4/"
UseJPEGImageDecoder()

SetWindowColor(1, ButtonBackColor)

Dim meineKarte.i(12)
Dim nr(12)

For i=1 To 12
  ppic.s=Str(i)+".jpg"
  ppic=MeinKartenOrdner+ppic
  nr(i)=LoadImage(#PB_Any,ppic)
  meineKarte(i) = ImageGadget(#PB_Any, 100+i*50-100, 200, 134, 192, ImageID(nr(i)), #PB_Image_Border)
  ;meineKarte(i) = ImageGadget(#PB_Any, 100+i*50-100, 200, 134, 192, ImageID(nr(i)))
  GadgetToolTip(meineKarte(i), "tooltiptest")
Next i
SetGadgetState(meineKarte(7),0)  ;Karte 7 löschen - hier bleibt ein grauer Hintergrund

;- Ereignis-Schleife
  Repeat
    Event = WaitWindowEvent()
    EventWindow = EventWindow()
    EventGadget = EventGadget()
    EventType = EventType()
    
    Select Event
      Case #PB_Event_Gadget
       
      Case #PB_Event_CloseWindow
        If EventWindow = 1
          CloseWindow(1)
          Break
        EndIf
    EndSelect
  ForEver

Welcher Hintergund ist, ist doch egal. Eigentl wollte ich einen Holzhintergrund nehmen, wie ein Tisch. Das spielt im Moment aber noch keine Rolle.
Mir geht es darum, dass ein grauer Fleck dort ist, wo einst Karte 7 war.
EDIT:
Ich habe HideGadget(meineKarte(7),1) entdeckt. Damit wird mein Gadget unsichtbar und der Hintergrund wird restauriert. Fein :-)
Ach ja, wie kann ich ein ImageGadget nachträglich bewegen? Auch mit SetGadgetState?
EDIT:
ResizeGadget(meinekarte(7), 150, 100, #PB_Ignore, #PB_Ignore) ; Verschiebt das Gadget nur an eine neue Position.

Alles klar erst einmal. Vielen Dank für eure Hilfe :-)
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
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: ImageGadget ein neues Bild geben

Beitrag von ts-soft »

Ein paar Tipps zu dem Code:
EnableExplicit - Variablen deklaration erforderlich.
Globale Deklaration - Entweder da fehlt noch Code, ansonsten nicht erforderlich, da keine Proceduren definiert.
exepath.s = GetCurrentDirectory() - Wer hat den CurrentDirectory definiert? Meist setzt der Explorer das richtige
Verzeichnis, aber nicht immer wird per Explorer gestartet! Besser:

Code: Alles auswählen

exepath.s = GetPathPart(ProgramFileName())
Dafür aber bitte: Temporäres Executable im Quellcode-Verzeichnis erstellen anschalten.

Und das Array ist zu groß, besser:

Code: Alles auswählen

Dim meineKarte.i(11)
Dim nr(11)

For i = 0 To 11
Da das Bild denselben Hintergrund wie das Fenster hat, nehme ich mal an, Du meinst die Border?
Entweder verzichtest Du auf das Flag oder HideGadget oder leeres Bild ohne Border.

Gruß
Thomas
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
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: ImageGadget ein neues Bild geben

Beitrag von stevie1401 »

Vielen Dank.
Nun fehlt mir noch die Transparents der Bilder.
Ich habe gelesen, dass es mit PNG-Images gehen soll, funktioniert bei mir allerdings nicht.
Gibt es da ein passendes Beispiel?
Mein Programm soll auf allen Plattformen laufen, deshalb bitte keinen reinen Windows-Linux- oder Mac-Code :-)
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: ImageGadget ein neues Bild geben

Beitrag von Andesdaf »

schau mal in der Hilfe zur ImagePlugin-Library, dort gibt es
ein Beispiel, das Transparenz bei PNG-Dateien darstellt.

Oder kurz ins blaue: hast du auch UsePNGImageDecoder() genutzt?
Win11 x64 | PB 6.20
Antworten