MFC:CCheckListBox项重叠

时间:2010-06-30 09:26:38

标签: mfc visual-studio-2005 winapi

在对话框模板中,我放置了一个ListBox,因为在可视布局选项中没有显示选中的列表框。我将它设置为owner-draw并使用DDX进行设置,将关联的类变量从CListBox类型更改为CCheckListBox - 换句话说,我从向导为我做的唯一更改是设置所有者绘制,并且为成员设置chnage变量类型。

在我的对话框的OnInitDialog方法中,然后用:

进行测试
m_List.AddString(_T("One"));
m_List.AddString(_T("Two"));
m_List.AddString(_T("Three"));
m_List.AddString(_T("Four"));
m_List.SetCheck(1,1);

当我运行列表时,有4个项目,其中一个已检查,并带有正确的字符串。但是,物品高度是错误的。似乎复选框的高度用于确定项目高度,导致文本与下面的项目重叠。

这个类的默认行为不应该是这个,而不必单独设置每个项目的高度吗?

2 个答案:

答案 0 :(得分:1)

来自MSDN:

  

如果您的核对表框是默认值   清单框(带有字符串的列表)   默认大小的复选框   每个左边),你可以使用默认值   CCheckListBox :: DrawItem来绘制   清单框。否则,你必须   覆盖CListBox :: CompareItem   功能和   CCheckListBox :: DrawItem和   CCheckListBox :: MeasureItem函数。

看起来您需要调用默认实现或实现自己的MesaureItem / DrawItem。这可能是项目似乎重叠的原因。

答案 1 :(得分:0)

在复选框的字符串情况下,以下内容可能足以防止重叠:

class CCheckListBoxEx : public CCheckListBox
{
public:
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
        // set item height once:    
        if ((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS)) ==
                          (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS)  && m_cyText == 0)
        {
            SetItemHeight(0, CalcMinimumItemHeight() + 2);
        }

        // add some space between box and string: 
        lpDrawItemStruct->rcItem.left += 2;

        CCheckListBox::DrawItem(lpDrawItemStruct);
    }
};