Entwickler-Ecke

Windows API - PageControl: Color aus Windows


delphijanka - Fr 04.09.09 10:56
Titel: PageControl: Color aus Windows
Hello.

Bei PageControl wird standartmäßig eine Farbe benutzt, die man so direkt in der Farben-Palette von Delphi nicht auswählen kann. Die Farbe erhalt auch die aktive Tab des Pagecontrols. Diese Farbe ist je nach style anders - und die muss ich irgendwie auslesen. Weiss jemand die entsprechende API-Funktion dafür?

Danke.


Delete - Fr 04.09.09 11:25

So vielleicht?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function GetPageControlColor(const pg: TPageControl): TColor;
var aDC: hDC;
    aCanvas: TCanvas;
begin
  Result := clBlack;
  aDC := GetWindowDC(pg.Handle);
  if aDC <> 0 then
    try
      aCanvas := TCanvas.Create;
      try
        aCanvas.Handle := aDC;
        Result := aCanvas.Pixels[5,5];
      finally
        aCanvas.Free;
      end;
    finally
      ReleaseDC(pg.Handle,aDC);
    end;
end;


Andreas L. - Fr 04.09.09 13:23

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
So vielleicht?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function GetPageControlColor(const pg: TPageControl): TColor;
var aDC: hDC;
    aCanvas: TCanvas;
begin
  Result := clBlack;
  aDC := GetWindowDC(pg.Handle);
  if aDC <> 0 then
    try
      aCanvas := TCanvas.Create;
      try
        aCanvas.Handle := aDC;
        Result := aCanvas.Pixels[5,5];
      finally
        aCanvas.Free;
      end;
    finally
      ReleaseDC(pg.Handle,aDC);
    end;
end;


Aber unter XP/Vista/7 mit aktivierten Themes ist auf dem PageControl ein Farbverlauf zu sehen. Je nachdem für was der Code gebraucht wird, reicht diese eine Farbe evtl. nicht aus. Was genau will du (delphijanka) denn mit der Farbe machen?


delphijanka - Fr 04.09.09 13:54

user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
Aber unter XP/Vista/7 mit aktivierten Themes ist auf dem PageControl ein Farbverlauf zu sehen. Je nachdem für was der Code gebraucht wird, reicht diese eine Farbe evtl. nicht aus. Was genau will du (delphijanka) denn mit der Farbe machen?

Ich habe leider kein Vista, kannst du bitte ein Screenshot machen, wie es mit dem Farbverlauf aussieht? Ich wäre echt dankbar. Denn dadurch würden sich vlcht die Anforderungen an mich ändern bzw ich einen anderen Lösungsweg nehmen würde.

Moderiert von user profile iconNarses: Zitat kenntlich gemacht.


Delete - Fr 04.09.09 14:32

Ich habe die Funktion unter Vista geschrieben, da war von einem Farbverlauf aber nichts zu entdecken.


Andreas L. - Fr 04.09.09 14:42

Ja, hab mich getäuscht, unter Vista gibts keinen Verlauf. Aber unter XP: http://www.bychoice.com/windows_xp_theme.jpg RGB(252,252,254) > RGB(244,243,238)


Delete - Fr 04.09.09 14:50

Na gut, aber besonders extrem ist der nicht. Es kommt halt darauf an, wozu man die Farbe braucht, vielleicht kann man ja auch den Bereich, auf den es ankommt, aus dem Canvas herauskopieren. Aber ohne den Zweck der Übung zu kennen, kann man da nicht viel dazu sagen.


delphijanka - Fr 04.09.09 16:30

Schaut mal das Bild von Andreas L.:

Die Panel, auf der sich der Pfeil ist bzw der Text "A theme is a background..." - genau diese Farbe brauche ist - also etwas denkler als weiß. Wie kann ich diese ermitteln?


Andreas L. - Fr 04.09.09 16:55

user profile icondelphijanka hat folgendes geschrieben Zum zitierten Posting springen:
Schaut mal das Bild von Andreas L.:

Die Panel, auf der sich der Pfeil ist bzw der Text "A theme is a background..." - genau diese Farbe brauche ist - also etwas denkler als weiß. Wie kann ich diese ermitteln?


Sollte mit DeddyHs Code klappen, evtl. die Koordinaten noch ein bisschen anpassen:

Delphi-Quelltext
1:
aCanvas.Pixels[5,5];                    


jaenicke - Fr 04.09.09 19:14

Ich nehme einmal an der vorgesehene Weg über GetSysColor funktioniert auch, auch wenn ich jetzt die Liste nicht näher angeschaut habe:
http://msdn.microsoft.com/en-us/library/ms724371.aspx


Delete - Fr 04.09.09 19:21

Auch GetSysColor dürfte keine Farbverläufe zurückgeben.


delphijanka - Di 08.09.09 13:58

Ich habe alle Konstanten dort ausprobiert, und keine Farbe passt.

Ich verdeutliche noch mal: ich brauche die Farbe der Fläche des aktiven Tabs im PageControl.

Danke, dass ihr mir hilft.


Delete - Di 08.09.09 14:24

Und was passt Dir an meinem Code nicht? Du kannst die Koordinaten ja noch anpassen (z.B. auf die Mitte des Tabsheets).


delphijanka - Mi 09.09.09 14:45

@Deddy:

Warum bekomme ich mit deiner Funktion die schwarze Farbe, obwohl meine Tabs grau-blau sind?


Delete - Mi 09.09.09 14:52

Das kann ich Dir aus der Ferne auch nicht sagen. Bist Du einmal durchgesteppt, um zu sehen, wo die Funktion evtl. aussteigt? Übrigens kannst Du den Funktionskopf von TPageControl auf TTabSheet ändern und dann das aktive Tabsheet übergeben.


delphijanka - Mo 28.09.09 15:32

Ich habe das Problem hinbekommen:

Das Ablesen der Farbe soll frühestens bei OnActivate stattfinden, weil die Farbe der PageControl-Componente von schwarz zu weiss/hellblau erst nach OnShow aktualisiert wird. Ich habe bei OnActivate sogar noch "Refresh" vor dem Ablesen der Farbe aufgerufen, weil sonst die Farbe falsch ist.