VC中CCheckListBox显示时崩溃的原因及解决方法

     CCheckListBox可以实现带CheckBox的ListBox,VC6自带,头文件Afxwin.h;
     但不支持托放式加入界面(再次骂下开发VC的MS人员,UI支持超级弱智!)。

     有个方法比较简单,在窗口拖放一个CListBox(不会不知道是哪个吧?那就撞墙好了。),ID是IDC_LIST1,在类向导器里创建一个Control型变量,如m_List,在窗口类里将会有

  1. CListBox m_List;   //将CListBox修改成CCheckListBox;

    直接这样还是不行滴!直接运行你会发现显示(已插入Item情况下)或点那个listbox时(listbox还空着,未插入Item情况下)会崩溃,debug会停留在list的DrawItem方法。

    让我们看看这个类的DrawItem方法:

  1. void CCheckListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  2. {
  3.     // You must override DrawItem and MeasureItem for LBS_OWNERDRAWVARIABLE
  4.     ASSERT((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS)) ==
  5.         (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS));

     也就是说它的style必须要有LBS_OWNERDRAWFIXED(列表中的所有项的高度都相同)或LBS_OWNERDRAWVARIABLE(列表中项的高度各不相同)两种style之一,还必须要有 LBS_HASSTRINGS 样式;否则是会ASSERT的。

    其中,LBS_HASSTRING样式在MSDN中的解释是:

LBS_HASSTRINGS   Specifies an owner-draw list box that contains items consisting of strings. The list box maintains the memory and pointers for the strings so the application can use the GetText member function to retrieve the text for a particular item.

 

     再让我们看看它的Create方法:

  1. BOOL CCheckListBox::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
  2. {
  3.     if (!(dwStyle & LBS_OWNERDRAWVARIABLE)) //must be one or the other
  4.         dwStyle |= LBS_OWNERDRAWFIXED;
  5.     return CListBox::Create(dwStyle, rect, pParentWnd, nID);
  6. }

      这段代码会自动给你添加LBS_OWNERDRAWVARIABLE或是LBS_OWNERDRAWFIXED样式;

 

      在MSDN里,CCheckListBox::Create方法里有段介绍
dwStyle
Specifies the style of the checklist box. The style must be either LBS_OWNERDRAWFIXED (all items in the list are the same height) or LBS_OWNERDRAWVARIABLE (items in the list are of varying heights).

 

      因此,我们必须在设置这两个样式之一;若是使用Create方法创建,可以设置第一个参数;若是使用前文介绍的方法创建的,可以在IDE中设置:在ListBox属性对话框的Style页面,左下角的“Owner draw:”菜单选后两个选项之一。其中选择Fixed样式后,将不支持选项的多列显示。若下图所示。

  

     另,还有一种方法可以添加这两种样式,即使用 ModifyStyle 方法!该方法由祖类 CWnd 类提供。用于修改样式。

 

    对于 LBS_HASSTRINGS 样式,IDE提供的设置方法是属性对话框的 Styles页面的“Has Strings”复选框,它默认是未选中状态,所以切记把它给勾上。如下图:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值