[VC] Hintergrundfarbe des Slider-Control

01/04/2011 - 12:38 von Dirk Noack | Report spam
Hallo NG,

zur (einfachen) Anpassung der Hintergrundfarbe eines Slider-Control habe
ich eine eigene Klasse erstellt und von CSliderCtrl abgelitten. Darin
behandele ich die ON_WM_CTLCOLOR_REFLECT-Nachricht und liefere je nach
Anwendungsfall meinen eigenen HBRUSH zurück.
Das Setzen der Hintergrundfarbe wàhrend der Initialisierung des
übergeordneten Fensters (OnInitDialog) funktioniert tadellos. Nur beim
dynamischen Umschalten der Farbe (z.B. mittels Buttons) will der
Slider-Control die Farbe nur nach darauffolgendem Anklicken
(Fokusànderung) annehmen.
UpdateWindow/Invalidate bringt keine Verbesserungen. Als Notlösung habe
ich den Fokus programmtechnisch auf den Slider-Control umgeschalten,
jedoch sehe ich das als sehr "dirty" an. In meiner dialogbasierenden
Test-Anwendung funktioniert dies, aber in der eigentlichen
MDI-Zielanwendung, wo die Farbumschaltung sogar durch Reaktion auf ein
"anwendungsfremdes" Signal (und kein Button) erfolgen soll, ist das
keine Lösung.

Kann ich den Slider-Control noch irgendwie dazu überreden die
Hintergrundfarbe zu àndern _ohne_ komplett auf CustomDraw umzustellen?
Evtl. irgendeine Nachricht hinterherschicken, damit er sich definitiv
neuzeichnet?

MfG
Dirk



BOOL CSliderCtrlTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...

m_sliTestExt.SetRange(0, 100, 0);
m_sliTestExt.SetTicFreq(10);
m_sliTestExt.SetPos(50);
m_sliTestExt.SetBc(OPAQUE, DEF_COL_RED);

...
return TRUE;
}

void CSliderCtrlTestDlg::OnBnClickedBtnGreen()
{
m_sliTestExt.SetBc(OPAQUE, DEF_COL_GREEN);

// dirty!
CWnd* _pOldWnd = m_sliTestExt.SetFocus();
if( _pOldWnd )
_pOldWnd->SetFocus();
}

void CSliderCtrlTestDlg::OnBnClickedBtnBlue()
{
m_sliTestExt.SetBc(OPAQUE, DEF_COL_BLUE);
m_sliTestExt.UpdateWindow();
// -> SliderCtrl fàrbt sich erst nach Anklicken (Fokus-Änderung)!
}

.

void CSliderCtrlExt::SetBc(const INT nBcMode, const COLORREF stcBc)
{
m_nBcMode = nBcMode;
m_stcBc = stcBc;

m_pBkBrush->DeleteObject();
m_pBkBrush->CreateSolidBrush(m_stcBc);
// CSliderCtrl::Invalidate();
}

HBRUSH CSliderCtrlExt::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Ändern Sie hier alle Attribute für den DC.
UNREFERENCED_PARAMETER(pDC);
UNREFERENCED_PARAMETER(nCtlColor);

// TODO: Gib einen nicht-Nullpinsel zurück, wenn der Handler der
übergeordneten Ebene nicht aufgerufen werden soll.
if( m_nBcMode == OPAQUE )
{
return( m_pBkBrush->operator HBRUSH() );
}
else
{
return( (HBRUSH)GetStockObject(NULL_BRUSH) );
}
}
 

Lesen sie die antworten

#1 Martin Richter [MVP]
02/04/2011 - 09:56 | Warnen spam
Hallo Dirk Noack!

Kann ich den Slider-Control noch irgendwie dazu überreden die
Hintergrundfarbe zu àndern _ohne_ komplett auf CustomDraw umzustellen?
Evtl. irgendeine Nachricht hinterherschicken, damit er sich definitiv
neuzeichnet?



Hast Du es mal mit folgendem Versucht:
- RedrawWindow mit RDW_FRAME? Evtl. hàlt sich das das Control für eine
NC-Region.
- dem Invalidate der der entsprechenden Region im Parent Window (sofern
kein WS_CLIPCHILDREN gesetzt ist?

Martin Richter [MVP] WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written
program is its own hell!" The Tao of Programming
FAQ: http://www.mpdvc.de Samples: http://www.codeproject.com

Ähnliche fragen