Delphi-PRAXiS

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

lbccaleb 23. Feb 2011 20:56

AW: nonVCL TabControl Hintergrundfarbe ändern
 
OK, Danke. Werde das mal ausprobieren.

EWeiss 23. Feb 2011 22:11

AW: nonVCL TabControl Hintergrundfarbe ändern
 
Zitat:

Zitat von lbccaleb (Beitrag 1083915)
OK, Danke. Werde das mal ausprobieren.

Ich hoffe du hast die GWL_STYLE auf TCS_OWNERDRAWFIXED gesetzt?
Das viel mir gerade noch ein.

gruss

EWeiss 24. Feb 2011 03:30

AW: nonVCL TabControl Hintergrundfarbe ändern
 
Noch was gefunden
So ändern Sie die Hintergrundfarbe von einem Registerkarten-Steuerelement

Hier mal ein kleines Sample (ohne Quelltext)
Allerdings nur die TextFarbe im Tab geändert.
Und auf die schnelle in PB geschrieben.

Das Problem in Delphi es fehlen zu viele API's
Zum Beispiel!

Delphi-Quellcode:
TabCtrl_GetItem

könnte man so ermitteln
Delphi-Quellcode:
SendMessage(hwnd, TCM_GETITEM, iItem, @pItem)

War mir aber jetzt zu umständlich.



Delphi-Quellcode:
        CASE %WM_DRAWITEM
           LOCAL lDISPtr AS DRAWITEMSTRUCT PTR, zCap AS ASCIIZ * 50
           LOCAL ti AS TC_ITEM, TextDrawFlag AS LONG
 
           IF CBWPARAM = %ID_TAB THEN
              lDisPtr = CBLPARAM
 
              FillRect @lDisptr.hDc, @lDisptr.rcItem, GetSysColorBrush(%COLOR_3DFACE)
              @lDisptr.rcItem.nTop = @lDisptr.rcItem.nTop + 3
              IF @lDisPtr.ItemState = %ODS_SELECTED THEN
                 SetTextColor @lDisPtr.hDc, %BLUE
              ELSE
                 SetTextColor @lDisPtr.hDc, %BLACK
              END IF
              SetBkColor @lDisPtr.hDc, GetSysColor(%COLOR_3DFACE)
 
              ti.mask = %TCIF_TEXT
              ti.pszText = VARPTR(zCap)
              ti.cchTextMax = SIZEOF(zCap)
              CALL TabCtrl_GetItem(GetDlgItem(CBHNDL, %ID_TAB), @lDisptr.itemID, ti)
              DrawText @lDisptr.hDc, zCap, LEN(zCap), @lDisptr.rcItem, %DT_SINGLELINE OR %DT_CENTER
 
          END IF

gruss

hathor 24. Feb 2011 07:11

AW: nonVCL TabControl Hintergrundfarbe ändern
 
In der ganzen Diskussion vermisse ich die boolsche Eigenschaft "highlighted".
Beispiel:

Delphi-Quellcode:
constructor TTabSheet.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Align := alClient;
  ControlStyle := ControlStyle + [csAcceptsControls, csNoDesignVisible,
    csParentBackground, csPannable];
  Visible := False;
  FTabVisible := True;
  FHighlighted := False;
end;

EWeiss 24. Feb 2011 07:12

AW: nonVCL TabControl Hintergrundfarbe ändern
 
Zitat:

Zitat von hathor (Beitrag 1083971)
In der ganzen Diskussion vermisse ich die boolsche Eigenschaft "highlighted".
Beispiel:

Delphi-Quellcode:
constructor TTabSheet.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Align := alClient;
  ControlStyle := ControlStyle + [csAcceptsControls, csNoDesignVisible,
    csParentBackground, csPannable];
  Visible := False;
  FTabVisible := True;
  FHighlighted := False;
end;

was für ein FHighlighted
Das ist nonvcl und nicht von einer TComponente abgeleitet..


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