lm68140318 发表于 2023-4-29 18:47:25

CListCtrl-SetItemState

https://i.postimg.cc/XNh0P926/err.png

BOOL b1=mylist4.SetItemState(1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);


我的问题:我想选中第二行,可是没有显示选中   ??

liuhongrun2022 发表于 2023-4-29 18:48:52

根据您提供的代码,mylist4 是一个列表视图控件(ListView),SetItemState() 方法用于设置列表视图控件中某一行的状态。在这行代码中,语句:

BOOL b1 = mylist4.SetItemState(1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
表示要选中第二行,并且同时将该行设置为当前行并获得焦点。其中,LVIS_SELECTED 和 LVIS_FOCUSED 分别表示列表视图控件的两个状态:选中状态和焦点状态。

但是,如果这行代码执行后没有显示选中效果,那么可能有以下几种原因:

列表视图控件当前没有获得焦点,即该控件不是当前处于激活状态的控件。这种情况下,即使设置了选中状态和焦点状态,也无法在界面上立即看到效果。解决方法是,让该控件成为当前激活的控件,或者使用CListCtrl::EnsureVisible()方法确保所选行可见。

列表视图控件中的第二行数据不存在或被删除。如果第二行数据不存在或被删除,那么即使设置了其选中状态和焦点状态,也不会在界面上看到效果。需要检查数据源是否正确,并确保第二行数据确实存在于列表视图控件中。

控件属性设置错误。可能在控件属性或初始化代码中禁用了选中状态或焦点状态,或者设置了不允许选中或不允许获取焦点的属性,导致无法正确显示选中效果。需要检查控件属性和初始化代码。

Anonymous 发表于 2023-4-29 18:49:25

CListCtrl::SetItemState是一个 MFC(Microsoft Foundation Classes)方法,用于设置 CListCtrl 控件中的列表项状态。在这里,您正在尝试设置第二行(索引为 1)为选中和聚焦状态。要正确显示选中状态,请确保您的 CListCtrl 控件具有 LVS_SHOWSELALWAYS 样式。这个样式会确保控件在失去焦点时仍然显示选中项。

要设置 LVS_SHOWSELALWAYS 样式,请在创建 CListCtrl 时,将它添加到控件的样式中。在对话框的 .cpp 文件中,您可以在DoDataExchange函数中添加此样式:

void CYourDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_YOUR_LISTCTRL, m_listCtrl);
    m_listCtrl.ModifyStyle(0, LVS_SHOWSELALWAYS);
}


其中IDC_YOUR_LISTCTRL是您的 CListCtrl 控件的资源 ID。

如果您已经添加了 LVS_SHOWSELALWAYS 样式,但仍然没有看到选中的行,请尝试调用CListCtrl::Update或CListCtrl::RedrawItems方法来强制重绘列表项:

BOOL b1 = mylist4.SetItemState(1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
mylist4.Update(1);
// 或者
mylist4.RedrawItems(1, 1);


最后,请确保在设置选中状态之前,CListCtrl 控件已经包含了至少两行数据。如果没有足够的数据行,设置状态的操作将不起作用。

Anonymous 发表于 2023-4-29 19:11:59

匿名者 发表于 2023-4-29 18:49
CListCtrl::SetItemState是一个 MFC(Microsoft Foundation Classes)方法,用于设置 CListCtrl 控件中的 ...

歌者,又是你吧
页: [1]
查看完整版本: CListCtrl-SetItemState