Einzelnen Beitrag anzeigen

Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#26

Re: Die StatusBar und Windows XP

  Alt 14. Dez 2003, 21:42
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!
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat