DC von Blitz-Buffern

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Marek

Betreff: DC von Blitz-Buffern

BeitragMi, Jan 09, 2008 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe soeben einen Api-Befehl gefunden, der meinen letzten Beitrag (Api_SetPixel) relativ unnütz macht; Davür entschuldige ich mich... (trotzdem Danke für die Hilfe, EPS Very Happy ) :

BitBlt

Mit ihm kann man einen ganzen Bereich von einem DC in ein Anderes kopieren...

Mene Frage ist jetzt, was die Blitz-Buffer überhaupt sind und ob (wenn ja, wie) man sie als DC benutzen kann. Mich interresiert dabei der FrontBuffer am wenigsten, da man ihn zwar sehr leicht als DC benutzen kann ( GetDC(HWnd) ; Das WindowHandle bekommt man z.B. über die blitzsys.dll etc), ihn jedoch nur sehr unkonfortabel benutzen kann, da man in B3D nur ein Fenster hat. Will man also mehrere Bilder zeichnen, hat man ein Problem...

Auch der BackBuffer ist weniger interresant. ImageBuffer dagegen kann man sehr flexibel einsetzen, allerdings habe ich keinerlei Ahnung, ob man diese überhaupt als DC einsetzen kann und wenn ja, wie...

Ich wäre für jeden Hinweiß sehr dankbar!

MfG Marek

And den Admin/Moderator, der diesen Beitrag zuerst ließt: sollte er nicht dort gepostet worden sein, wo er hingehört, bitte ich darum ihn zu verschieben.
Wer lesen kann ist klar im Vorteil...
 

ChristianK

BeitragMi, Jan 09, 2008 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Jedes Bild ( bzw Textur ) besitzt ein DirectDraw-Surface. Da sind die eigentlichen Pixeldaten drin. Außerdem beinhaltet es einige Methoden, darunter auch eine namens GetDC( ), welche die Oberfläche in einen DC "konvertiert".

Ein Blitz-Bild ( LoadImage ) ist ungefähr so aufgebaut:

Code: [AUSKLAPPEN]
-> Blitz-Image ( oder Textur )
   
   -> Daten ( Breite, Höhe, bla blub )
   -> ...
   -> ...
   -> Buffer
      
      -> Noch mehr Daten
      -> ...
      -> ...
      -> IDirectDrawSurface7 ( das "eigentliche" Bild )
         
         -> Methode GetDC( )

Weil "IDirectDrawSurface7" ein Objekt ist, kommt man nur mit einer OOP-Sprache an die Methode -> DLL.
Was willst du mit dem DC anschließend machen?
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Marek

BeitragMi, Jan 09, 2008 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Teilprojekt ist ein System zu entwicheln, mit dem man echte GUI's für Programme schreiben kann, also nicht nur Fenster im B3D-Fenster, sondern Fenster auf dem Desktop. Mein erster Ansatz war, das ganze mit Window-Reagons zu machen(blitzsys.dll)... Allerdings gibt es da das Problem, dass man die ClientArea eines Fensters nicht auf die Höhe des Desktops bringen kann; es bleibt immer ein Streifen übrig, denn man dann nicht für Fenster etc benutzen könnte... Bleiben nur noch 2 Möglichkeiten: Ein Workaround mit 2 Fenstern(sehr kompliziert; ein paar Nachteile) oder ein neuer Ansatz, in diesem Fall ist mir nur die WinApi eingefallen... Und nach einer Weile suchen bin ich dann auf SetPixel gekommen und habe auch gleich versucht ein kleines Programm zu schreiben, welches einfach ein Bild auf den Desktop zaubert... Hat wunderbar geklappt Laughing nur viel zu langsam... Sad
Also: Google -> "SetPixel Alternaive" und auf irgendeiner Seite stand dann ein C Programm(-ausschnitt) in dem BitBlt vorkam... so kam ich dann zum jetzigen Thema: BitBtl mit ImageBuffer als SourceDC...

