MFC:CCheckListBox项重叠

问题描述 投票:0回答:2

在对话框模板中,我放置了一个ListBox,因为在可视布局选项中没有显示选中的列表框。我将它设置为owner-draw并使用DDX进行设置,将关联的类变量从CListBox类型更改为CCheckListBox - 换句话说,我从向导为我做的唯一更改是set owner-draw,并且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个项目和一个检查,使用正确的字符串。但是,物品高度是错误的。似乎复选框的高度用于确定项目高度,导致文本与下面的项目重叠。

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

mfc visual-studio-2005 winapi
2个回答
1
投票

来自MSDN:

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

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


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);
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.