我正在使用MFC和Visual 17开发一个C++应用程序。我在应用程序中有多个选项卡,其中一个当前使用CListBox实现,需要使用CCheckListBox重新实现。CCheckListBox是CListBox的一个子类。
我想在方框中显示一个唯一的CString向量。为了简单起见,我试着用CListBox制作选项卡,通过使用CListBox::AddString(),这完全符合我的要求。它按字母顺序排列字符串,当矢量有太多的CString而不能同时显示时,它会自动添加一个滚动条。
但是,当将CListBox变量交换为CCheckListBox变量时,我在按run时遇到了以下错误:
Debug Assertion Failed! ..... \mfc\winctrl3.cpp Line: 588
我找到了这个包含GitHub链路文件的winctrl3.cpp文件,在在线588中,有一个名为OnLButtonDblClk的函数,它对这里做了一些解释。
问题是,我不知道如何将变量从父类转换为子类。Windows类有这么大的不同吗?在我过去参加和编写的课程和程序中,从父变量切换到子变量是很简单的,但事实恰恰相反!
如有任何帮助,敬请见谅!
发布于 2022-07-07 06:25:10
在链接中的源文件的第588行中没有断言。github的上传可以追溯到2014年。为什么不在自己的Visual安装中搜索winctrl3.cpp源文件呢?在我自己的安装中,它位于函数PreSubclassWindow()中,并且确实有一个断言:
// 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。
https://stackoverflow.com/questions/72891033
复制相似问题