Entwickler-Ecke

Multimedia / Grafik - XP Theme nicht auf alles anwenden ?


Blamaster - So 15.02.09 17:51
Titel: XP Theme nicht auf alles anwenden ?
Hi,

ich habe das XPMainfest auf meinem Form. Kann ich es irgendwie hinbekommen, das die Buttons nicht "mitgeskinnt" werden ?

mfg blamaster


Delete - So 15.02.09 18:33

Vielleicht hilft Dir dieser Thread weiter: http://www.delphipraxis.net/topic49515_xp+style+fuer+ein+form+abschaltbar.html [http://www.delphipraxis.net/topic49515_xp+style+fuer+ein+form+abschaltbar.html]

[edit] Oder, um das abzukürzen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
uses UxTheme;

procedure TMyForm.FormCreate(Sender: TObject);
var i: Integer;
begin
  for i  := 0 to Pred(ControlCount) do
    if Controls[i] is TButton then
      SetWindowTheme(TButton(Controls[i]).Handle,'','');
end;
[/edit]


Blamaster - So 15.02.09 22:06

Danke :)

mfg blamaster


Blamaster - So 15.02.09 23:38

Ich habe gerade noch eine neue Frage die etwas in die Richtung geht.

Ich zeichne in meinem Programm auf eine TPaintBox.

Nun ist es so, dass wen ich den XP Style verwende, die Buttons und Checkboxen mitbemalt werden :shock:

Bild dazu im Anhang.

Jemand eine Idee woran dasliegen kann ?

mfg Blamaster


Delete - Mo 16.02.09 14:52

Kannst Du das Programm mal anhängen? Ich kann mir das dann besser vorstellen.


Gausi - Mo 16.02.09 15:04

Liegen die Checkboxen innerhalb der Paintbox? Denn dann liegt das wahrscheinlich daran, dass unter XP diese Controls transparent gezeichnet werden.


Blamaster - Mo 16.02.09 17:35

Hi,

nein leigt außerhalb der Paintbox und ist auch nicht nur bei der ComboBox so sondern auch bei Buttons.

Das Programm anzuhängen wird etwas schwer das es nicht gerade klein ist.

mfg blamaster


jaenicke - Mo 16.02.09 23:33

Kannst du nicht ein kleines Beispiel daraus machen oder in einer Kopie des gesamten Projektes unwichtige Teile löschen oder so?

Meine Vermutung: Du hast irgendwo die PaintBox vor dem Zugriff auf Canvas vergessen oder with entsprechend falsch eingesetzt.
Oder irgendwo an der Botschaftsbehandlung etwas geändert, z.B. via WndProc.

Weil eine PaintBox, XP-Style und weitere Komponenten habe ich auch schon auf einem Formular gehabt, ohne Probleme. Es gibt aber ohne Demo-Programm einfach zu viele Möglichkeiten, was da falsch sein kann. :nixweiss:


Blamaster - Mo 16.02.09 23:56

Hi,

dann poste ich mal die Stellen wo auf die Paintbox gezeichnet wird:


Delphi-Quelltext
1:
  PaintBox.Canvas.StretchDraw(Rect(00, PB.Width, PB.Height), Picture.Graphic);                    



Delphi-Quelltext
1:
2:
3:
4:
  procedure DrawLine(y: integer; PB: TPaintBox; cl: TColor);
  PB.Canvas.Pen.Color := cl;
  PB.Canvas.MoveTo(x, 0);
  PB.Canvas.LineTo(x, PB.ClientHeight);


An weiteren stellen wird auf die Paint Box nicht zugegriffen. An einer Stelle wird noch auf die obere Picture. Graphic gezeichnet.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  Picture: TPicture;

  Picture.Bitmap.Canvas.Brush.Color := clBlack;
  Picure.Bitmap.Canvas.FillRect(Rect(00, Picture.Bitmap.Width, Picture.Bitmap.Height));

    with Picture.Bitmap do begin
      Canvas.MoveTo(i, xx);
      Canvas.Pen.Color := clGreen;
      Canvas.LineTo(i, ht - xx);
    end;


