Farben von Controls ändern - Ownerdraw ok, aber alles?
-
Hi!
Ich würde gerne die Textfarbe von Buttons ändern, die Hintergrundfarbe einer Spalte in einem ListView usw...
Aber: Das Windows-Design soll beibehalten werden, ich möchte also nicht statt den bekannten Windows XP Buttons jetzt zB. nur einen 1 Pixel Rahmen als Button sondern den XP Style behalten.
Geht das überhaupt? Wenn ja, wie?
-
Für die Button Textfarbe sollte WM_CTLCOLORBUTTON tun.
Für den Spaltenhintergund im ListView ist NM_CUSTOMDRAW das geeignete Mittel.
-
Leider gibt es ein Problem mit dem list view:
Ich empfange nur CDDS_PREPAINT, aber nie CDDS_ITEMPREPAINT. Warum nicht? Report style ist gesetzt, zwei Spalten gemacht und ein Item + Subitem eingefügt.
Habe hier geguckt: http://msdn.microsoft.com/en-us/library/bb761817
// Message handler des list view controls mit report style switch(message) { case WM_NOTIFY: { LPNMLISTVIEW pnm = (LPNMLISTVIEW)lParam; if(pnm->hdr.code == NM_CUSTOMDRAW) { LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; if(lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT) { // Wird empfangen return CDRF_NOTIFYITEMDRAW; } else if(lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) { // Wird nie empfangen ... return CDRF_NEWFONT; } } break; } } return false;
-
Argh, sorry, natürlich ...
// Message handler des DIALOGS mit dem child list view control mit report style
-
Gelöst. Da parent ein Dialog ist, muss man den return value anders setzen:
SetWindowLong(dialogHandle, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW); return true;
-
Nächstes Problem.
Textfarbe eines Push-Buttons ändern geht mit WM_CTLCOLORBTN glaube ich nicht

http://msdn.microsoft.com/en-us/library/bb761849
Muss ich jetzt alles selber zeichnen? Wie soll das eigentlich gehen? Wie zeichne ich dann den Windows-XP Style der Buttons, diesen schönen Rand und so... kapier ich ned.
-
Du musst alles selber Zeichnen.
Netterweise gibt es aber auf www.codeproject.com x-fach Code dafür...
-
Ok danke.
Noch ein Problem mit dem list view:Wie färbe ich eine Selektion ein? Ich möchte die erste Spalte einer Zeile färbig, alle weiteren normal (Weiß). Das klappt auch.
Wenn man die Zeile allerdings markiert, ist alles (LVS_EX_FULLROWSELECT) Grau.Wie bekomme ich es hin, dass die erste Spalte einer markierten Zeile weiterhin färbig bleibt, und nur die weiteren Spalten Grau sind?
Also die erste Spalte einer Zeile soll immer färbig sein, auch wenn markiert.
-
Also wenn du deinen Listview sowieso schon Customdraw hast ist das ganz einfach. Werte (CDDS_SUBITEM | CDDS_ITEMPREPAINT) aus. ((LPNMLVCUSTOMDRAW)lParam)->iSubItem gibt dir den Subitem. Deine erste Spalte enthält nur Subitems = 0, die zweite Spalte alle Subitems = 1, usw. Mit DrawColor_Text schreibst du dann einfach den Text in die einzelnen Zellen und machst am Schluss ein "return CDRF_SKIPDEFAULT;"