![]() |
Header Übersetzung (von C++ nach Delphi)
Moin,
Ich arbeite ja, wie jemand vielleicht aus dem OpenDialog-Thread weiß, an einer Möglichkeit, das Arbeiten mit dem BDS 2006 unter Vista zu optimieren. Ich habe mittlerweile die Möglichkeit eine Form Glass-mäßig darzustellen und das funktioniert auch soweit, nur habe ich das Problem, dass alle Controls die über diesem Bereich sind in ihren schwarzen Elementen (Schrift, zb.) ebenfalls aus Glass bestehen. Daniel zeigt in seinen Videos, dass man nur DoubleBuffered auf True setzen muss, nur scheint das unter Delphi 2006 nicht zu funktionieren, also machte ich mich auf die Suche (in C++, denn in Delphi existiert sehr wenig zu dem Thema). Ich fand 2 Möglichkeiten, die erste hat mit Layered Windows zu tun und die zweite mit einem Offscreen Bitmap. Also gut, das zweite hört sich ja schon schwer nach DoubleBuffered an und Layered Windows sind für diesen Zweck imho ein wenig übertrieben. Ich bin mittlerweile (auch auf Basis eines C++ Codes) so weit (der folgende Code wird per Hook auf die Zeichenroutine des Button1 aufgerufen):
Delphi-Quellcode:
Also gut, das sollte irgendwie funktionieren, aber ich brauche ja noch die korrekten Header für die Funktionen, und die (und ich denke dort hapert es) habe ich so realisiert:
var
DC, MemDC: HDC; PS: TPaintStruct; PaintBuffer: HPAINTBUFFER; begin if (Message.Msg = WM_PAINT) then begin DC := BeginPaint(Button1.Handle, PS); try PaintBuffer := BeginBufferedPaint(DC, PS.rcPaint, BPBF_COMPOSITED, nil, MemDC); Perform(WM_ERASEBKGND, MemDC, MemDC); Perform(WM_PRINTCLIENT, MemDC, PRF_CLIENT); BufferedPaintMakeOpaque(PaintBuffer, @PS.rcPaint); EndBufferedPaint(PaintBuffer, True); finally EndPaint(Button1.Handle, PS); end; end; end;
Delphi-Quellcode:
Die Funktionen bekomme ich so (in der Form-Create Routine):
HPAINTBUFFER = LongWord;
BP_BUFFERFORMAT = (BPBF_COMPATIBLEBITMAP, BPBF_DIB, BPBF_TOPDOWNDIB, BPBF_TOPDOWNMONODIB); BP_PAINTPARAMS = packed record cbSize: DWORD; dwFlags: DWORD; prcExclude: PRect; pBlendFunction: PBLENDFUNCTION; end; TBeginBufferedPaint = function(hdcTarget: HDC; const prcTarget: TRECT; dwFormat: BP_BufferFORMAT; pPaintParams: Pointer; phdc: HDC): HPAINTBUFFER; stdcall; TBufferedPaintMakeOpaque = procedure(fParam: HPAINTBUFFER; sParam: PRECT); stdcall; TEndBufferedPaint = function(hBufferedPaint: HPAINTBUFFER; fUpdateTarget: Boolean): HRESULT; stdcall;
Delphi-Quellcode:
Ich bekomme irgendwann (leider sagt mir der Debugger nicht wann und Breakpoints nutzen irgendwie auch nicht wirklich was) eine Acess Violation. Jetzt ergeben sich folgende Fragen:
huxTheme := LoadLibrary('uxtheme.dll');
if huxTheme <> 0 then begin BeginBufferedPaint := GetProcAddress(huxTheme, 'BeginBufferedPaint'); BufferedPaintMakeOpaque := GetProcAddress(huxTheme, 'BufferedPaintMakeOpaque'); EndBufferedPaint := GetProcAddress(huxTheme, 'EndBufferedPaint'); end;
Danke schonmal! Grüße, ein, etwas verwirrter :mrgreen: , Max |
Re: Header Übersetzung (von C++ nach Delphi)
Moin,
Der Vollständigkeit halber gebe ich mir jetzt mal selbst die Antwort(en). ;) Zitat:
Folgende Änderungen sind dem obigen Code hinzuzufügen:
Delphi-Quellcode:
Button1.Perform(WM_ERASEBKGND, MemDC, MemDC);
Button1.Perform(WM_PRINTCLIENT, MemDC, PRF_CLIENT);
Delphi-Quellcode:
Dann sollte es funktionieren. Achja, BufferedPaintMakeOpaque ist gleichbedeutend mit BufferedPaintSetTransparent (nur mit dem Startvalue 255 bei Alpha). Also stattdessen diese Methode benutzen, dabei spart man sich etwas Arbeit.
HPAINTBUFFER = THandle; // Irgendwie "richtiger"
TBeginBufferedPaint = function(hdcTarget: HDC; const prcTarget: TRECT; dwFormat: BP_BufferFORMAT; pPaintParams: Pointer; out phdc: HDC): HPAINTBUFFER; stdcall; // Blöder Fehler.. Wegen "out". Grüße, Max |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz