Hintergrundbild im Programm

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

duli hat geschrieben:Danke für die Hinweise, aber mit jpg geht es auch nicht.
Ich habe nicht alles gelesen, aber dazu möcht ich was sagen:

PureBasic unterstützt von Hause aus nur ICO und BMP.
GIF wird nicht unterstützt, obwohl das schon viele vorgeschlagen haben.

jPG, PNG, TIFF und TGA werden schon unterstützt, aber nicht direkt. Um eines dieser Formate nutzen zu können, musst du den dafür benötigten Decoder einbinden.

Das geht so: Möchtest du JPG Bilder laden, dann schreibst du (am besten so ziemlich als erstes im Code)

Code: Alles auswählen

UseJPEGImageDecoder()
Dies bindet den Decoder für JPG mit ein und ab dieser Zeile unterstützt jeder LoadImage() Befehl auch JPG!

Für die anderen Formate geht das ähnlich. Siehe bitte dazu im der Hilfe das Kapitel ImageDecoder.



Warum wird das so gemacht? Ganz einfach: Das einbinden eines einzigen Decoders (beispielsweise UsePNGImageDecoder() vergrößert dein Programm um 81 KB! Jetzt stell dir vor, alle Decoder würden immer automatish mit eingebunden. Ist zwar bequem, aber viele Programme brauchen die Decoder nicht und würden so unnötig groß werden.

Du kannst also selbst bestimmen, welche Decoder eingebunden werden sollen, damit bestimmst/kontrollierst du auch gleichzeitg die Dateigröße. Und wie du sicherlich inzwischen gemerkt hast, gibt es kein UseGIFImageDecoder(), deshalb wird GIF nicht unterstützt.

Da, wie ich bereits sagte, ICO und BMP von Hause aus unterstützt werden, braucht man für diese Formate keinen Decoder.

Wenn du versuchst, ein JPG zu laden, ohne den JPG-Decoder einzubinden, resultiert das nicht in einer Fehlermeldung! Passe also selber auf, welche Formate und Decoder du verwendest, dieser Blödheitsfehler kann schnell übersehen werden.

Übrigens: Neben den Decodern gibt es auch Encoder. Decoder erweitern die Load-Befehle: LoadImage(), LoadSprite, etc. um das jeweilige Format. Encoder sind für das Speichern zuständig und erweitern dementsprechend die Save-Befehle: SaveImage(), SaveSprite(), etc.. Auch Encoder müssen manuell eingebunden werden.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag von duli »

Hallo Fluid Byte ich habe es mal etwas verdaut und es ist nicht was ich möchte, ich möchte ein Bild für den Hintergrund verwenden. Nicht eine Grafik die ich erzeuge.

ts-soft danke für deinen Gedanken aber ich verstehe es nicht.

Code: Alles auswählen

ImageGadget(#BildKonstante2,  0, 0, 147, 274, ImageID(0))
Muss ich nun #Bildkonstante2 mit 0 ersetzten, brachte keinen Erfolg.
Oder muss ich ImageID(#BildKonstante2) was auch keinen erfolg brachte?
Was ich meine das habe ich beides schon probiert aber es änderte nichts. Für was ist eingentlich das ImageID()? Das habe ich ehrlich gesagt noch nicht richtig verstanden
Man kann nicht wissen was man nicht weiss..
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 »

ImageID(#BildKonstante1)
#BildKonstante2 ist doch das ImageGadget, #BildKonstante1 ist das Bild, so haste es geladen
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
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Hallo Fluid Byte ich habe es mal etwas verdaut und es ist nicht was ich möchte, ich möchte ein Bild für den Hintergrund verwenden. Nicht eine Grafik die ich erzeuge.
Das war ein Beispiel. Lade einfach dein Bild mit derselben ID.

Was ts-soft versucht zu sagen ist das du die ID für dein Bild in einer Konstante speicherst (8 oder so) aber im ImageGadget "ImageID(0)" benutzt. 8 und 0 sind nicht gleich, oder?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Donald
Beiträge: 307
Registriert: 03.01.2005 02:21
Wohnort: Marl

Beitrag von Donald »

Hallo duli,

ich würde ja nicht gerade ein ImageGadget für sowas nehmen.
Warum gibst du dem Fenster nicht gleich ein Hintergrundbild ?

Gruß Donald
DONALD :D www.PureBasic-Donald.de gibt es im Moment nicht mehr
PureBasic - jaPBe - PureVisonXP - TailBite
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Ein Bild hilft aber auch nicht wirklich den etwas misslungenen Fensteraufbau zu kaschieren...

Ich hab mich mal versucht (irgendwie war mir gerade langweilig) deinen Taschenrechner etwas freundlicher zu gestalten. Ausserdem kann er Multiplizieren, Addieren, Subtrahieren und Dividieren. Das ganze auch wenn gewünscht mit grossem 1x1:

Auch habe ich den Thread rausgeworfen, weil er wirklich nicht nötig ist.

Viel Spass

Code: Alles auswählen

; Mit Enumeration wird den Konstanten eine fortlaufende Nummer vergeben anstelle dies von Hand zu machen.
Enumeration ; hier kommen alle Windows rein
	#Window_0
EndEnumeration

Enumeration ; hier kommen alle Menüitems rein
	#Neu
EndEnumeration

Enumeration ; hier kommen alle Gadgets rein
	#TextGadget_0
	#StringGadget_1
	#TextGadget_2
	#StringGadget_3
	#TextGadget_5
	#StringGadget_6
	#TextGadget_7
	#StringGadget_8
	#TextGadget_9
	#StringGadget_10
	#Frame3DGadget_4
	#CheckBoxGadget_11
	#CheckBoxGadget_12
	#CheckBoxGadget_13
	#CheckBoxGadget_14
	#OptionGadget_15
	#OptionGadget_16
	#ButtonGadget_17
EndEnumeration

Enumeration
	#Font_1
EndEnumeration

;Benutzte Variablen
Define.l Anzahl_Rechnungen, Anzahl_Richtig, Anzahl_Falsche, t_start, Flags, Seconds, Started

Procedure Rechne()
	Protected Val1.l, Val2.l, Operation.s, Result.l

	Val1      = Val(StringField(GetGadgetText(#StringGadget_1), 1, " "))
	Operation = StringField(GetGadgetText(#StringGadget_1), 2, " ")
	Val2      = Val(StringField(GetGadgetText(#StringGadget_1), 3, " "))

	Select Operation
		Case "*"
			Result = Val1 * Val2
		Case "+"
			Result = Val1 + Val2
		Case ":"
			Result = Val1 / Val2
		Case "-"
			Result = Val1 - Val2
	EndSelect

	If Result <> Val(GetGadgetText(#StringGadget_3))
		Result = #False
	EndIf

	ProcedureReturn Result
EndProcedure

Procedure Erstelle_Aufgabe()
	Protected i.l, x.l, y.l, Sign.s = "*:+-"

	Repeat
		i = Random(3)
	Until GetGadgetState(#CheckBoxGadget_11 + i)

	Repeat
		x = Random(8 + 90 * GetGadgetState(#OptionGadget_16)) + 1
		y = Random(8 + 90 * GetGadgetState(#OptionGadget_16)) + 1
		Select i
			Case 0
				;Multiplikation
				x + 1
				y + 1
				If x < 11 Or y < 11
					Break
				EndIf
			Case 1
				;Division
				If x % y = 0
					Break
				EndIf
			Case 2
				;Addition
				Break
			Case 3
				If x >= y
					Break
				EndIf
		EndSelect
	ForEver

	SetGadgetText(#StringGadget_1, Str(x) + " " + Mid(Sign, i + 1, 1) + " " + Str(y))
	SetGadgetText(#StringGadget_3, "")
	SetActiveGadget(#StringGadget_3)

EndProcedure

If OpenWindow(#Window_0, 503, 89, 262, 402, "Taschenrechner", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
	If CreateGadgetList(WindowID(#Window_0))
		Flags = #ES_CENTER | #WS_EX_STATICEDGE | #WS_BORDER | #PB_String_ReadOnly
		TextGadget(#TextGadget_0, 10, 10, 120, 45, "Aufgabe:")
		StringGadget(#StringGadget_1, 135, 5, 120, 45, "", #PB_String_BorderLess | Flags)
		TextGadget(#TextGadget_2, 10, 70, 115, 35, "Ergebnis:")
		StringGadget(#StringGadget_3, 135, 65, 120, 45, "")
		TextGadget(#TextGadget_5, 20, 145, 100, 20, "Richtige Antworten:")
		StringGadget(#StringGadget_6, 135, 142, 65, 20, "0", Flags)
		TextGadget(#TextGadget_7, 20, 175, 95, 20, "Falsche Antworten:")
		StringGadget(#StringGadget_8, 135, 173, 65, 20, "0", Flags)
		TextGadget(#TextGadget_9, 20, 205, 95, 20, "Benötigte Zeit:")
		StringGadget(#StringGadget_10, 135, 202, 65, 20, "0 s", Flags)
		Frame3DGadget(#Frame3DGadget_4, 10, 125, 245, 110, "Infos")
		CheckBoxGadget(#CheckBoxGadget_11, 10, 240, 100, 20, "Multiplizieren")
		CheckBoxGadget(#CheckBoxGadget_12, 10, 265, 100, 20, "Dividieren")
		CheckBoxGadget(#CheckBoxGadget_13, 10, 290, 100, 20, "Addieren")
		CheckBoxGadget(#CheckBoxGadget_14, 10, 315, 100, 20, "Subtrahieren")
		OptionGadget(#OptionGadget_15, 135, 240, 110, 20, "Kleines 1x1")
		OptionGadget(#OptionGadget_16, 135, 265, 110, 20, "Grosses 1x1")
		ButtonGadget(#ButtonGadget_17, 85, 365, 80, 30, "Start", #PB_Button_Default)
		If LoadFont(#Font_1, "Times New Roman", 22, 0)
			SetGadgetFont(#TextGadget_0,    FontID(#Font_1))
			SetGadgetFont(#StringGadget_1,  FontID(#Font_1))
			SetGadgetFont(#TextGadget_2,    FontID(#Font_1))
			SetGadgetFont(#StringGadget_3,  FontID(#Font_1))
			SetGadgetFont(#ButtonGadget_17, FontID(#Font_1))
		EndIf
		AddKeyboardShortcut(#Window_0, #PB_Shortcut_Return, #Neu)
		SetActiveGadget(#StringGadget_3)
		SetGadgetState(#CheckBoxGadget_11, 1)
		SetGadgetState(#OptionGadget_15, 1)

		;Initialisiere Variablen
		Anzahl_Rechnungen = 0
		Anzahl_Richtig    = 0
		Anzahl_Falsche    = 0

		;Depperte Hauptschleife
		Repeat
			Select WaitWindowEvent(800)
				Case #PB_Event_Menu
					If Started And EventMenu() = #Neu
						If Rechne()
							Anzahl_Richtig + 1
							SetGadgetText(#StringGadget_6, Str(Anzahl_Richtig))
						Else
							Anzahl_Falsche + 1
							SetGadgetText(#StringGadget_8, Str(Anzahl_Falsche))
						EndIf
						Erstelle_Aufgabe()

						Anzahl_Rechnungen + 1
						If Anzahl_Rechnungen = 10
							SetGadgetText(#ButtonGadget_17, "Start")
							SetGadgetText(#StringGadget_1, "")
							Started = #False
							While WindowEvent() : Wend
							MessageRequester("Information", "Sie haben " + Str(Anzahl_Richtig) + " Richtige von 10 Aufgaben in " + GetGadgetText(#StringGadget_10), #PB_MessageRequester_Ok)
							SetGadgetText(#StringGadget_10, "0 s")
						EndIf
					EndIf

				Case #PB_Event_CloseWindow
					Break

				Case #PB_Event_Gadget
					Select EventGadget()
						Case #ButtonGadget_17
							If Started
								SetGadgetText(#ButtonGadget_17, "Start")
								SetGadgetText(#StringGadget_1, "")
								SetGadgetText(#StringGadget_10, "0 s")
								Started = #False
							Else
								SetGadgetText(#ButtonGadget_17, "Stop")
								SetGadgetText(#StringGadget_10, "0 s")
								Started = #True
								t_start = ElapsedMilliseconds()
								Seconds = 0
								Erstelle_Aufgabe()
							EndIf

						Case #CheckBoxGadget_11 To #OptionGadget_16
							If GetGadgetState(#CheckBoxGadget_11) | GetGadgetState(#CheckBoxGadget_12) | GetGadgetState(#CheckBoxGadget_13) | GetGadgetState(#CheckBoxGadget_14) = 0
								SetGadgetState(#CheckBoxGadget_11, 1)
							EndIf
							SetActiveGadget(#StringGadget_3)

					EndSelect

			EndSelect

			If Started And Int((ElapsedMilliseconds() - t_start) / 1000) > Seconds
				Seconds = Int((ElapsedMilliseconds() - t_start) / 1000)
				SetGadgetText(#StringGadget_10, Str(Seconds) + " s")
			EndIf
		ForEver
	EndIf
EndIf
End
Benutzeravatar
Dark Skillu
Beiträge: 103
Registriert: 18.03.2007 15:03

Beitrag von Dark Skillu »

hab mal deinen code im compiler getestet und hab dazu ne frage: Sind die Fragen (bzw. Aufgaben) vordefiniert oder benutzt du einen "zufallsgenerator"?
Ich benutze PureBasic 4.0.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Zufällig generiert, guckst du dir Erstelle_Aufgabe() an. Bild
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag von duli »

Habt vielen dank für alle euere Erklärungen.

HeX0R danke für Dein Beispiel, man bin ich froh war Dir gerade langweilig. Super habe viels rausgelesen und gelernt.

Ich weiss das mein Beispiel nicht so toll war aber immerhin, habe ich doch beinahe jede Zeile verstanden und gewusst was es wieso wann tut. Nund bei Deinem Beispiel habe ich wieder etwas zu verdauen.

Danke fürs erste.
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag von duli »

Hallo zusammen, ich habe es endlich begriffen. Es geht wie folgt.

Code: Alles auswählen

   LoadImage(#BildKonstante1, "hinter.bmp") 
   ImageGadget(#BildKonstante2,  0, 0, 147, 274, ImageID(#BildKonstante1))
Habe ich das richtig verstanden, dass LoadImage() lädt das Bild in den Arbeitsspeicher und da es mehrere Bilder geben kann, werden diese mit KonstantenWerte nummeriert und so wiederum im ImageGadget zur Verfügung gestellt. Stimmt das so wie ich das verstanden habe?

Ist es möglich fest zu legen das das Bild unter die anderen Gagedelemente kommt, ich meinte das mein Bild immer im Hintergrund bleibt?
Man kann nicht wissen was man nicht weiss..
Antworten