[ad_1]
C++
void CDlgCorrection::RowSelected() { m_bInizio = false; for (int i = 0; i < m_astrPath.GetSize(); i++) { m_lista.SetItemState(i, 0, LVIS_SELECTED); } m_lista.SetItemState(m_nRow, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_nRowSelected = m_nRow; m_lista.SetFocus(); m_lista.SetSelectionMark(m_nRow); }
我使用此代码在 CListCtrl 中选择一行,但如果我在 CListCtrl 中单击,则该行被选中,因此我选择了 2 行..如何在单击列表之前取消选择一行
我尝试过的:
我试着写:
C++
m_lista.SetItemState(m_nRow, ~LVIS_SELECTED | ~LVIS_FOCUSED, ~LVIS_SELECTED | ~LVIS_FOCUSED);
我也尝试过
C++
if(m_nRow!= -1) m_lista.SetItemState(m_nRow, ~LVIS_SELECTED, LVIS_SELECTED); POSITION pos = NULL; INT_PTR nPos; pos = m_lista.GetFirstSelectedItemPosition(); if (pos) { nPos = m_lista.GetNextSelectedItem(pos); } else { nPos = -1; }
但我还是选择了 2 行
….我解决了:
C++
void CDlgCorrection::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult) { m_lista.SetItemState(m_nrow, 0, LVIS_SELECTED); m_nRowSelected = -1; m_lista.SetFocus(); m_lista.SetSelectionMark(-1); }
解决方案2
如果选择两行是一个问题,则将控件的属性设置为仅允许单个选择。 这可以使用资源编辑器或代码来完成。
您可能需要考虑使用此站点上提供的许多派生列表控件类之一。 我用这个: CReportCtrl – 报告样式 CListCtrl 的极其方便的版本[^]。
解决方案1
尝试:
C++
m_lista.SetItemState(m_nRow, 0, LVIS_SELECTED | LVIS_FOCUSED);
这应该将两个状态位设置为零。
解决方案3
尝试这个。 在您的 OnCreate 函数中
C++
GetListCtrl().SetExtendedStyle(LVS_EX_FULLROWSELECT);
[ad_2]
コメント