Das große Projekt das dahinter steht, ist der Bruder von MiniBlitz3D; MiniBlitz+ für Blitz3D.
Ich behaupte nicht, dass ich mir das als Ziel gesetzt hätte, ich mache nur einen Anfang und bastle ein wenig dran rum/erweitere es, wenn ich Lust oder das Verlangen danach habe... Ein komplettes MiniBlitz+ zu schreiben würde mein Wissen auch weit überschreiten^^
Mir ist nur aufgefallen, dass ich solche Funktionen, wie zum Beispiel 2 Fenster auf dem Desktop, sehr oft in meinen Projekten einsetzen will, es aber nicht kann, weil ich Blitz3D habe und nicht Blitz+ ... Da ich aber ein Schüler bin, der im Grunde nie Geld hat, sich wegen einem Projekt Blitz+ zu kaufen und zudem noch (viel) zu faul bin zu 3D zusätzlich noch die Befehle von B+ zu lernen...

Wie dem auch sei, das wäre wohl das was ich mit dem DC anfangen würde: Ich würde es als SourceDC-Parameter an BitBlt übergeben um dann ein Bild (z.B. einen Teil des Fensterrahmens) auf den Desktop( GetDC(0) bzw. GetDC(GetDesktopWindo() als ZielDC ) zu zaubern.

MfG Marek
Wer lesen kann ist klar im Vorteil...
 

ChristianK

BeitragDo, Jan 10, 2008 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Du willst also einfach, statt ins Fenster auf den Desktop malen? Wenn ja -> Lohnt sich nicht, weil du dann keine Eingaben abfragen kannst. Wenn du ein richtiges GUI machen willst, dann auch mit richtigen Fenstern und richtigen Windows Controls. Alles andere bringt imho nichts.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Dreamora

BeitragDo, Jan 10, 2008 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst dich sonst ma mit Kevin im englischen Forum kurzschliessen, der WinBlitz3D geschrieben hat. Das macht das gleiche, wird aber schon länger nicht mehr weiterentwickelt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Marek

BeitragDo, Jan 10, 2008 16:22
Antworten mit Zitat
Benutzer-Profile anzeigen
@ChristianK doch, kann man Wink
Code: [AUSKLAPPEN]
Function IsKeyPressed( vKey% )
   Return ( api_GetAsyncKeyState( vKey ) Shr 16 ) And 1
End Function


Man brauch nur die VirtualKeyCodes der jeweiligen (Maus- oder) Keyboard-Taste... Soweit ich weiß liegt auf meiner HD auch noch ein Code wie man die Maus-Position rausfindet, daran solls nicht scheitern^^

Solche kleineren Sachen hab ich viele... und ich brauch sie auch ziemlich oft Rolling Eyes

Zu den Windows-Fenstern: zu unflexibel; man hat immer den Windows-Style... und den nur für ein Fenster zu ändern ist sehr umständlich.
Und ein weiteres Beispiel: Man strartet eine Anwendung, die am Anfang, während sie alle Daten lädt etc., ein kleines Fenster ohne Rand öffnet(mit dem Logo dadrauf etc.) und dann im Fenstermodus ausgeführt wird...

Ich hätte normalerweise Reagons benutzt, die haben aber einen Nachteil: Macht man den Rand per Reagon weg und will danach den Rand wieder anzeigen, bekommt man nur enen Rand ala Win98 zu sehen. Der WinXP Syle is weg, sobald man eine Reagon auf das Fenster setzt...

@Dreamora werd ihn mal drauf ansprechen, danke Very Happy

MfG Marek
 

ChristianK

BeitragDo, Jan 10, 2008 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar kann man Input bekommen, aber nicht so, wie man das von normalen Fenstern gewohnt ist. Wenn du auf den Desktop malst, kann man z.B. trotzdem noch "hinter" das Gemalte klicken.

Zitat:
Zu den Windows-Fenstern: zu unflexibel; man hat immer den Windows-Style... und den nur für ein Fenster zu ändern ist sehr umständlich.

Es gibt wohl kaum etwas, das flexibler ist als ein Fenster. Smile In deinem Fall wäre die beste Möglichkeit, ein Fenster ( ohne Rahmen ) als Unterlage zu benutzen, statt direkt auf den Desktop zu malen.

PS: Die Dinger heissen "Regions". Wink
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Marek

BeitragDo, Jan 10, 2008 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, das ist auch ne Möglichkeit... die mir sogar sehr gut gefällt Very Happy

Ich wusste nur nicht, dass man ein Windows-Fenster ohne Rahmen erstellen kann Question Exclamation

Allerdings ändert das nicht viel daran, dass man immernoch das DC eines Blitz-Bildes braucht, um dessen Inhalt auf das leere Fenster zu setzen...
Wer lesen kann ist klar im Vorteil...
 

Dreamora

BeitragDo, Jan 10, 2008 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
den HWND des Blitz Contexts kannst du erfragen von Blitz3D, ausgehend von dem und den Daten im Prozess kannst du den rest dann rausholen, oder sehe ich das falsch Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

EPS

BeitragDo, Jan 10, 2008 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Zum Thema Rahmenloses Fenster hätte ich hier was: klick mich

und btw. bei meinem GUI escape gibts auch ein "PlugIn" um das GUI Fenster direkt auf dem Desktop anzuzeigen ( Link ), also ohne ein Windows Fenster drumherum. Allerdings habe ich mich hierbei wirklich nur auf die Größe eines GUI-Fensters beschränkt wodurch man also auch nur eins darstellen kann.

Theoretisch müsste man auch das BB Fenster auf volle Desktopgröße bringen können um darin mehrere GUI Fenster anzuordnen, jedoch zieht ein Fenster in voller Größe an der Performance und ausserdem gab es wohl irgendwelche Probleme dabei, aber frag mich bitte nicht welche das waren.
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.
 

Marek

BeitragDo, Jan 10, 2008 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Probleme stehen schon oben Wink

Man kann das Fenster eben nicht auf die vlle Höhe des Desktops skalieren (d.h. die ClientArea des Fensters...), weder mit WinApi, noch sonstwie. Es bleibt immer ein Streifen (bei mir um die 30-40 Pixel) übrig, der nicht bezeichnet werden kann. Bei der Breite stellt das jedoch kein Problem dar(???)... Wie es mit nur einem Fenster geht, weiß ich schon seit längerem -> Regions (diesmal aber richtig geschrieben^^). Kann man auch mit der blitzsys.dll machen^^

Trotzdem danke Smile
Wer lesen kann ist klar im Vorteil...
 

ChristianK

BeitragDo, Jan 10, 2008 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Windows erlaubt Fenster, die genau so groß sind, wie der Desktop ( mit Rahmen und Titelleiste ). Bei Regions wird der Rahmen aber nicht entfernt, sondern nur unsichtbar gemacht. Deshalb hat man in der Höhe ca. 25 Pixel ( Titelleiste ) und in der Breite etwa 4 Pixel ( Rahmen ), die man nicht nutzen kann. Also dürfte die Breite eigtl. auch nicht ganz stimmen.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Marek

BeitragDo, Jan 10, 2008 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin mir sicher, dass es funktioniert hat... aber das spielt ja jetzt auch nicht grade so die große Rolle; schließlich suchen wir eine Möglichkeit Ein Fenster auf den Desktop zu zaubern(und darauf malen zu können) und nicht ein Bildschirmgroßes Fenster zu erstellen...

Wie gesagt, gefällt mir die Idee von Christian sehr gut, ein rahmenloses Fenster zu erstellen und dann darauf, anstatt auf den Desktop zu zeichen. Allerdings bleibt immer noch die Frage, wie man etwas bestimmtes darauf zeichnet. Meine Idee war, einen Blitz-ImageBuffer zu benutzen, woraufhin Christian meinte, dass es nur per DLL möglich sei, an den DC Wert eines BlitzBildes zu kommen.

Da ich nicht annähernd genügend C/C++ Kenntnisse habe, wäre ich sehr dankbar, wenn mir jemand eine DLL schreiben würde, die (wenn möglich) sowohl ein solches Fenster(am besten natürlich gleich mit dem WindowHandle als Rückgabewert) erstellen, als auch den DC-Wert eines ImageBuffers() herausfinden kann.


MfG Marek
Wer lesen kann ist klar im Vorteil...

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group