AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Die StatusBar und Windows XP

Ein Thema von nailor · begonnen am 9. Dez 2003 · letzter Beitrag vom 14. Dez 2003
Antwort Antwort
Seite 3 von 3     123   
Kamil

Registriert seit: 17. Aug 2002
178 Beiträge
 
#21

Re: Die StatusBar und Windows XP

  Alt 14. Dez 2003, 20:06
Damit die StatusBar auch so aussieht wie sie unter XP aussehen sollte, musst du auch die WM_ERASEBKGND Nachricht behandeln. Schau dir mal den Unterschied an.
Miniaturansicht angehängter Grafiken
statusbar.gif  
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

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

Re: Die StatusBar und Windows XP

  Alt 14. Dez 2003, 20:09
So, hab mir nochmal ein bisschen mehr Mühe gegeben. Der folgende Code erzeugt jetzt eine Statusbar im WindowsXP-Stil.
Die "echte" WinXP-Statusbar hat noch einen 3D-Effekt, aber mir persönlich reicht es so, ...

... weil: man jetzt im Gegensatz zu vorher nicht mehr entweder ganz auf das XP-Design verzichten muss, oder schmierende Komos in Kauf nehmen muss.

Delphi-Quellcode:
unit uTWinXPStatusBar;

interface

uses ComCtrls, Messages, Windows;

type
  TWinXPStatusBar = class(TStatusBar)
    procedure WMSize (var Message: TWMSize);
      message WM_SIZE;
  end;

implementation

{$R design.res} // die WindowsXP-Manifest-Datei

// frei nach Kamil:
procedure TWinXPStatusBar.WMSize (var Message: TWMSize);
var
  rect: TRect;
begin
  inherited;
  rect := ClientRect;
  InvalidateRect(handle, @rect, true);
end;

end.
Die Handhabung ist genau gleich der, der original Statusbar.
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
Benutzerbild von nailor
nailor

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

Re: Die StatusBar und Windows XP

  Alt 14. Dez 2003, 20:17
Zitat von Kamil:
Damit die StatusBar auch so aussieht wie sie unter XP aussehen sollte, musst du auch die WM_ERASEBKGND Nachricht behandeln. Schau dir mal den Unterschied an.
hab meinen vorigen Post verfasst, bevor ich das gelesen habe. Ja, wenn man den ERASE-Message-Handler auch noch umbiegt, dann dürfte man auch den 3D-Effekt wieder haben.
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
Benutzerbild von nailor
nailor

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

Re: Die StatusBar und Windows XP

  Alt 14. Dez 2003, 20:42
Von alleine werde ich das aber nicht hinkriegen. Und das aus dem Theme Manager kapier ich auch nicht so ganz. Das ist mir auch eine Nummer zu verworren...

Mir fallen grade zwei Möglichkeiten ein, die funktionieren dürften:

1) Ich bastel das von dir in den Theme Manager - Code ein
2) Du bastelst den Theme Manager - Code zum Thema WM_ERASEBKGND zu deinem anderen Code dabei

Alternative eins werde ich auf jeden Fall mal machen, und Nummer zwei kannst du gerne machen, wenn du willst...
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
Kamil

Registriert seit: 17. Aug 2002
178 Beiträge
 
#25

Re: Die StatusBar und Windows XP

  Alt 14. Dez 2003, 20:53
Ähm, was meinst du? Hab deinen letzten Beitrag nicht kapiert. Ich hab mir den ThemeManager noch nie angeschaut und verwende ihn auch nicht.
  Mit Zitat antworten Zitat
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
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz