鱼C论坛

 找回密码
 立即注册
查看: 628|回复: 3

[已解决]CListCtrl-SetItemState

[复制链接]
发表于 2023-4-29 18:47:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

                               
登录/注册后可看大图

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


我的问题:我想选中第二行,可是没有显示选中   ??
最佳答案
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 控件已经包含了至少两行数据。如果没有足够的数据行,设置状态的操作将不起作用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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()方法确保所选行可见。

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

控件属性设置错误。可能在控件属性或初始化代码中禁用了选中状态或焦点状态,或者设置了不允许选中或不允许获取焦点的属性,导致无法正确显示选中效果。需要检查控件属性和初始化代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

匿名鱼油
匿名鱼油  发表于 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 控件已经包含了至少两行数据。如果没有足够的数据行,设置状态的操作将不起作用。
回复 支持 反对

使用道具 举报

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

歌者,又是你吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 09:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表