Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Die StatusBar und Windows XP (https://www.delphipraxis.net/13017-die-statusbar-und-windows-xp.html)

nailor 9. Dez 2003 15:34


Die StatusBar und Windows XP
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe das Windows-XP-Design über das Manifest aktiviert, alles klappt wunderbar, und dann passiert das: [siehe Bild]!!!

Kann mir wer sagen, warum das so verschmiert, und wie man das wegbekommt?!?!

nailor 13. Dez 2003 18:58

Re: Die StatusBar und Windows XP
 
*push*

hat nicht irgendwer ne ahnung???

CalganX 13. Dez 2003 19:00

Re: Die StatusBar und Windows XP
 
Hi,
versuch es mal mit dem ThemeManager von Mike Lischke (unter http://www.delphi-gems.com)!

Chris

nailor 13. Dez 2003 19:06

Re: Die StatusBar und Windows XP
 
dieser link tut nicht! Jedenfalls kann lädt sich keine Seite.

Was könnte ich damit dann machen?

CalganX 13. Dez 2003 19:10

Re: Die StatusBar und Windows XP
 
Hi,
es einfach nochmal versuchen. Denn bei mir geht alles.

Chris

phlux 13. Dez 2003 19:35

Re: Die StatusBar und Windows XP
 
Die Site scheint im moment arge Probleme zu haben, ich krieg lauter php Fehler :pale:

nailor 13. Dez 2003 19:44

Re: Die StatusBar und Windows XP
 
bei mir antwortet der server nichtmal

Dagon 13. Dez 2003 19:48

Re: Die StatusBar und Windows XP
 
Merkwürdiger Weise lief si vor ein paar Minuten noch. Jetzt kommen bei mir auch PHP Fehler. :?

nailor 13. Dez 2003 19:51

Re: Die StatusBar und Windows XP
 
so ein bisschen geht die Seite jetzt, und von dem was ich gesehen habe her, kann ich sagen, dass das nicht das ist was ich eigentlich haben will. Mir wäre eine Fehlerkorrektur viel lieber als ein komplettes WorkAround

Kamil 14. Dez 2003 00:17

Re: Die StatusBar und Windows XP
 
So wird die StatusBar unter XP richtig dargestellt:
Die benötigten Units gibt's bei http://www.delphi-gems.com
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;

nailor 14. Dez 2003 00:50

Re: Die StatusBar und Windows XP
 
OK, OK, OK, ich werds mir mal anschauen, auch wenns keine "saubere Lösung" ist...

Delphi-Quellcode:
procedure Register;
begin
  RegisterComponents('Samples', [TXPStatusBar]);
end;
sieht verdächtig danach aus, dass auch noch eine zusätzliche Kompinente installiert wird. Gibts ne Möglichkeit das zu vermeiden? Dass die Kompo also nicht in die Delphi-IDE integriert wird, ich sie aber per Create... dennoch verwenden kann?

Kamil 14. Dez 2003 00:55

Re: Die StatusBar und Windows XP
 
Zitat:

Zitat von Nailor
OK, OK, OK, ich werds mir mal anschauen, auch wenns keine "saubere Lösung" ist...

Was ist da nicht "sauber"????

Zitat:

Zitat von Nailor
sieht verdächtig danach aus, dass auch noch eine zusätzliche Kompinente installiert wird.

Stimmt.
Zitat:

Zitat von Nailor
Gibts ne Möglichkeit das zu vermeiden?
Dass die Kompo also nicht in die Delphi-IDE integriert wird, ich sie aber per Create... dennoch verwenden kann?

Einfach die Register Prozedur auskommentieren.

nailor 14. Dez 2003 00:58

Re: Die StatusBar und Windows XP
 
Falls sich delphi-gems mal wieder entschließt zu kalppen, schau ich mir das mal an!

Die Muhkuh 14. Dez 2003 08:04

Re: Die StatusBar und Windows XP
 
Zitat:

Zitat von Nailor
Falls sich delphi-gems mal wieder entschließt zu kalppen, schau ich mir das mal an!


Jo jetzt gehts wieder!

nailor 14. Dez 2003 17:55

Re: Die StatusBar und Windows XP
 
Liste der Anhänge anzeigen (Anzahl: 2)
so, bin jetzt soweit, wie auf dem Bild / meiner Demo-App zu erkennen ist:

nailor 14. Dez 2003 17:58

Re: Die StatusBar und Windows XP
 
Liste der Anhänge anzeigen (Anzahl: 1)
hier nochmal, wie ich es haben will

Kamil 14. Dez 2003 18:12

Re: Die StatusBar und Windows XP
 
Bei mir wird es so angezeigt wie du es haben willst.

nailor 14. Dez 2003 18:19

Re: Die StatusBar und Windows XP
 
du musst das Fenster schmaler machen (in y-Richtung verkleinern). Dann gibts nen Fehler.

Ich werde dem Typen von Delphi-Gems mal schreiben!

Kamil 14. Dez 2003 19:03

Re: Die StatusBar und Windows XP
 
Hast recht! Hier die Lösung:
Delphi-Quellcode:
procedure TXPStatusBar.WMSize (var Message : TWMSize);
var
  Rect: TRect;
begin
  inherited;
  Rect:=ClientRect;
  InvalidateRect(Handle, @Rect, true);
  Invalidate;
end;

nailor 14. Dez 2003 19:45

Re: Die StatusBar und Windows XP
 
dankedankedanke! :hello: :hello: :hello: :thuimb: :thuimb: :thuimb: :dp: :firejump: :firejump: :party: :dancer: :dancer2: :bouncing4: :bounce1:


Naja, jedenfalls der folgende Code macht unter Windows-XP eine funktionierende StatusBar:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Messages, Forms, ComCtrls, Windows;

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

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
{$R design.res}

procedure TMyStat.WMSize (var Message : TWMSize);
var
  Rect: TRect;
begin
  inherited;
  Rect:=ClientRect;
  InvalidateRect(Handle, @Rect, true);
  Invalidate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.InsertControl(TMyStat.Create(Form1));
end;

end.
könnte man auch in die Code-Lib hauen!

Kamil 14. Dez 2003 20:06

Re: Die StatusBar und Windows XP
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

nailor 14. Dez 2003 20:09

Re: Die StatusBar und Windows XP
 
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.

nailor 14. Dez 2003 20:17

Re: Die StatusBar und Windows XP
 
Zitat:

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.

nailor 14. Dez 2003 20:42

Re: Die StatusBar und Windows XP
 
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...

Kamil 14. Dez 2003 20:53

Re: Die StatusBar und Windows XP
 
Ähm, was meinst du? Hab deinen letzten Beitrag nicht kapiert. Ich hab mir den ThemeManager noch nie angeschaut und verwende ihn auch nicht.

nailor 14. Dez 2003 21:42

Re: Die StatusBar und Windows XP
 
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!


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:59 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 by Thomas Breitkreuz