Hintergrundfarbe des tabctrls im propertysheet



  • huhu

    habe ich eine chance, die hintergrundfarbe des tabctrls zu manipulieren?
    die schwierigkeit besteht darin, dass es sich um ein tabctrl aus dem propertysheet handelt, welches die einzelnen seiten handelt.

    der bereich neben den tabs, der noch frei ist, erscheint hier immer grau.
    am liebsten wäre mir transparent, damit das dahinterliegende bild sichtbar bleibt.

    was kann ich tun?

    danke
    smeagol



  • An das TabCtrl kommst Du mit CTabCtrl* CPropertySheet::GetTabControl(). Vielleicht hilft Dir das ja schon mal weiter.
    Normalerweise würde ich ja sagen, mach Dir ne Ableitung von CTabCtrl und überschreibe OnEraseBkgnd()..... Aber in Deinem speziellen Fall lässt sich das ja nicht austauschen. Vielleicht geht ja was über WM_CTLCOLOR (siehe http://support.microsoft.com/kb/32685/de)?



  • ehrlich gesagt nicht, dass ich das so bekomme, ist mir klar.

    nochmal genauer verbildlicht ist das problem hier geschildert:

    http://www.codeguru.com/forum/showthread.php?t=279490

    als lösung wird vorgeschlagen, bei OnEraseBkgnd des TabCtrls TRUE
    zurückzugeben.

    um eine eigenes tabctrl in das propertysheet zu bekommen, hab folgendermassen
    gearbeitet:

    HWND hWndTab = (HWND)SendMessage(PSM_GETTABCONTROL);
      m_tabCtrl.SubclassDlgItem(::GetDlgCtrlID(hWndTab), this);
    

    m_tabCtrl ist meine neue klasse, abgeleitet von tabctrl mit folgender zusatzfunktionalität:

    BOOL CTabCtrlEx::OnEraseBkgnd(CDC* pDC)
    {
    
        CRect cr;
        GetClientRect(&cr);
        CBrush brush;
        brush.CreateSolidBrush(RGB(255,0,0));
        pDC->FillRect(&cr, &brush);
        pDC->SetBkMode(TRANSPARENT);
        brush.DeleteObject();
        return TRUE;
    }
    

    der brechpunkt darin wird auch ausgelöst, jedoch kann ich optisch leider keine
    Veränderung feststellen 😞

    any ideas?

    danke,
    Smeagol



  • Wen Du eh schon die MFC benutzt, dann würde ich das so schreiben:

    CTabCtrl* pTabCtrl = GetTabControl();
    m_tabCtrl.SubclassWindow(pTabCtrl->m_hWnd);
    

    Um die Hintergrundfarbe eines CDateTimeCTrl zu ändern, habe ich mal das gemacht:

    ...
    CBrush * oldBrush = pDC->SelectObject(&brush);
    CRect rect;
    pDC->GetClipBox(&rect);
    pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
    pDC->SelectObject(oldBrush);
    ...
    

    Vielleicht hilft Dir das irgendwie weiter, so dolle kenne ich mich im Bereich Malen in Controls auch nicht aus.
    Und den brush würde ich als Membervariable in CTabCtrlEx einbauen und einmalig im Konstruktor initialisieren und im Destruktor entsorgen.


  • Mod

    Das Modifizieren des DCs im WM_ERASEBKGND ist so nicht erlaubt:

    pDC->SetBkMode(TRANSPARENT);
    

    Das mag ein Hack sein, der evtl. funktioniert, aber garantiert ist hier nichts. Er kann sogar noch andere üble Seiteneffekte haben.



  • pDC->SetBkMode(TRANSPARENT);

    hab ich nur reingetan, weil ich keine veränderung feststellen konnte.

    Also, in einer kleinen testanwendung, die ich diesbezüglich angelegt habe
    geht offensichtlich hervor:

    der hintergrund des tabctrls ist tatsächlich weg, wenn man erasebackground true zurückgibt
    ABER nur wenn man kein XP-Style verwendet.

    im folgenden scheint das auch nochmal beschrieben zu sein, un wenn ich das
    richtig verstehe, habe ich eine chance, wenn ich SetWindowTheme irgendwie aufrufe.

    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=517584&SiteID=1

    aber ich verstehe ganz und gar nicht, wie ich das anwenden soll 😞

    BOOL CMySheet::OnInitDialog()
    {
      BOOL bResult = CPropertySheet::OnInitDialog();
    
      CTabCtrl* tab = GetTabControl();
      m_tabCtrl.SubclassWindow(tab->m_hWnd);
      SetWindowTheme(m_tabCtrl.m_hWnd, L"", L"");
    
      return bResult;
    }
    

    ergibt immer ein:

    Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__SetWindowTheme@12" in Funktion ""public: virtual int __thiscall CMySheet::OnInitDialog(void)" (?OnInitDialog@CMySheet@@UAEHXZ)". MySheet.obj

    any ideas?


  • Mod

    Du hast vermutlich ein altes SDK in Benutzung.
    Welche VS Version benutzt Du?

    Das letzte SDK, dass mit VC6 arbeitete ist dieses:
    http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm



  • Visual Studio 2005
    und n Service Pack dafür hab ich auch drauf.

    werden da nicht alle komponenten mitinstalliert?
    ehrlich gesagt, weiss ich nichtmal was das sdk macht, bzw.
    mit dem problem zu tun haben könnte 😞



  • Hi,

    ich hätte zur CTabCtrl auch noch mal 2 Fragen, wo ich keinen Ansatz finde.

    1. hätte ich gern auch die beiden Scrollpfeile für mich modifiziert, sprich selbst gezeichnet. Meinen Tabs selbst wird mittels einer Membervariable die Farbe vorgegeben, die ich in CMyTabCtrl::DrawItem(...) selbst zeichne. Das gleiche hätte ich gern auch für die Scrollpfeile.
    Kann ich das auch in DrawItem machen und wenn ja, wie?

    Das zweite Problem, was ich auch ganz gern noch in meinem TabCtrl geändert hätte wäre es, dass Tabs die nicht mehr in die Liste passen, wie abgeschnitten aussehen, bevor es dann weiter rechts zu den Scrollpfeilen geht. Sehr schön finde ich es da in Visual Studio 6 gemacht und hätte es auch gern so für mich übernommen.

    Genutzt habe ich für mein Project auch kein PropertySheet und PropertyPage, sondern nur eine TabCtrl, mit deren Hilfe ich zw. den Dialogen springen kann.

    Ein sehr gutes Beispiel gibt's da unter:
    http://www.codersource.net/mfc_ctabctrl.html
    Vielleicht bringt das andere hier auch weiter.

    Ich hoffe, Ihr könnt mir bei meinen Problemen auch weiterhelfen.

    LG
    Anti


  • Mod

    IMHO gibt es keinen Weg die Pfeile zu managen, außer in der Doku steht was dazu.

    Dann such Dir doch ein wirklich selbst gebautes, wenn Du sowieso alles selber machst. Das ist mit Sicherheit einfacher. IMHO gibt es auch auf www.codeproject.com entsprechenden Code.
    Dunkel erinnere ich mich: Die alte MFC 1.52 hatte ein Tab Control dass slebst gebaut war, weil die damaligen Versionen IMHO PropertySheet und Pages noch nicht kannten.


Anmelden zum Antworten