mfg blamaster


jaenicke - Di 17.02.09 00:15

Ok, um zu beweisen, dass das so nix bringt, habe ich extra ein kleines Beispiel mit deinen gepostetetn Zeilen gebastelt. Und wie ich nicht anders erwartet hatte funktioniert das problemlos.

Woran das bei dir liegt, kann ich so nicht sagen. :nixweiss:
Klar ist nur, dass du irgendetwas machen musst, das das verursacht / das Zeichnen verhindert.

Ach ja: Und ein Problem auf deinem PC wäre natürlich theoretisch auch noch denkbar, aber das ist wohl eher unwahrscheinlich.

Um herauszufinden woran das liegt kopiere doch einfach das komplette Projekt (achte auf Verweise in andere Verzeichnisse ggf.) und lösche dann Schritt für Schritt alles unwichtige. Bis das Problem nicht mehr auftritt oder bis du den Rest hier posten kannst.
Oder versuche es in einem neuen Projekt zu reproduzieren.

// EDIT:
Den dritten Quelltext hast du dazueditiert, oder? Der ist hier jetzt nicht drin.


jaenicke - Di 17.02.09 21:56

In der Zwischenzeit habe ich via PN den Quelltext erhalten und ich habe mir das Problem angeschaut.

Das Ergebnis dürfte allgemein interessant sein, deshalb poste ich das einmal hier.

Der Fehler liegt nicht bzw. nicht direkt im (selbst geschriebenen) Quelltext. Aus irgendeinem Grund war das in der kompilierten Exe so, nicht aber, als ich es mit Turbo Delphi / Delphi 2006 kompiliert habe. Da war alles ok.
Daraufhin habe ich es mit Delphi 7 ausprobiert. Und die kompilierte Exe zeigte wieder komische Ränder bei den Buttons.

Ich werde einmal vergleichen und schauen, dass ich das mit Delphi 7 richtig kompiliert bekomme bzw. herausfinde wo der Fehler liegt. Denn eigentlich funktioniert das XP-Manifest ja auch unter Delphi 7. :gruebel:

Du könntest aber zunächst einfach das kostenlose Turbo Delphi [http://www.delphi-library.de/viewtopic.php?p=539975] benutzen, damit funktioniert es einwandfrei unter Vista wie unter XP.


Blamaster - Di 17.02.09 22:05

Hi,

Danke schonmal für die Hilfe und gut zu wissen das es nicht am Code ansich liegt.

mfg Blamaster


jaenicke - Di 17.02.09 22:29

Argh, das liegt an DoubleBuffered. Das funktioniert anscheinend nicht mit Delphi 7 und XP-Style. ich habe gerade nur einen Button aufs Formular und XPMan in die uses gelegt sowie DoubleBuffered in FormCreate auf True gesetzt. Schon dabei tritt das Problem auf.


Delete - Di 17.02.09 22:49

Tatsache, das kann ich bestätigen.


jaenicke - Di 17.02.09 23:58

Ich habe mittlerweile auch herausgefunden woran es liegt und bastele gerade eine Lösung, die durch Ersetzen der entsprechenden Prozedur in TWinControl das Problem behebt. Das Problem ist die Behandlung von WM_ERASEBKGND. In Delphi 7 fehlen da zwei Zeilen Code.


jaenicke - Mi 18.02.09 03:12

So, es genügt, die Unit aus dem Anhang dem Projekt hinzuzufügen. Das behebt das Problem automatisch indem die entsprechenden Botschaftsbehandlungsroutinen von TButton, TWinControl und TButtonControl ersetzt werden.

Die Unit funktioniert natürlich nicht nur für dieses Projekt sondern sollte das Problem allgemein beheben. Bei Buttons und CheckBoxes z.B. habe ich es getestet, sollte es noch bei anderen Komponenten trotzdem auftreten, dann müsste ich das noch ergänzen.


Blamaster - Mi 18.02.09 18:23

Damit funktioniert jetzt alles, kann bis dato auch keine Probleme feststellen.

Vielen Dank dafür :)

mfg Blamaster