AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) nonVCL TabControl Hintergrundfarbe ändern
Thema durchsuchen
Ansicht
Themen-Optionen

nonVCL TabControl Hintergrundfarbe ändern

Ein Thema von lbccaleb · begonnen am 23. Feb 2011 · letzter Beitrag vom 24. Feb 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#1

nonVCL TabControl Hintergrundfarbe ändern

  Alt 23. Feb 2011, 11:35
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.

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.
Miniaturansicht angehängter Grafiken
tabs.jpg  
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: nonVCL TabControl Hintergrundfarbe ändern

  Alt 23. Feb 2011, 19:36
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: nonVCL TabControl Hintergrundfarbe ändern

  Alt 23. Feb 2011, 19:39
Habe das TabControl gesubclassed und auf WM_ERASEBKGRND reagiert. Das hat leider nicht geholfen. Oder habs falsch gemacht.
Ja, warte mal. Also da in Zeile da fehlt wohl ein Rückgabewert und in Zeile muss es heißen statt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: nonVCL TabControl Hintergrundfarbe ändern

  Alt 23. Feb 2011, 20:05
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)));
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)

Geändert von lbccaleb (23. Feb 2011 um 20:11 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: nonVCL TabControl Hintergrundfarbe ändern

  Alt 23. Feb 2011, 20:09
Habe das TabControl gesubclassed und auf WM_ERASEBKGRND reagiert. Das hat leider nicht geholfen. Oder habs falsch gemacht.
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.

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

Geändert von EWeiss (23. Feb 2011 um 20:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: nonVCL TabControl Hintergrundfarbe ändern

  Alt 23. Feb 2011, 20:16
Ich bezog mich auf seine Frage, ob er was falsch machen würde ohne irgendwelchen Quellcode zu zeigen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: nonVCL TabControl Hintergrundfarbe ändern

  Alt 23. Feb 2011, 20:18
Also wenn ich das Design von Vista auf Klassisch stelle, dann sind die Tabs gleichfarbig! Aber dann sehen die auch altbacken aus.

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.
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)

Geändert von lbccaleb (23. Feb 2011 um 20:22 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: nonVCL TabControl Hintergrundfarbe ändern

  Alt 23. Feb 2011, 20:27
Also wenn ich das Design von Vista auf Klassisch stelle, dann sind die Tabs gleichfarbig! Aber dann sehen die auch altbacken aus.

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.
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
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: nonVCL TabControl Hintergrundfarbe ändern

  Alt 23. Feb 2011, 20:38
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.
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: nonVCL TabControl Hintergrundfarbe ändern

  Alt 23. Feb 2011, 20:41
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

Geändert von EWeiss (23. Feb 2011 um 20:48 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 Uhr.
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