首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将CListBox重写为CCheckListBox

将CListBox重写为CCheckListBox
EN

Stack Overflow用户
提问于 2022-07-07 00:10:06
回答 1查看 268关注 0票数 1

我正在使用MFC和Visual 17开发一个C++应用程序。我在应用程序中有多个选项卡,其中一个当前使用CListBox实现,需要使用CCheckListBox重新实现。CCheckListBoxCListBox的一个子类。

我想在方框中显示一个唯一的CString向量。为了简单起见,我试着用CListBox制作选项卡,通过使用CListBox::AddString(),这完全符合我的要求。它按字母顺序排列字符串,当矢量有太多的CString而不能同时显示时,它会自动添加一个滚动条。

但是,当将CListBox变量交换为CCheckListBox变量时,我在按run时遇到了以下错误:

Debug Assertion Failed! ..... \mfc\winctrl3.cpp Line: 588

我找到了这个包含GitHub链路文件的winctrl3.cpp文件,在在线588中,有一个名为OnLButtonDblClk的函数,它对这里做了一些解释。

问题是,我不知道如何将变量从父类转换为子类。Windows类有这么大的不同吗?在我过去参加和编写的课程和程序中,从父变量切换到子变量是很简单的,但事实恰恰相反!

如有任何帮助,敬请见谅!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-07 06:25:10

在链接中的源文件的第588行中没有断言。github的上传可以追溯到2014年。为什么不在自己的Visual安装中搜索winctrl3.cpp源文件呢?在我自己的安装中,它位于函数PreSubclassWindow()中,并且确实有一个断言:

代码语言:javascript
复制
    // CCheckListBoxes must be owner drawn
    ASSERT(GetStyle() & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE));

也就是说,CCheckListBox必须是所有者绘制的.找到上面的CCheckListBox构造函数代码,您会注意到它调用了CListBox (父类)构造函数,应用了两种所有者绘制的样式之一。相反,CListBox构造函数使用CWnd::Create()窗口类名作为参数调用"LISTBOX"。也就是说,它似乎是一个MFC实现的控件,用所有者绘制的样式覆盖CListBox类.Win32文档中也没有提到本机“Check”类或样式。另外,CCheckListBox文档(在您发布的链接中)明确声明:CCheckListBox只适用于所有者绘制的控件,因为列表包含的不仅仅是文本字符串。

因此:

  • 如果使用资源脚本创建控件,则向控件添加所有者绘制样式(如LBS_OWNERDRAWFIXED) (或在属性编辑器中设置所有者绘制属性)。
  • 如果以编程方式创建控件,请确保调用的是CCheckListBox构造函数,而不是CListBox构造函数。

不清楚你对滚动条的意思(为什么你提到它),列表框不是自动显示滚动条(WS_VSCROLL样式或属性)吗?你必须自己做些什么吗?

编辑:

忘记提到,如果要使用资源脚本创建控件,请使用类向导向对话框类添加成员变量(“控件”类型,而不是“值”)。新变量必须是CCheckListBox (MFC类)类型。这将子类化控件。如果旧项目已经有一个CListBox成员变量,则将其更改为CCheckListBox

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72891033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档