Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - WinXP Style


F34r0fTh3D4rk - Do 07.04.05 15:17
Titel: WinXP Style
hallo

wie kann ich das windows XP in meiner anwendung nutzen, ist der style schon bei einer delphi version mit dabei, also wird das programm im winXP style angezeigt ?

ich finde die buttons und progressbars bei windows xp nämlich sehr hübsch ^^

sollte aber möglichst elegant sein und keine nachteile mit sich bringen ^^


danke


jaenicke - Do 07.04.05 15:22

In der Komponentenpalette unter Win32 befindet sich die Komponente XPManifest. Die aufs Formular tun und fertig.

Die funktioniert so:
Durch das einbinden der Unit wird auch die darin eingebundene Ressource eingebunden. Darin ist ein Manifest enthalten, welches den XP-Stil auslöst.

Aber das hatten wir schon ein paarmal hier im Forum, die Frage... :roll:

Beispiel:
http://www.delphi-forum.de/viewtopic.php?t=31577&highlight=manifest
Da gehts genau um dasselbe...


F34r0fTh3D4rk - Do 07.04.05 15:24

ich habe die komponente aber leider net :lol:


Delete - Do 07.04.05 15:57

Man muss vermutlich schon ziemlich dumm sein und den XML-Code im gelinkten Beitrag von jaenicke nicht sehen. Diese XML-Datei wird mit dem Namen der Anwendung und der zusätzlichen Endung ".manifest" im Ordner des Programms gespeichert, also bspw.

Quelltext
1:
Project1.exe.manifest                    

und voilà: Die Anwendung benutzt unter Windows XP das Luna-Design. :roll:


F34r0fTh3D4rk - Do 07.04.05 17:16

ja nee, aber ich meine damit, dass sowas wie:
Zitat:

Macht das aber nicht mit Delphi 6 (oder früher), denn dann können die erzeugten Programme, die eine TImageList benutzen, nicht mehr unter Win9x/ME/NT/2k ausgeführt werden, weil die ImageList Daten im ComCtrl32 Version 6 Format gespeichert sind.

nicht auftritt :twisted:

selber dumm ^^


CrazyLuke - Do 07.04.05 18:24

Hi!

Wie siehts denn unter 2005 PE aus? Was muss ich machen, damit da der XP-Style unterstützt wird? Denn sowohl die importierten Projekte als auch Delphi selber sieht aus wie ein mit Delphi 6 erstelltes Programm, d.h. bis auf den Rahmen und den helleren Grauton im Hintergrund ist nix luna-like...

Ich dachte, 2005 unterstützt das automatisch?

MfG
CrazyLuke


wulfskin - Do 07.04.05 19:46

Hast du die Komponenten XPManifest auf dem Formular wie oben beschrieben? :evil: :roll:


CrazyLuke - Do 07.04.05 20:15

Oh, so umständlich? Ich hab gedacht, da XP schon so lange auf dem Markt ist, wird Delphi das schon standardmäßig unterstützen. Ich hatte gar niocht erst nach so ner Komponente geguckt, sondern bin die ganzen Delphi-Prtogrammoptionen durchgegangen, ob da was fälschlicherweise aktiviert oder deaktiviert sei...

Na dann okay, es klappt :)

MfG
CrazyLuke


F34r0fTh3D4rk - Sa 09.04.05 18:07

weiterer nachteil, ich muss die manifest datei immer mit reinpacken, und einbinden funzt auch net, ich könnte sie natürlich der ressource hinzufügen und dann wieder entpacken und wenn das programm beendet ist löschen, müsste ich aber vorher abfragen, ob das system winxp ist, so hätte ich für jede version immer das korrekte design, aber geht das net auch einfacher ?


Stefan-W - Sa 09.04.05 18:38

wenn du die Oben beschriebene Komponente nimmst geht das alles von alleine...
dh, nur die Kompo aufs Form ziehen und das sieht bei XP nach XP aus und sonst halt wie das Normale Win


F34r0fTh3D4rk - Sa 09.04.05 19:10

hab aber die project1.exe.manifest datei, wird die automatisch benutzt, wenn ich die einbinde, weil sonst habe ich je die option, die nur auszupacken, wenn es sich um winXP handelt


F34r0fTh3D4rk - Sa 09.04.05 19:34

also, ich hab das jetzt so gemacht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
implementation

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

function IsXP: boolean;
begin
  result:= false;
  if Win32MinorVersion = 1 then
    result:= true;
end;

function ExtractResTo(Instance: LongWord; BinResName, NewPath, ResType: PChar): Boolean;
var
  ResSize,
  HG,
  HI,
  SizeWritten,
  hFileWrite: LongWord;
