Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   nonVCL TabControl Hintergrundfarbe ändern (https://www.delphipraxis.net/158591-nonvcl-tabcontrol-hintergrundfarbe-aendern.html)

lbccaleb 23. Feb 2011 11:35

nonVCL TabControl Hintergrundfarbe ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe ein TabConntrol nonVCL erstellt und bekomme einfach den Hintergrund nicht angepasst. Probiere nun schon ewig rum und bin am verzweifeln :(

Bei mir bleibt der Hintergrund immer weiß, dieser soll aber die Farbe des Dialoghintergrundes haben.
Damit Ihr wisst was ich meine hab ich das mal als Screener an gehangen.

Habe das TabControl gesubclassed und auf WM_ERASEBKGRND reagiert. Das hat leider nicht geholfen. Oder habs falsch gemacht.:roll:

Auch der Versuch die Dialog Messages WM_CTLCOLOR.. Messages zu-verarbeiten schlug fehl.

Und Google gibt auch nicht wirklich was her.
Das Einzige was ich dazu finden konnte, aus dem ich aber nicht wirklich schlau werde, befindet sich hier.

EWeiss 23. Feb 2011 19:36

AW: nonVCL TabControl Hintergrundfarbe ändern
 
Die Frage ist welches System verwendest du?
In Win7 wirst du wohl über UxTheme für dein TabControl die Themes deaktivieren müssen.
Ich hatte zumindest das gleiche problem mit meinen Menüs ohne deaktivieren der Theme ging es auch nicht.

gruss

Luckie 23. Feb 2011 19:39

AW: nonVCL TabControl Hintergrundfarbe ändern
 
Zitat:

Zitat von lbccaleb (Beitrag 1083758)
Habe das TabControl gesubclassed und auf WM_ERASEBKGRND reagiert. Das hat leider nicht geholfen. Oder habs falsch gemacht.:roll:

Ja, warte mal. Also da in Zeile da fehlt wohl ein Rückgabewert und in Zeile muss es heißen statt.

lbccaleb 23. Feb 2011 20:05

AW: nonVCL TabControl Hintergrundfarbe ändern
 
Also,läuft auf nem Windows Vista System.

Das Tab Control wird nur per Quelltext erstellt.

Sowie es hier im Forum angeboten wurde vom User "semo".

Ich hab ja bei der Erstellung kein Problem, eher beim zeichnen. Das kann doch nicht sein das ich das nun nur wegen dem Hintergrund selber zeichnen muss??

Normalerweise hat doch jedes Control eine WM_CTLCOLOR message auf die es reagiert, oder nicht? Kann für das TabControl nur keine ausmachen.

so hatte ich mit ERASEBKGND es versucht.

Delphi-Quellcode:
function EraseBkGnd(hWindow: HWND;Clr:COLORREF;DC: HDC):LRESULT;
var
  hBr: hBrush;
  r: TRect;
begin
  hBr := CreateSolidBrush(Clr);
  GetClientRect(hWindow,r);
  FillRect(DC,r,hBr);
  DeleteObject(hBr);
  result := 1;
end;

function TabWndProc(hTab, uMsg, wParam, lParam:DWORD): DWORD; stdcall;
var
  ps  : TPAINTSTRUCT;
  pen : HPEN;
  brush: HBRUSH;
  dc  : HDC;
  rect : TRect;
  OldObjct: DWORD;
begin
  Result := 0;
  case uMsg of
    WM_ERASEBKGND:
      result:=EraseBkGnd(hTab,RGB(120,120,120),wparam);
 {     begin;
        SetBkMode(wParam, TRANSPARENT);
        result:=GetStockObject( NULL_BRUSH );
      end; }
  else
    Result := CallWindowProc(OldWndProc, hTab, uMsg, wParam, lParam);
  end;
end;

  hwnd_Tabcontrol := CreateWindow(WC_TABCONTROL, '', WS_CHILD or WS_CLIPSIBLINGS or WS_VISIBLE or TCS_TOOLTIPS, TabRect.Left, TabRect.Top, TabRect.Right, TabRect.Bottom, wnd, 0, HInstance, nil );
  OldWndProc := Pointer(SetWindowLong(hwnd_Tabcontrol, GWL_WNDPROC, Integer(@TabWndProc)));

EWeiss 23. Feb 2011 20:09

AW: nonVCL TabControl Hintergrundfarbe ändern
 
Zitat:

Zitat von Luckie (Beitrag 1083877)
Zitat:

Zitat von lbccaleb (Beitrag 1083758)
Habe das TabControl gesubclassed und auf WM_ERASEBKGRND reagiert. Das hat leider nicht geholfen. Oder habs falsch gemacht.:roll:

Ja, warte mal. Also da in Zeile da fehlt wohl ein Rückgabewert und in Zeile muss es heißen statt.

Nix a verstehn ich a ausengelander. :lol:

Zitat:

Ich hab ja bei der Erstellung kein Problem, eher beim zeichnen. Das kann doch nicht sein das ich das nun nur wegen dem Hintergrund selber zeichnen muss??
Stell mal die themes versuchshalber um auf eine andere Farbe dann teste nochmal
Ich denke das du dann eine andere Farbe für den TabHintergrund hast.
Dann ist es so wie ich sage die Theme ignoriert das setzen deiner Farbe.

gruss

Luckie 23. Feb 2011 20:16

AW: nonVCL TabControl Hintergrundfarbe ändern
 
Ich bezog mich auf seine Frage, ob er was falsch machen würde ohne irgendwelchen Quellcode zu zeigen. ;)

lbccaleb 23. Feb 2011 20:18

AW: nonVCL TabControl Hintergrundfarbe ändern
 
Also wenn ich das Design von Vista auf Klassisch stelle, dann sind die Tabs gleichfarbig! Aber dann sehen die auch altbacken aus.

Zitat:

Zitat von Luckie (Beitrag 1083893)
Ich bezog mich auf seine Frage, ob er was falsch machen würde ohne irgendwelchen Quellcode zu zeigen. ;)

