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


  • Mod

    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


Anmelden zum Antworten