begin
  result := false;
  HI := FindResource(Instance, BinResname, ResType);
  if HI <> 0 then
    begin
      HG := LoadResource(Instance, HI);
      if HG <> 0 then
        begin
          ResSize := SizeOfResource(Instance, HI);
          hFileWrite := CreateFile(NewPath, GENERIC_READ or GENERIC_WRITE,
            FILE_SHARE_READ or FILE_SHARE_WRITE, nil, CREATE_ALWAYS,
            FILE_ATTRIBUTE_ARCHIVE, 0);
          if hFileWrite <> INVALID_HANDLE_VALUE then
            begin
              result := (WriteFile(hFileWrite, LockResource(HG)^, ResSize,
                SizeWritten, niland (SizeWritten = ResSize));
              CloseHandle(hFileWrite);
            end;
        end;
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if IsXP then
  if ExtractResTo(hInstance, 'XPStyle''Project1.exe.manifest', RT_RCDATA) then
    showmessage('XP-Style aktiv!');
end;

meine .rc datei sieht so aus:

Quelltext
1:
XPStyle BINRES "Project1.exe.manifest"                    

dementsprechend ist auch die manifest datei in der ressource, aber das entpacken schlägt fehl warum ? kann ich die datei dann im onclosequery wieder löschen ?


Popov - Sa 09.04.05 20:07

Ich hab schon etwas in einem anderem Beitrag dazu geschrieben. Da hab ich auch ein kleinen Tool von mir veröffentlicht, mit dem es möglich ist solche Manifest Ressourcen zu erstellen.

Hier ist der Beitrag dazu. Es enthällt auch das Programm:

http://www.delphi-forum.de/viewtopic.php?p=237911#237911


F34r0fTh3D4rk - Sa 09.04.05 20:10

ich hab ja eine manifest datei, sie ist auch in der ressource, es funzt aber net, und extrahieren geht auch net :?


Sprint - Sa 09.04.05 20:19

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
also, ich hab das jetzt so gemacht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function IsXP: boolean;
begin
  result:= false;
  if Win32MinorVersion = 1 then
    result:= true;
end;


Ob es sich um Windows XP handelt, würde ich eher so prüfen:

Delphi-Quelltext
1:
2:
3:
4:
function IsWinXP: Boolean;
begin
  Result := (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion = 5and (Win32MinorVersion = 1);
end;


Popov - Sa 09.04.05 21:18

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
ich hab ja eine manifest datei, sie ist auch in der ressource, es funzt aber net, und extrahieren geht auch net :?


Was meinst du mit Extrahieren? Die Ressource muß nur eingebunden sein und nichts mehr. Das System liest das Programm und prüft ob die Manifest Ressource drinn ist. Wenn ja, dann wird sie gelesen und fertig. Du mußt nichts machen. Mit dem Einbinden der Ressource ist deine Arbeit erledigt. Und wenn es nicht funzt, dann hast du die Ressource falsch gemacht.


Popov - Sa 09.04.05 21:26

Ich hab mir die Beiträge oben noch einmal durchgelesen. Also das ist doch nicht euer Ernst was ihr da macht, oder? Ihr packt das in die Ressource und dann entpackt ihr das? Also Mathias hat das schon so nett beschrieben:

MathiasSimmack hat folgendes geschrieben:
Man muss vermutlich schon ziemlich dumm sein ...


Anstelle das umzusetzten was man euch hier sagt, werden hier Konstruktionen gebastelt die geradezu lächerlich sind. Die Ressource Manifest Datei wird nicht entpackt.


F34r0fTh3D4rk - So 10.04.05 14:57

es geht ja darum, das das programm auch unter win98 und co läuft tut es das denn ?


wulfskin - So 10.04.05 15:29

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
es geht ja darum, das das programm auch unter win98 und co läuft tut es das denn ?
Ja, das Betriebsystem weiss ja nichts von alle dem und macht deshalb auch nichts damit. Nur WinXP sucht nach der Resource und verarbeitet die wenn nötig.
Logisch, oder?

Achja: Deine Fragestellungen sind so unpräzise, dass deshalb eine riesen Verwirrung entstanden ist. :(


F34r0fTh3D4rk - So 10.04.05 15:30

dann kann ich ja unbesorgt sein, danke :D


Popov - So 10.04.05 16:33

Lern zu verstehen um was es geht. Jedes Windows hat eine comctl32.dll, die das Design das Windows bestimmt. In der Regel ist es der typisch graue 3D Design. Das hat jedes Windows.

Windows XP hat zusätzliche comctl32.dll Dateien mit anderen Designs in extra Ordnern. Zu finden sind die im WinSxS Ordner im Windows Verzeichnis. Findet ein Programm eine Manifest Datei, dann prüft er ob die passende comctl32.dll zu finden ist. Welche die Passende Datei ist, daß steht in der Manifest Datei:

Zitat:
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" />


Aus diesen Angaben kann Windows die richtige comctl32.dll Datei ermitteln. Zu den oberen Angaben wäre das dann dieser Ordner:

Zitat:
c:\windows\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.0.0_x-ww_1382d70a


Wie du siehst wird kein Design angespeichert, sondern lediglich über das Manifest zugeteilt.