Das hab ich ja noch nachgeholt. Wobei das doch eigentlich net so wichtig ist, da ich nichtmal weiß, ob es bei dem Control über ERASEBKGND geht. Glaube eher net, wenn man dem Microsoft Mensch glauben schenken darf.

EWeiss 23. Feb 2011 20:27

AW: nonVCL TabControl Hintergrundfarbe ändern
 
Zitat:

Zitat von lbccaleb (Beitrag 1083895)
Also wenn ich das Design von Vista auf Klassisch stelle, dann sind die Tabs gleichfarbig! Aber dann sehen die auch altbacken aus.

Zitat:

Zitat von Luckie (Beitrag 1083893)
Ich bezog mich auf seine Frage, ob er was falsch machen würde ohne irgendwelchen Quellcode zu zeigen. ;)

Das hab ich ja noch nachgeholt. Wobei das doch eigentlich net so wichtig ist, da ich nichtmal weiß, ob es bei dem Control über ERASEBKGND geht. Glaube eher net, wenn man dem Microsoft Mensch glauben schenken darf.

Ich habe es mal getestet.
Ohne Manifest funktioniert das Tab so wie es soll mit der übergebenen Farbe.
Ich weiss nicht wie dein Programm aussieht ob du themes verwendest oder nicht.
Wenn ja dann versuch das hier.

Binde die Unit UxTheme ein.
Initialisiere sie.
Delphi-Quellcode:
InitThemeLibrary;

und deaktiviere die theme wie folgt.
Delphi-Quellcode:
S_OK := SetWindowTheme(Handle vom Tab, '' , '');
if S_OK = 0 then
begin
  ... // Farbe setzen
end;
gruss

lbccaleb 23. Feb 2011 20:38

AW: nonVCL TabControl Hintergrundfarbe ändern
 
Habe das Programm auch so nochmal getestet. Der weiße Hintergrund kommt erst nach dem Einfügen eines XP-Manifestes. Das kann man durch die Unit UxThemes unterbinden? Kenne mich mit der Unit leider gar nicht aus.

EWeiss 23. Feb 2011 20:41

AW: nonVCL TabControl Hintergrundfarbe ändern
 
Zitat:

Zitat von lbccaleb (Beitrag 1083905)
Habe das Programm auch so nochmal getestet. Der weiße Hintergrund kommt erst nach dem Einfügen eines XP-Manifestes. Das kann man durch die Unit UxThemes unterbinden? Kenne mich mit der Unit leider gar nicht aus.

Ja indem du das Handle des Tabs übergibst und NUR dafür die Theme ausschaltest.
So wie im Code gezeigt.

Da muss man sich nicht auskennen.
Initialisieren und das bißchen Code einfügen an der stelle wo du beim erstellen des Tabs die Farbe übergibst.
Nicht in der WinProc.

Hier mein Sample der Tooltips da hatte ich das gleiche Problem.
Dann kannst sehen wie ich das meine. :)


Delphi-Quellcode:
function CreateToolTip(hObj: HWND; Text: PChar): Integer;
var
  hTooltip: HWND;
  hParent: HWND;
  ti:      TToolInfo;
  S_OK:    HResult;
begin

  with SkinEngine do
  begin
    hParent := GetParent(hObj);
    hTooltip := ToolTipData(0, 0);

    ZeroMemory(@ti, SizeOf(TToolInfo));
    if hTooltip = 0 then
    begin
      InitComControls;
      StyleEx := 0;
      hTooltip := CreateWindowEx(StyleEx, TOOLTIPS_CLASS,
        nil, WS_POPUP or
        TTS_ALWAYSTIP, integer(CW_USEDEFAULT),
        integer(CW_USEDEFAULT), integer(CW_USEDEFAULT),
        integer(CW_USEDEFAULT),
        hParent, 0,
        skInstance, nil);
      if hTooltip <> 0 then
      begin
        // Ohne dem lassen sich die Farben der Tooltips
        // bei aktivierter Theme mit Manifest nicht verändern.
        S_OK := SetWindowTheme(hTooltip, '' , ''); // <<< Theme auschalten .. nur gültig für das übergebene Handle
        if S_OK = 0 then
        begin
          ToolTipData(hTooltip, 1);
          SplitColorARGB(SK_ACTIVECAPTION, Alpha, Red, Green, Blue); // <<< Neue Farbe
          SendMessage(hTooltip, TTM_SETTIPTEXTCOLOR, RGB(Red, Green, Blue), 0);
          SplitColorARGB(SK_INACTIVECAPTION, Alpha, Red, Green, Blue); // <<< Neue Farbe
          SendMessage(hTooltip, TTM_SETTIPBKCOLOR, RGB(Red, Green, Blue), 0);
          SendMessage(hTooltip, TTM_SETMAXTIPWIDTH, 0, 400);
        end;
      end;
    end;
    // Addiere den ToolTipText
    if hTooltip <> 0 then
    begin
      ti.cbSize := sizeof(ti);
      ti.hinst := skInstance;
      ti.uFlags := TTF_IDISHWND or TTF_SUBCLASS;
      ti.hWnd  := hParent;
      ti.uId   := hObj;
      SendMessage(hTooltip, TTM_ADDTOOL, 0, LParam(@ti));
      SetToolTipText(hObj, Text)
    end;
  end;
  Result := hTooltip;

end;
gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:22 Uhr.
Seite 1 von 2  1 2      

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