ausm Theme Manager:
Delphi-Quellcode:
unit XPStatusBar;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, ComCtrls;
type
TXPStatusBar =
class(TStatusBar)
private
{ Private declarations }
procedure WMEraseBkgnd (
var Message : TWMEraseBkgnd);
message WM_ERASEBKGND;
procedure WMSize (
var Message : TWMSize);
message WM_SIZE;
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
uses
ThemeSrv, TMSchema, UxTheme;
procedure Register;
begin
RegisterComponents('
Samples', [TXPStatusBar]);
end;
procedure TXPStatusBar.WMSize (
var Message : TWMSize);
begin
inherited;
Invalidate;
end;
procedure TXPStatusBar.WMEraseBkgnd (
var Message : TWMEraseBkgnD);
var
hhTheme : HTHEME;
DrawRect : TRect;
begin
hhTheme:= 0;
if ThemeServices.ThemesEnabled
and not (csDesigning
in ComponentState)
then
hhTheme:= OpenThemeData(0,'
Status');
if (hhTheme <> 0)
then
try
DrawRect:= ClientRect;
DrawThemeBackground(hhTheme,
Message.DC, 0, 0, DrawRect,
nil);
finally
CloseThemeData(hhTheme);
Message.Result:= 1;
end else
inherited;
end;
Die WMEraseBkgnd Funktion ist hier richtig, die WMSize allerdings nicht. Würde man die korrigieren, wäre es perfekt. Das würde ich hinkriegen. [<<< variante 1]
Oder man könnte die WMEraseBkgnd Funktion daraus übernehmen. Das ist würde ich allerdings nichtmehr so schnell hinkriegen, weil ich bei den Funktionen, auf die sich WMEraseBkgnd beruft, und auf die Funktionen, auf die sich diese wiederum berufen, nicht so ganz durchblicke. Das ist alles ein bisschen verwirrend. Vor allem, wenn ich so was lese:
Delphi-Quellcode:
var
DrawThemeBackground: function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect;
pClipRect: PRECT): HRESULT; stdcall;
{$EXTERNALSYM DrawThemeBackground}
kann ich nur noch HÄH sagen. Was macht denn der Code? Und insbes. EXTERNALSYM? Da hab ich keine Ahnung von. Weil du aber den WMSize Codes hattest, habe ich gehofft, du hättest auch irgendwo den passenden WMEraseBkgnd-Code rumfliegen. Anscheinende aber nicht. Also muss ich wohl doch Variante 1 nehmen, ohne zu verstehen, warum und wie sie funktioniert!