Selection in CListCtrl nicht sichtbar
-
Hallo zusammen,
ich setze die Selection eines CListCtrl auf die erste Zeile. Die Selektion wird auch angenommen aber ist im angezeigten CListCtrl nicht sichtbar (nicht blau hinterlegt).
BOOL COscillatorsDlg::OnInitDialog() { CDialogEx::OnInitDialog (); ... CreateOscListCtrl (); ShowOscillators (); return TRUE; }
void COscillatorsDlg::CreateOscListCtrl () { mLstOsc.SetExtendedStyle (LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); CRect rect; mLstOsc.GetClientRect (rect); mLstOsc.SetFont (&mFont); CDC* dc = GetDC (); Int saveDC = dc->SaveDC (); dc->SelectObject (mFont); for (size_t i = 0; i < mTableCols.size (); ++i) { if (mTableCols[i][0] == _T("Oscillators")) { UInt lvs_c = 0; for (size_t c = 1; c < mTableCols[i].size (); ++c, ++lvs_c) { CString str = (mTableCols[i][c].c_str ()); CSize s = dc->GetTextExtent (str); Int colWidth = s.cx * 2; Int colFormat = LVCFMT_RIGHT; if (lvs_c < 1) colFormat = LVCFMT_LEFT; mLstOsc.InsertColumn (lvs_c, str, colFormat, colWidth); } break; } } dc->RestoreDC (saveDC); ReleaseDC (dc); } void COscillatorsDlg::ShowOscillators () { TDataBase::Table oscs = mTestDB.Query (_T("SELECT * FROM Oscillators")); mLstOsc.DeleteAllItems (); UInt r = 0; for (size_t i = 1; i < oscs.size (); ++i, ++r) { mLstOsc.InsertItem (r, oscs[i][0].c_str ()); for (size_t c = 1; c < oscs[i].size (); ++c) mLstOsc.SetItemText (r, c, oscs[i][c].c_str ()); } Int s = mLstOsc.GetSelectionMark (); if (s == -1) s = 0; mLstOsc.SetSelectionMark (s); mLstOsc.EnsureVisible (s, FALSE); }
Was muss ich noch machen, damit gleich beim öffnen des Dialogs die Selektion sichtbar ist?
Herzliche Grüsse
Walter
-
Hallo zusammen,
hab's rausgefunden
mLstOsc.SetSelectionMark (s); mLstOsc.EnsureVisible (s, FALSE); // Das hier muss zusätzlich noch gemacht werden. mLstOsc.SetItemState (s, LVIS_SELECTED, LVIS_SELECTED);
Ich würde zwar erwarten, dass der Aufruf von SetSelectionMark() das auch erledigen würde
Herzliche Grüsee
Walter
-
Benutze LVS_SHOWSELALWAYS!
-
Hallo Martin,
das nützt leider gar nichts, diesen Stile hatte ich schon gewählt "Always Show Selection" auf True, das müsste doch das gleiche sein wie LVS_SHOWSELALWAYS.
aber ich kann mit:
mLstOsc.SetItemState (s, LVIS_SELECTED, LVIS_SELECTED);
leben
Herzliche Grüsse
Walter