Seite 2 von 4

Verfasst: 02.05.2007 21:22
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.

Verfasst: 02.05.2007 21:28
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

Verfasst: 02.05.2007 21:33
von ts-soft
ImageID(#BildKonstante1)
#BildKonstante2 ist doch das ImageGadget, #BildKonstante1 ist das Bild, so haste es geladen

Verfasst: 02.05.2007 21:35
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?

Verfasst: 02.05.2007 22:53
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

Verfasst: 03.05.2007 00:15
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

Verfasst: 03.05.2007 16:29
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"?

Verfasst: 03.05.2007 17:47
von Fluid Byte
Zufällig generiert, guckst du dir Erstelle_Aufgabe() an. Bild

Verfasst: 04.05.2007 21:55
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.

Verfasst: 04.05.2007 22:19
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?