Seite 1 von 2

Über den hDC die Breite und Höhe des Ausgabekanals ermitteln

Verfasst: 10.07.2007 00:27
von PureLust
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.

Verfasst: 10.07.2007 16:06
von Fluid Byte

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_CloseWindow

Verfasst: 10.07.2007 16:16
von PureLust
@Fluid Byte

You really made my day. :allright:

ThanX a lot !!!

Verfasst: 10.07.2007 16:17
von Fluid Byte
You're welcome d00d! Bild

Verfasst: 10.07.2007 16:29
von PureLust
Na ... wenn ich Dich gerade schon dranhab ... hier noch 'ne kleine Zusatzfrage: :mrgreen:

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
EndProcedure
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?

Verfasst: 10.07.2007 16:45
von Fluid Byte
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.

Verfasst: 10.07.2007 17:34
von PureLust
Fluid Byte hat geschrieben:... was meinst du mit Ausgabekanal?
Ist "Ausgabekanal" nicht der deutsche Begriff für einen DC?
(Ok, hätte vielleicht doch besser bei der englischen Abkürzung bleiben sollen. :mrgreen: )
Fluid Byte hat geschrieben:Außerdem funktioniert diese Assembler Spielerei nur bei bereits geöffnetem Screen.
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.

Sachen wie:

Code: Alles auswählen

Procedure DrawingDC() 
!extrn _PB_2DDrawing_GlobalStructure 
!MOV EAX,[_PB_2DDrawing_GlobalStructure] 
ProcedureReturn 
EndProcedure
greifen dann halt entsprechend auf einen vorhandenen DC zu (oder nicht? :roll: ).
Fluid Byte hat geschrieben:Kannst du mal präzisieren was genau für Angaben du haben willst ...
Ok, ich beschreibe mal kurz wofür ich's brauche:
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:
Diverse Assemblerroutinen hat geschrieben:- IsScreen()
- IsScreenBuffer()
- ScreenWidth()
- ScreenHeight()
- ScreenDepth()
- DrawingDC()
- GetCurrentBuffer()
- GetPixelFormat()
Für Höhe und Breite des DC's fehlen sie mir allerdings noch.

Verfasst: 10.07.2007 17:57
von Fluid Byte
Ist "Ausgabekanal" nicht der deutsche Begriff für einen DC?
Nicht das ich wüsste. Bild
I(Ok, hätte vielleicht doch besser bei der englischen Abkürzung bleiben sollen. Mr. Green )
Allerdings! Bild
greifen dann halt entsprechend auf einen vorhandenen DC zu (oder nicht? Rolling Eyes )
Ne, die Prozedur prüft ob überhaupt eine DC existiert.

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_CloseWindow
Was das Pixelformat des Buffers angeht wüsste ich jetzt nur DrawingBufferPixelFormat() aber ich hab eben gesehen das dies "nur" für Linux & MacOS ist. Muss nochmal guggen.

Verfasst: 10.07.2007 18:22
von PureLust
Fluid Byte hat geschrieben:*pbdis.DrawingInfoStruct = ScreenOutput()
*Argh* ... ich Dämel. >_<

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. :freak:

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

Verfasst: 10.07.2007 18:31
von Fluid Byte
Kein Ding! Bild

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.