Hintergrund von Slidern in ONCTLColor funzt net
-
Hi,
wenn ich den Hintergrund eines Sliders und eines Dialoges in der OnCTLColor Funktion weis mache, klappt das auch schon ganz gut, allerdings wenn ich einen spitzen Slider verwende, ist der Hintergrund der Spitze in der normalen Dialogfarbe. Das ist auch so bei den Rundungen der XP-Buttons. Dort ist eine starke, unschöne Verfärbung zu sehen.
HBRUSH CMyClass::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if(nCtlColor & CTLCOLOR_STATIC) { // Set the static text to black on white. pDC->SetTextColor(RGB(0, 0, 0)); pDC->SetBkColor(RGB(255,255,255)); // Drop through to return the background brush. } if(nCtlColor & IDC_OFFSETSLIDER) { // Set the static text to black on white. pDC->SetTextColor(RGB(0, 0, 0)); pDC->SetBkColor(RGB(255,255,255)); pDC->SetBkMode(TRANSPARENT); // Drop through to return the background brush. return m_DialogBrush; } if(nCtlColor & CTLCOLOR_DLG){return m_DialogBrush;} return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); }Ich hab da mal im obigen Code ein wenig rumgespielt, finde aber keine Variante, in der die Spitze oder die Buttons sauber gezeichnet werden

Kennt hier jemand den Trick im XP Style sauber diesen kleinen Bereich auch festzulegen ?
Grüße
TheNoName
-
Das ist ja auch Unsinn:
if(nCtlColor & IDC_OFFSETSLIDER)Hier ist nicht Dein IDC gefragt, sondern der Typ des COntrols, dass Du steuren möchtest...
-
/* * Color Types */ #define CTLCOLOR_MSGBOX 0 #define CTLCOLOR_EDIT 1 #define CTLCOLOR_LISTBOX 2 #define CTLCOLOR_BTN 3 #define CTLCOLOR_DLG 4 #define CTLCOLOR_SCROLLBAR 5 #define CTLCOLOR_STATIC 6 #define CTLCOLOR_MAX 7 #define COLOR_SCROLLBAR 0 #define COLOR_BACKGROUND 1 #define COLOR_ACTIVECAPTION 2 #define COLOR_INACTIVECAPTION 3 #define COLOR_MENU 4 #define COLOR_WINDOW 5 #define COLOR_WINDOWFRAME 6 #define COLOR_MENUTEXT 7 #define COLOR_WINDOWTEXT 8 #define COLOR_CAPTIONTEXT 9 #define COLOR_ACTIVEBORDER 10 #define COLOR_INACTIVEBORDER 11 #define COLOR_APPWORKSPACE 12 #define COLOR_HIGHLIGHT 13 #define COLOR_HIGHLIGHTTEXT 14 #define COLOR_BTNFACE 15 #define COLOR_BTNSHADOW 16 #define COLOR_GRAYTEXT 17 #define COLOR_BTNTEXT 18 #define COLOR_INACTIVECAPTIONTEXT 19 #define COLOR_BTNHIGHLIGHT 20Kein Slider !
if(pWnd->GetDlgCtrlID() == IDC_OFFSETSLIDER) { // Set the static text to black on white. pDC->SetTextColor(RGB(0, 0, 0)); pDC->SetBkColor(RGB(255,255,255)); pDC->SetBkMode(TRANSPARENT); // Drop through to return the background brush. return m_DialogBrush; }So besser ? Ändert sich nix.
Gruß
thenoname
-
Soweit ich die MSDN verstehe verwendet ein Slider Control auch kein WM_CTLCOLOR!
WM_CTLCOLOR ist nur eine synthetisierte Nachricht in der MFC, es gibt reale Nachrichten wie WM_CTLCOLORSTATIC etc. Die Common Control verwenden aber einen anderen Mechanismus und der heißt NM_CUSTOMDRAW...Verwende also NM_CUSTOMDRAW!
-
Hallo,
void CMyClass::OnNMCustomdrawOffsetslider(NMHDR *pNMHDR, LRESULT *pResult) { LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR); if(pNMCD->dwDrawStage == CDDS_POSTERASE) { } *pResult = 0; }Nur übergebe ich hier nirgends Hintergrundfarben. Wenn ich es richtig sehe, könnte ich hier einfach das Rechteck löschen. Aber das wird ja schon im ON_CTLCOLOR richtig übergeben, denn der Hintergrund des Sliders ist weiss. Nur die Spitzen sind in einer anderen Farbe und die würden meiner Meinung nach erst später falsch neu gezeichnet. Nachdem ich der Spitze keinen Hintergrund Farbwert übergeben kann, würde hier immer die ursprüngliche Windows Dialogfarbe verwendet. Das sieht übrigends bei anderen Farbshemas recht greulich aus, da ist der Standard sehr angenehm

Gruß
TheNoName