SendMessage CListCtrl
-
Hallo Leute,
nach einem Tag Arbeitszeit stehe ich auf dem Schlauch. Ich habe eine abgeleitete Klasse CInduListCtrl von CListCtrl. In dieser Klasse bekomme ich das Event ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw).
Das möchte ich jetzt gerne an die ParentKlasse weiterleiten (es geht darum die Feldfarben anzupassen). Da die ParentKlasse weiß wo welche Farbe hin soll, möchte ich dort das Event auswerten.
Um das an die Parentklasse weiterzuleiten habe ich nun folgende Zeile in mein CInduListCtrl::OnCustonDraw(NMHDR *pNMHDR, LRESULT *pResult) reingeschrieben:
GetParent()->SendMessage(WM_NOTIFY,GetDlgCtrlID(), (LPARAM)pNMHDR);
In meiner TabKlasse CTabAblaufprogramme.cpp steht nun folgendes:
Funktionsforward in der Headerdatei:
afx_msg void OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult);BEGIN_MESSAGE_MAP(CTabAblaufprogramme, CDialog)
ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST_LABEL_NEU, &CTabAblaufprogramme::OnCustomDraw)
END_MESSAGE_MAP()Die Implementation der Funktion ist ja erstmal uninteressant.
Die Werte der Variablen aus meiner CInduListCtrl sehen gut aus. GetDlgCtrlID() liefert mir die ID meines CListCtrl(IDC_LIST_LABEL_NEU) pNMHDR liefer mir als Code -12.Das ist NM_CUSTOMDRAW. CWnd->Getparent liefert mir auch genau meinen Tab(CTabCtrl) in dem ich die Liste habe.
Was mache ich falsch? Meine Funktion CAblaufprogramme::OnCustomDraw wird einfach nicht aufgerufnen.
-
Logisch. ON_NOTIFY_REFELCT bedeutet ja, dass die Nachricht im Parent (an die diese nämlich normalerweise gesendet wird, abgefangen wird.
Du must Dich schon entscheiden. Entweder wird die nachricht im Parent behandelt oder im Child.
Weiterleitung ist eben hier nicht möglich...
Nimm eine eigene Nachricht, oder bau eine andee Funktion die die Farben intelligent zurück geben.
-
Alter!
Ich hab leider noch keinen Plan von Windows nachrichten. Ich kopiere mir die von beispielen zusammen und bin froh wenn die Funktionieren.
Ich habe zu wenig wissen um mit MSDN etwas anfangen zu können, da die beschreibungen dort zu viel wissen voraussetzen.Ich finde es sowieso hart, was für ein aufwand die GUI's in der MFC sind, wenn man etwas nicht standardmäßiges macht.
Ganz offensichtlich ist Farbe ändern, mehrzeilige Strings und editieren von Sublables alles kein Standard.
Aber danke erstmal. Das Event kommt jetzt in meiner Parentklasse an.
-
Ich habe noch eine weitere Frage:
Woher weiß ich welches Item gerade mit "Drawen" dran ist?
Meine Funktion sieht folgendermaßen aus:NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
Dort gibt es nur den Eintrag Subitem und der ist immer 1
Das einzige was sich ändert ist eine laufende Nummer inpLVCD->nmcd.dwItemSpec
-
Du wirst für jedes Subitem angefragt.
Das kommt in der CDDS_ITEMPREPAINT|CDDS_SUBITEM Nachricht.Siehe Tutorial und Klasse hier:
http://www.codeguru.com/cpp/controls/listview/customdrawing/article.php/c4195/Custom-Draw-ListView-Controls-Part-I.htm
http://www.codeguru.com/cpp/controls/listview/customdrawing/article.php/c4199/Custom-Draw-ListView-Controls-Part-II.htm