Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 19:24

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jul 22, 2010 16:18 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Serv,

ich spiele gerade mit der Funktion des ab Delphi 7 integriertem Theme Manager rum.
Damit kann man die Windows Themes nutzen um selbst z.b. einen Button zu zeichnen, der 1 zu 1 aussieht wie der von Windows.

Das funktioniert mal und mal nicht.

Mit nicht meine ich explit den Alpha Kanal, dieser wird bei manchen Elementen einfach nicht mitgeschickt, zumindest nicht mit TBitmap mit pf32bit Pixeformat.

Ich mach das folgendermassen bisher:

- Gewünschte Grafik komplett in ein RGB32 (pf32bit) TBitmap zeichnen mittels ThemeManager.DrawElement()
- Danach erzeuge ich ein neues Bitmap mit pf24bit und schreibe da nur die "Alpha" werte rein, R, G, B = A. Simple mit Scanline für rgbQuad und rgbTriple.
- Nun Zeichne ich die Grafik in verbindung mit dem erzeugtem Alpha Bitmap über BitBlt Operationen damit die Transparenz erhalten bleibt

Nun ist es so, das mal mein Alpha Bild passt und mal nicht, weil wenn ich direkt die Grafik die über DrawElement gezeichnet wurde in eine Paintbox Zeichne, funktioniert alles wundarbar.

Blöderweise will ich aber das in einem TBitmap haben, weil ich eventuell das Bitmap noch verändern will, Farbe / Alpha Blending etc.

Man kann

Habe das Projekt als Source mal angehängt.

Man sieht es sehr schön wenn man auf die Buttons (Geht / Geht nicht) klickt ;-)

Wenn wer das zum laufen kriegt das die Alpha maske ist immer korrekt ist das wäre echt super.
Ich hab kein plan mehr was falsch sein könnte.

Ist eventuell TBitmap ein falscher Container für DrawElement() in verbindung mit Transparenz ?
Würde CreateCompatibleDC/CreateCompatibleBitmap hier helfen ?

Danke,
Final

*Edit: Unter windows 7 funktioniert das auslesen des Alpha kanals wohl überhaupt nicht :-(
Unter XP funktionieren zumindest ein paar sachen -.-


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 23, 2010 09:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wenn ich mich dabei richtig entsinne, dann dient der Thememanager nur dazu um Elemte zu zeichnen. Also du sagst du möchtest an der Stelle XY einen Button zeichnen. Dann sagst du ThemeManager.DrawElement(Button) auf Form so und so. Und der ThemeManager geht dann her und zeichnet den Button an die entsprechende Stelle. Transparente Bereiche des Buttons werden dabei bereits vom ThemeManager aufgelöst. Also der Alphakanal der in dem grundliegenden Theme liegt wird direkt mit der Zeichenfläche verrechnet. Da gibt es meinem Wissen nach keine Möglichkeit direkt den Alphakanal zu erfragen. Habe mich aber auch noch nicht sooo intensiv damit beschäftigt. Obendrauf kommt auch noch, dass die Windowsdokumentation zu Bitmaps mit Alphakanälen spannend formuliert ist. Teilweise wird was angegeben teils nicht mal ansatzweise.

Entweder solltest du den Thememanager direkt zum Zeichnen benutzen oder aber du könntest auch zwei Varianten der Bilder erzeugen und den Alphakanal so rudimentär wiederherstellen. Hatte mir da vor einer Weile mal was theoretisches überlegt.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 23, 2010 11:32 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Es ist so, das diese Funktion DrawElement() den Alpha Kanal definitiv mitschickt.
Weil wenn du das direkt in eine Paintbox zeichnest ohne umweg über TBitmap dann geht alles wie es soll.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 23, 2010 12:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das habe ich doch gesagt. ;) Die Methode hat den Alphakanal. Keine Frage. Sie reicht den aber nicht raus sondern verrechnet ihn nur beim Zeichnen. Das Zeichnen von transparenten Elementen läuft vom Prinzip her immer so, dass der Untergrund kopiert wird, dann das Bild reingeblendet wird und anschließend wird das dann auf Zielplatz gezeichnet. Deswegen landen auf dem Form Transparenzen wärend du in deinem Bitmap nur die Verrechnung mit deiner Hintergrundfarbe hast. Das ist vergleichbar wie das normale Blending von OpenGL. Im Framebuffer landet eigentlich immer das Bild was bereits fertig geblendet wurde.

Das System ist primär dafür ausgelegt etwas auf den Bildschirm zu zeichnen. Habe mal fix mal in MSDN geschaut. Unter Vista+ gibt es wohl GetThemeBitmap. Schaut ganz gut aus, wenn ich das richtig verstanden habe. Allerdings geht das nicht für XP. Da hatte ich die Möglichkeiten oben schon aufgeführt.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jul 24, 2010 21:01 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ok das die Funktion das nur Zusammen Rechnet dachte ich anfangs auch.
Aber warum bekomm ich aber dann mal eine Alphamaske und mal nicht ?

Habe etwas ausprobiert werde aber daraus nicht schlau:

Ich habe mir eine Klasse gebastelt die ein 32 bit DIB erzeugt, also ein direkter TBitmap ersatz und
habe in diese Klasse mal das jeweilige Theme Bild rein zeichnen lassen.

Damit funktioniert das unter XP SP2 (Dev VM Machine) nur das Bild mit dem Radio button.
Das andere bild die Bar der Trackbar geht nicht.

Exakt umgekehrt ist es mit TBitmap, damit funktioniert die Trackbar, aber der Radiobutton nicht O_o

Und die Alpha masken sind bei beiden immer invertiert.

Bei TBitmap ist Schwarz Sichtbar, bei meiner Klasse ist Weiss Sichtbar.

Das muss doch irgendwie für jedes Bitmap funktionieren ?

Ich verstehe nicht warum es mit manchen bilder geht und mit manchen nicht.

Achja unter Windows 7 tut meine Klasse immer, nur unter XP ist das problem!

Allerdings ist der Alpha Kanal invertiert, somit muss ich bei meiner methode die alpha maske invertiert ausgeben.
Das liegt aber auch an meiner Transparent Zeichnen funktion die mittels BitBlt die Alpha Maske und Image Maske auf das Canvas zeichnet.

Hättest du keine idee warum das nicht geht ?

Habe nochwas ausprobiert.

Tue ich in meiner bitmap klasse den alpha wert für jeden pixel auf 255 vor initialisieren, also alles weiss,
dann ist es exakt so wie bei TBitmap.

Ihh versteh dat nimma... -.-

Ich will ha eigentlich nur das gerenderte Bild zwischenspeichern und dann weiterverarbeiten.
Sosagen ein Canvas ohne direkte Ausgabe.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jul 24, 2010 23:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Laut Spezifikation ist das Ganze aber nur ein Zeichnen auf einen DC. Alles was darüber hinaus geht ist nicht spezifiert. Ob du da jetzt Alphawerte bekommst oder nicht ist meiner Meinung nach vollkommene Ermessenssache des jeweiligen Systems und der Situation. Oder anders. Pures Glück, dass es jetzt funktioniert. Und wie ich oben schon mal gesagt habe ist der Alpha Kanala in der Windowsapi abenfalls nicht komplett durchspezifiziert.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jul 25, 2010 09:46 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Hmm, also sprich das was ich vorhatte, Themebilder zwischenzuspeichern, dann zu bearbeiten, und dann bei bedarf zeichnen mit transparenz klappt nicht, zumindest unter XP.

Dann muss ich wohl oder übel das direkt bei Paint dann einbauen und danach direkt den Canvas verändern.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]