CListCtrl: Wie erkenne ich, dass die Spaltenbreite geändert wurde?
-
Hallo Leute!
Ich hab nun langsam die Headernachrichten durch und finde keine, die sich meldet, wenn die Spaltenbreite geändert wurde.
Welche ist das?

-
Hallo,
die Spalten eines ListControls sind eigentlich ein eigenes Steuerelement, ein CHeaderCtrl. Ein Header-Control sendet dann auch die von dir benötigten Nachrichten (in diesem Falle HDN_BEGINTRACK). Die Notifications des Header-Controls sind hier:
zu finden
MfG
-
Dankeschön, aber ich habe HDN_ENDTRACK eingebunden und lasse eine Messagebox aufgehen, wenn er in die Funktion kommt.
BEGIN_MESSAGE_MAP(COrteView, CFormView) //{{AFX_MSG_MAP(COrteView) ON_NOTIFY(HDN_ENDTRACK, IDC_LSC_ORTE, OnEndtrackLscOrte) //}}AFX_MSG_MAP END_MESSAGE_MAP() void COrteView::OnEndtrackLscOrte(NMHDR* pNMHDR, LRESULT* pResult) { HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR; AfxMessageBox(""); *pResult = 0; }Nun kann ich die Trennlinie so oft hin und herziehen, wie ich will - es kommt keine Messagebox. Ich hab das einfach über den Klassenassistenten eingebunden. Hat der was vergessen?
Was ist da falsch?
-
Hab ich noch eine Erklärung vergessen? Braucht ihr mehr Quelltext zum Angucken?
Bitte Leute, ich find da nix.
-
da gibt es eine "Besonderheit", die hatte ich schon wieder vergessen:
der Klassenassistent kümmert sich leider nicht darum, ob die Code-Teile, die man über ihn einfügt, auch Sinn machen. In diesem Falle muß der erzeugte Eintrag in der Message-Map geändert werden:
BEGIN_MESSAGE_MAP(COrteView, CFormView) //{{AFX_MSG_MAP(COrteView) ON_NOTIFY(HDN_ENDTRACK, 0, OnEndtrackLscOrte) //}}AFX_MSG_MAP END_MESSAGE_MAP()da das Header-Control als Child des ListControls die ID Null hat, kam im vorherigen Falle nichts in OnEndtrackLscOrte an.
Ich habe das hier zur Sicherheit noch einmal ausprobiert, allerdings mit einer dialogfeld-basierten Anwendung, die Meldung kommt an. Allerdings: die MessageBox geht zweimal auf (liegt wohl daran, daß für beide "aneinandergrenzenden" Spalten-Köpfe jeweils eine Meldung gesendet wird)
MfG
-
Es geht auch mit meiner verworrenen Viewanwendung.
Vielen vielen Dank, ich war schon echt am Verzweifeln.
Im Nachhinein isses logisch, aber ich wäre wohl niemals darauf gekommen, da einfach eine 0 hinzuschreiben. Hätte mich wohl nach der ID des Headers totgesucht.
Jetzt bin ich erstmal wieder glücklich, bis zur nächsten Stolperfalle von diesem grausigen Listctrl.
Danke

-
Grr, geht doch nicht.
Ich kriege die Breitenänderung immer erst einen später.
Also: Anwendung startet, alles super, Breite stimmt.
Ich ziehe die erste Spalte breit, nix tut sich.
Ich ziehe die erste Spalte schmal, das Eingabefeld wird breit.
Ich ziehe die erste Spalte breit, das Eingabefeld wird schmal.usw.
Versteh ich nicht.
Hier kommt der Quelltext.
Im View:
BEGIN_MESSAGE_MAP(COrteView, CFormView) //{{AFX_MSG_MAP(COrteView) ON_NOTIFY(HDN_ENDTRACK, 0, OnEndtrackLscOrte) //}}AFX_MSG_MAP END_MESSAGE_MAP() void COrteView::InitListCtrl() // Wird in OnInitialUpdate aufgerufen { //gekürzt // Postleitzahlfeld an die richtige Stelle packen m_edtPlz.GetWindowRect(&rect); ScreenToClient(&rect); int nSpaltenBreite = rect.left + m_lscOrte.GetColumnWidth(0); rect.right = nSpaltenBreite; m_edtPlz.MoveWindow(&rect, TRUE); // Ortfeld an die richtige Stelle packen m_edtOrt.GetWindowRect(&rect); ScreenToClient(&rect); rect.left = nSpaltenBreite; m_edtOrt.MoveWindow(&rect, TRUE); // Immer die gesamte Zeile auswählen SendDlgItemMessage(IDC_LSC_ORTE, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); } void COrteView::OnEndtrackLscOrte(NMHDR* pNMHDR, LRESULT* pResult) { HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR; RECT rect; // Postleitzahlfeld an die richtige Stelle packen m_edtPlz.GetWindowRect(&rect); ScreenToClient(&rect); int nSpaltenBreite = rect.left + m_lscOrte.GetColumnWidth(0); rect.right = nSpaltenBreite; m_edtPlz.MoveWindow(&rect, TRUE); // Ortfeld an die richtige Stelle packen m_edtOrt.GetWindowRect(&rect); ScreenToClient(&rect); rect.left = nSpaltenBreite; m_edtOrt.MoveWindow(&rect, TRUE); *pResult = 0; }Im Listcontrol:
int CSortListCtrl::GetColumnWidth(int f_nIdx) const { return m_ctlHeader.GetColumnWidth(f_nIdx); }Im Headercontrol:
int CSortHeaderCtrl::GetColumnWidth(int f_nIdx) const { HD_ITEM hdItem = {0}; hdItem.mask = HDI_WIDTH; const int iItemCount = GetItemCount(); if (f_nIdx < iItemCount) { VERIFY( GetItem(f_nIdx, &hdItem)); return hdItem.cxy; } return -1; }Ideen?

-
schubs, Bitte ich hab echt keine Ahnung mehr, nach was ich suchen soll!

-
So, es war die falsche Nachricht, auf die ich reagiert habe.
HDN_ITEMCHANGED musste es sein.