Button wird nicht mehr richtig dargestellt + Fenster stirbt!

Anfängerfragen zum Programmieren mit PureBasic.
Ractur
Beiträge: 128
Registriert: 24.06.2008 11:51

Button wird nicht mehr richtig dargestellt + Fenster stirbt!

Beitrag von Ractur »

Hallo,

ich brauche mal wieder Eure Hilfe, ich habe 2 Codes, folgender funktioniert einwandfrei:

[Hier wird ein ButtenGadget erzeugt, das funktioniert auch so wie ich möchte.]

Code: Alles auswählen

If OpenWindow(0,0,0,500,500,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
         SetWindowColor(0,RGB(255,255,255))
  If CreateGadgetList(WindowID(0))
    If count = 1
      ButtonImageGadget(1,200,200,100,25,CatchImage(0,?Button1))
      GadgetToolTip(1, "Timer ist aktiviert!")
      ElseIf count = 0
      ButtonImageGadget(1,200,200,100,25,CatchImage(0,?Button2))
      GadgetToolTip(1, "Timer ist deaktiviert!")
      EndIf
  EndIf
Nun verwende ich einen kleinen anderen Code, der aber nicht funktioniert, der Button wird falsch dargestellt (mit eine Art Schlagschatten) + das Fenster reagiert nicht mehr sobald es mal im Hintergrund war, als ob es nicht mehr refresht. Was mach ich denn in den nachfolgenden Code falsch?

Code: Alles auswählen

   If EventID=#PB_Event_Gadget 
      GadgetNr=EventGadget() 
      If GadgetNr=1 
         OpenWindow(2,0,0,600,500,"...", #PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible|1)
         SetWindowColor(2,RGB(255,255,255))
         SkinWin(WindowID(2),CatchImage(0,?SkinPicture))
         HideWindow(2,0)
         SetGadgetState(0,Random(100))
         If CreateGadgetList(WindowID(2))
          If count = 1
            ButtonImageGadget(4,200,200,100,25,CatchImage(0,?Button1))
            GadgetToolTip(4, "Timer ist aktiviert!")
            ElseIf count = 0
            ButtonImageGadget(4,200,200,100,25,CatchImage(0,?Button2))
           GadgetToolTip(4, "Timer ist deaktiviert!")
          EndIf
        EndIf
      EndIf
    EndIf  
Ein Tip würde mir schon weiterhelfen! Im 2ten Code wird ein Image genommen und das Transparent angezeigt wird, und da drauf wird dann ein Button gemacht, wahrscheinlich liegt es daran. Gibts eine Lösung?

Danke schon mal, Matthias
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ich sehe bei dir kein einzigens WindowEvent() oder WaitWindowEvent() was irgendwelche Ereignisse ermittelt, hast du dir vergessen ? oder nur nicht mit gepostet ?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ja die codes sind absolut unvollständig, da kann man nur rumraten.

wenn ich mal rumraten soll....
mir fällt auf, dass due da eine Flag-Abfrage If count drin hast.
das sagt mir, dass der code mehrfach durchlaufen werden soll,
wenn count unterschiedliche zustände haben kann.

dahingegen reagierst du darauf mit der erzeugung eines Gadgets.
das ist böse.

erzeuge dein gadget ganz am anfang, ohne irgendwelche bedingungen.
außerdem würde ich auch am anfang zwei Images createn und die mit Catch füllen.

später, in der Bedingung, kannst du dem fertigen Gadget dementsprechend
die vorher geladenen Images zuweisen, das ist sauberer.


...achja...

was soll SetGadgetState(0,Random(100))? :?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Ractur
Beiträge: 128
Registriert: 24.06.2008 11:51

Beitrag von Ractur »

Hi,

danke erstmal für die Antworten :allright: Das ganze kleine Program funktioniert schon. Auch die Events werden abgefragt welche ich nicht gepostet habe.

count = 1 oder 0, das beziffert eigentlich nur, welches image bei start des programmes geladen werden soll.

Ich bin gerade nicht an meinen PC, allerdings vermute ich das
es an "SKINWIN" liegt, das ist meine vermutung.

Denn wenn ich nur o.g. ändere, dann funktioniert es nicht mehr, also muss es eigentlich an dem stückchen Code liegen.

Oder ich "verhampel" mich in irgend einer Schleife, ich werde heute Abend nochmal nachsehen, jedoch habe ich nach wie vor SkinWin in verdacht, denn ohne SkinWin funktioniert das ganze ja?!

Aber ich kann mir dann auch wieder nicht vorstellen das es an SkinWIn liegt, denn ein ImageGadet ist doch keine grosse Sache das im Nachhinein darzustellen. Jedoch ohne den Befehl SkinWIn wirds richtig dargestellt. Gut werde dann heute Abend das Programm mal Stück für Stück debuggen dann sieht man ja an was es liegt, hatte das schon mal versucht aber nun muss ichs eben intensiver machen damit ich sehe wo es hängt.

Das ich mit SkinWin allerdings nicht so die Erfahrung habe, weiss ich selbst nicht so genau was die Befehle

Code: Alles auswählen

         SkinWin(WindowID(2),CatchImage(0,?SkinPicture))
         HideWindow(2,0)
         SetGadgetState(2,Random(100)) 
bewirken. Und an diesen 3 Zeilen muss das Problem liegen!

Grüsse Matthias
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

"SkinWin" ist der einzige befehl aus der skinwin lib.
ich weiß nicht, auf welche PB Version die Lib ausgelegt ist, also liegts vielleicht auch daran.
das ist immer das problem mit UserLibs, dass die mit neueren PB-Versionen nicht immer funktionieren.

was soll denn der befehl machen... das image als hintergrund des fensters einrichten?
dafür müßte es doch auch ne API-Funktion geben, dann kannste ganz auf die UserLib verzichten...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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

Beitrag von ts-soft »

Ractur hat geschrieben:Das ich mit SkinWin allerdings nicht so die Erfahrung habe, weiss ich selbst nicht so genau was die Befehle

Code: Alles auswählen

         SkinWin(WindowID(2),CatchImage(0,?SkinPicture))
         HideWindow(2,0)
         SetGadgetState(2,Random(100)) 
bewirken. Und an diesen 3 Zeilen muss das Problem liegen!

Grüsse Matthias
Wenn Du nicht weißt, was SkinWin macht, dann wirste es auch nicht brauchen :mrgreen:
Falls Du doch einen Skin für Dein Fenster erstellt hast, kommen wir dann
noch mal drauf zurück.
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
Ractur
Beiträge: 128
Registriert: 24.06.2008 11:51

Beitrag von Ractur »

*grins* Ich weiss schon was die SkinWin Befehle bewirken, allerdings weiss ich nicht ob die Befehle richtig angesteuert bzw. von mir richtig angewendet werden.

Code: Alles auswählen

         SkinWin(WindowID(2),CatchImage(0,?SkinPicture))
         HideWindow(2,0)
         SetGadgetState(2,Random(100))
Zeile 1: Setze ein HintergrundBild, dieses Hintergrundbild bildet dann das Fenster und Fensterform, sprich es gibt kein Rahmen oder ähnliches, sondern das Bild wird transparent dargestellt, der erste linke obere Pixel des Bildes bestimmt was transparent wird.

Zeile 2: Zeige das versteckte Window2 an, klar, im Aufruf open wurde es ja als invisible geöffnet.

Zeile3: Hier bin ich Ratlos, ich hatte das so aus einen Beispiel übernommen, es muss aber wohl was mit dem erzeugten Gadget zu tun haben.

Die Lib stammt von http://pbosl.purearea.net/index.php?site=Libs und ist offensichtlich für PB4.0 ich nutze aber derzeit PB4.2

Wenn es sich um einen normalen Button handelt welcher nicht aus einen Image besteht funktioniert das Beispiel. (Ok, umso mehr ich schreib umso besser scheine ich das Programm zu debuggen :mrgreen:)

Ein API Befehl gibt es, zur Darstellung einer anderen Fensterform. allerdings muss ich da offensichtlich dann mit Masken arbeiten, was ich A noch nie gemacht habe und B nicht wirklich verstehe und C ich in Punkto Grafik eine absolute 0 bin, wer soll also da die Maske machen?

Gut ich werds jetzt nochmal umschreiben und dan ganze mit nem normalen Button probieren, wenn das dann funktioniert, (in einen anderen kleineren Programm war das so) dann liegts an SkinWin in verbindung mit ImageGadget.

Vielleicht hat ja schon jemand mal eine andere Fensterform gemacht, ich hab hier schon im Forum geschaut, allerdings war das Seitenlanger Code, um nur eine andere Fensterform zu erreichen, das schreckt mich als Anfänger noch ein bisschen ab, weil ich immer Versuche, zumindest am Anfang jetzt einfache möglichst übersichtliche Programme zu machen. Ausserdem versuche ich den Code zu verstehen, auch wenn ich nur Copy&Paste mache wenn jemand ein Beistpielcode postet.

Vielleicht habt ja Ihr noch ne Idee, Grüsse und besten Dank für Eure Unterstützung....
Ractur
Beiträge: 128
Registriert: 24.06.2008 11:51

Beitrag von Ractur »

Hallo,

hab den Fehler:

wenn ich :

Code: Alles auswählen

ButtonGadget(3,95,130,80,23,"Cancel")
verwende funktioniert das Fenster einwandfrei, ersetze ich jedoch diese eine Zeile durch:

Code: Alles auswählen

            ButtonImageGadget(3,200,200,100,25,CatchImage(0,?Button1))
Funktioniert das Fenster nicht mehr! Gut, steh ich vor der nächsten Frage ich ich das umgehen kann, ich verwende also ein .bmp Bild für das ButtonImageGadget vll. liegts daran, oder vll. liegts eben daran das SkinWin das einfach nicht auf die Reihe bekommt.

Danke für Eure Hilfe, hat mir das debuggen erheblich erleichtert! Also wie man ein Programm richtig debuggt hab ich noch nicht raus, da muss ich noch üben.

Danke! Matthias
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich hatte schon in meinem ersten posting darauf hingewiesen, dass es wohl sinnvoll wäre,
das Image erst zu erzeugen und dann zuzuweisen.
selbst wenn du das nicht tust, musst du wohl auch hier ImageID() verwenden,
wenn du ein Image, von dem du die PB nummer hast, an ein gadget übergeben willst.

Ractur hat geschrieben:Ein API Befehl gibt es, zur Darstellung einer anderen Fensterform.
ich meinte einen API-Befehl, um ein Hintergrundbild bei einem Fenster einzurichten.
das war jedenfalls meine "frage", ob der befehl bei dir das machen soll.


und SetGadgetState(2,Random(100)) setzt den status des Gadget 2 auf einen zufälligen wert von 0 bis 100.
wenn du nicht weißt, was das soll, würde ich sowas eher weglassen als einfach mal rein zu kopieren.
mehr kann ich dazu auch nicht sagen, weil aus deinen Codesnippets nicht ersichtlich ist,
was für ein Gadget die Nummer 2 überhaupt ist.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Ractur
Beiträge: 128
Registriert: 24.06.2008 11:51

Beitrag von Ractur »

@Kaeru Gaman

Code: Alles auswählen

DataSection
  Button1:
    IncludeBinary "c:\Button1.bmp"
      Button2:
    IncludeBinary "c:\Button2.bmp"
      SkinPicture:
    IncludeBinary "c:\Bild3.bmp"
EndDataSection
Das "erzeugt" die entsprechenden Bilder, anderswo gehts ja genauso, nur eben mit dem Befehl SkinWin funktioniert das nicht. Hatte ich eigentlich schon geschrieben das es rein an den ImageButton liegt, das gesamte Programm funktioniert einwandfrei WENN ich einen normalen Button verwende, sobald ich aber den Imagebutton verwende geht das nicht mehr! Es SEI DENN ICH LASSE SKINWIN Befehl weg, dann gehts wieder.

Was sagt das dann? Es liegt an SkinWin in Verbindung mit ImageButton, und da ich keine Hilfe finde, ob man .bmp Bilder verwenden kann bei SkinWin oder ob bestimmte Sachen in Verbindung mit SkinWin und ImageButton erfüllt sein müssen, kann ich auch nicht sagen an was es liegt.

Letztendlich lädt das Programm ein .bmp als Hintergrundbild, dieses Hintergrundbild wird verwendet um die Fensterform darzustellen, die Fensterform passt sich automatisch den Bild was geladen wurde und dann mit SkinWin aufgerufen wird an.

Ein normaler Button geht auch, ein ImageButton führ in Verbindung mit SkinWin zu Problemen. Ka, warum, aber es liegt wohl ein Problem vor, auf den "ImageFenster" ein ImageButton darzustellen.

So, da ich nun nicht mehr weiter weiss werd ich nun das Forum durchsuchen, evtl. finde ich eine bessere möglichkeit ein Fenster zu formen.

Grüsse Matthias[/code]
Antworten