Über den hDC die Breite und Höhe des Ausgabekanals ermitteln
- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
Über den hDC die Breite und Höhe des Ausgabekanals ermitteln
Ich habe in einer Prozedur nur den DC zur Verfügung, der von StartDrawing() zurückgegeben wurde.
Hieraus müsste ich nun die Breite und Höhe des Ausgabekanals (also des zum DC gehörenden Sprites oder Screens) ermitteln.
Vielleicht jemand 'nen Tip wie das gehen könnte oder die Struktur des DC?
Ach ja ...hätte noch 'ne kleine Frage:
Wo finde ich denn Infos zu den Stukturen die sie hinter folgenden Werten verstecken?
; _PB_2DDrawing_GlobalStructure ... (müsste eigentlich der DC sein, oder?)
; _PB_2DDrawing_Globals
Thx und Gruß, PL.
			
			
									
									Hieraus müsste ich nun die Breite und Höhe des Ausgabekanals (also des zum DC gehörenden Sprites oder Screens) ermitteln.
Vielleicht jemand 'nen Tip wie das gehen könnte oder die Struktur des DC?
Ach ja ...hätte noch 'ne kleine Frage:
Wo finde ich denn Infos zu den Stukturen die sie hinter folgenden Werten verstecken?
; _PB_2DDrawing_GlobalStructure ... (müsste eigentlich der DC sein, oder?)
; _PB_2DDrawing_Globals
Thx und Gruß, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
						[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Code: Alles auswählen
OpenWindow(0,0,0,320,240,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Repeat
	EventID = WaitWindowEvent()
	hdc = StartDrawing(WindowOutput(0))
	Debug "Width = " + Str(GetDeviceCaps_(hdc,#HORZRES))
	Debug "Height = " + Str(GetDeviceCaps_(hdc,#VERTRES))
	Debug "-------------------------"
	StopDrawing()
Until EventID = #PB_Event_CloseWindowWindows 10 Pro, 64-Bit / Outtakes | Derek
						- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
@Fluid Byte
You really made my day. 
 
ThanX a lot !!!
			
			
									
									You really made my day.
 
 ThanX a lot !!!
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
						[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
Na ... wenn ich Dich gerade schon dranhab ... hier noch 'ne kleine Zusatzfrage:   
 
Man kann ja über so schöne Geschichten wie:diverse Infos auch aus den PB-internen Parametern holen.
Infos wie die Größe des aktuellen Ausgabekanals müssten doch im Grunde auch irgendwo innerhalb von PB zu finden sein.
Wenn's damit ginge müsste ich also keine API bemühen.
Hintergrund für die Frage nach einer API-freien Lösung ist, dass ich meinen Code weitestgehend plattformübergreifend halten möchte - was ja durch den oben gezeigten Assemblercode eigentlich gewärleistet sein müsste.
Gibt's da also evtl. noch 'ne Möglichkeit diese Infos von PB zu bekommen?
			
			
									
									 
 Man kann ja über so schöne Geschichten wie:
Code: Alles auswählen
Procedure ScreenHeight()
  !EXTRN _PB_Screen_Height 
  !MOV   Eax,[_PB_Screen_Height]
  ProcedureReturn
EndProcedureInfos wie die Größe des aktuellen Ausgabekanals müssten doch im Grunde auch irgendwo innerhalb von PB zu finden sein.
Wenn's damit ginge müsste ich also keine API bemühen.
Hintergrund für die Frage nach einer API-freien Lösung ist, dass ich meinen Code weitestgehend plattformübergreifend halten möchte - was ja durch den oben gezeigten Assemblercode eigentlich gewärleistet sein müsste.
Gibt's da also evtl. noch 'ne Möglichkeit diese Infos von PB zu bekommen?
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
						[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Kannst du mal präzisieren was genau für Angaben du haben willst bzw. was meinst du mit Ausgabekanal? Außerdem funktioniert diese Assembler Spielerei nur bei bereits geöffnetem Screen.
			
			
									
									Windows 10 Pro, 64-Bit / Outtakes | Derek
						- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
Ist "Ausgabekanal" nicht der deutsche Begriff für einen DC?Fluid Byte hat geschrieben:... was meinst du mit Ausgabekanal?
(Ok, hätte vielleicht doch besser bei der englischen Abkürzung bleiben sollen.
 )
  )Dass das zuvor genannte Beispiel nur mit bereits geöffneten Screen funktioniert ist natürlich schon klar - war ja auch nur ein Beispiel von vielen.Fluid Byte hat geschrieben:Außerdem funktioniert diese Assembler Spielerei nur bei bereits geöffnetem Screen.
Sachen wie:
Code: Alles auswählen
Procedure DrawingDC() 
!extrn _PB_2DDrawing_GlobalStructure 
!MOV EAX,[_PB_2DDrawing_GlobalStructure] 
ProcedureReturn 
EndProcedure ).
 ).Ok, ich beschreibe mal kurz wofür ich's brauche:Fluid Byte hat geschrieben:Kannst du mal präzisieren was genau für Angaben du haben willst ...
Hier im Forum fragte vor ein paar Tagen jemand nach 2D-Funktionen mit Antialiasing.
Ich hatte vor einiger Zeit mal diverse solcher Routinen für eigene Zwecke geschrieben. Da nun also mal nach sowas gefragt wurde wollte ich sie öffentlich machen - und dann natürlich möglichst für alle PB-User anwendbar - also plattformübergreifend.
Für den Eigenbedarf ist der Aufbau und die Anwendung dieses Routinen momentan ausreichend - für die Allgemeinheit (und gerade für Anfängeer) aber wohl nicht einfach und narrensicher genug in der Anwendung.
Aus diesem Grunde stelle ich sie gerade nochmal um - unter anderem eben auch komplett auf Multi-OS-Tauglichkeit.
Zum Ablauf:
Um möglichst schnell zu sein und diverse Parameter nicht in jeder einzelnen Routine abfragen zu müssen, benutze ich eine "INI-Routine" die im Grunde die Umgebungswerte für meine Routinen erstellt.
Diese INI-Routine muss also vom User vor den anderen Routinen aufgerufen werden und sammelt diverse Informationen über den aktuellen Zustand - also z.B.:
- existiert schon ein DC (wurde also bereits vom User StartDrawing() aufgerufen)
- Wenn ja:
... - wo befindet sich sein Buffer
... - welches Pixelformat hat er
und eben auch
... - welche Höhe und Breite hat der DC.
- Für die erste Abfrage ob ein DC besteht kann ich o.g. Assemblercode nehmen (es gibt ja dafür keinen entsprechenden PB-Befehl).
- für die 2. und 3. Abfrage kann ich PB-Befehle nehmen.
- für Höhe und Breite habe ich momentan allerdings noch keine plattformübergreifende Lösung gefunden.
Deine WinAPI-Lösung hilft mir da natürlich schon mal sehr für Windows weiter - was plattformübergreifendes kann ich damit aber leider vergessen.

Daher also meine Frage, ob man nicht auch diese Infos irgendwo aus PB herauskitzeln kann - denn vorhanden sein müssten sie ja irgendwo.
Für folgende Dinge habe ich bereits passende Assembler-Routinen - kann damit also diese Infos direkt aus PB abrufen:
Für Höhe und Breite des DC's fehlen sie mir allerdings noch.Diverse Assemblerroutinen hat geschrieben:- IsScreen()
- IsScreenBuffer()
- ScreenWidth()
- ScreenHeight()
- ScreenDepth()
- DrawingDC()
- GetCurrentBuffer()
- GetPixelFormat()
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
						[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Nicht das ich wüsste.Ist "Ausgabekanal" nicht der deutsche Begriff für einen DC?

Allerdings!I(Ok, hätte vielleicht doch besser bei der englischen Abkürzung bleiben sollen. Mr. Green )

Ne, die Prozedur prüft ob überhaupt eine DC existiert.greifen dann halt entsprechend auf einen vorhandenen DC zu (oder nicht? Rolling Eyes )
Zum Thema. Ich hab jetzt nicht alles genau gelesen (zu faul) aber das hier sollte erstmal weiterhelfen:
Code: Alles auswählen
InitSprite()
OpenWindow(0,0,0,640,480,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
Structure DrawingInfoStruct
	Type.l				; Type of the DC
	Window.l			; Window associated to the DC (if any)
	hDC.l				; DC (Display Device Context)
	ReleaseProcedure.l	; Address to a procedure to release the DC when StopDrawing() is called
	PixelBuffer.l		; Address of the memory pixel buffer (DirectX)
	Pitch.l				; Bytes per line (DirectX)
	Width.l
	Height.l
	Depth.l
EndStructure
LoadFont(0,"Arial",9,256)
Repeat
	EventID = WindowEvent()
	
	ClearScreen(RGB(40,90,140))	
	
	*pbdis.DrawingInfoStruct = ScreenOutput()
		
	StartDrawing(*pbdis)
	DrawingMode(1)
	DrawingFont(FontID(0))
	FrontColor(#White)
 	DrawText(10,10,"Type = " + Str(*pbdis\Type))
 	DrawText(10,25,"Window = " + Str(*pbdis\Window))
 	DrawText(10,40,"Device Context = " + Str(*pbdis\hDC))
 	DrawText(10,55,"ReleaseProcedure = " + Str(*pbdis\ReleaseProcedure))
 	DrawText(10,70,"PixelBuffer = " + Str(*pbdis\PixelBuffer))
 	DrawText(10,85,"Pitch = " + Str(*pbdis\Pitch))
 	DrawText(10,100,"Width = " + Str(*pbdis\Width))
 	DrawText(10,115,"Height = " + Str(*pbdis\Height))
 	DrawText(10,130,"Depth = " + Str(*pbdis\Depth))
 	StopDrawing()	
	
	FlipBuffers()
Until EventID = #PB_Event_CloseWindowWindows 10 Pro, 64-Bit / Outtakes | Derek
						- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
*Argh* ... ich Dämel.Fluid Byte hat geschrieben:*pbdis.DrawingInfoStruct = ScreenOutput()
 
 Das ich diese Infos evtl. aus der DrawingInfoStruct auslesen könnte hatte ich auch bereits vermutet - hab dann aber bei meinen Versuchen immer einen IM bekommen.
Hab dem Pointer halt immer das Ergebnis von StartDrawing() statt von xyOutput() (... Zitat aus der PB-Hilfe: dem "Ausgabekanal") übergeben.

Also nochmals vielen Dank für die Hilfe !!!
Nun müsste es auch mit der Nachbarin klappen.

					Zuletzt geändert von PureLust am 10.07.2007 18:34, insgesamt 2-mal geändert.
									
			
									[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
						[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Kein Ding! 
Das PixelFormat allerdings ist so ne' Sache. Mit "_PB_DirectX_PixelFormat" würde es gehen aber wie der Name vermuten lässt nur mit Windows. Weiss gerade auch gar nicht was MacOS eigentlich benutzt. Kann ja mal guggen ob's da was gibt.
			
			
									
									
Das PixelFormat allerdings ist so ne' Sache. Mit "_PB_DirectX_PixelFormat" würde es gehen aber wie der Name vermuten lässt nur mit Windows. Weiss gerade auch gar nicht was MacOS eigentlich benutzt. Kann ja mal guggen ob's da was gibt.
Windows 10 Pro, 64-Bit / Outtakes | Derek
						
