在对话框模板中,我放置了一个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个项目和一个检查,使用正确的字符串。但是,物品高度是错误的。似乎复选框的高度用于确定项目高度,导致文本与下面的项目重叠。
这个类的默认行为不应该是这个,没有我必须单独设置每个项目的高度?
来自MSDN:
如果您的核对表框是默认核对表框(每个左侧都有默认大小的复选框的字符串列表),您可以使用默认的CCheckListBox :: DrawItem来绘制核对表框。否则,您必须覆盖CListBox :: CompareItem函数和CCheckListBox :: DrawItem和CCheckListBox :: MeasureItem函数。
看起来您需要调用默认实现或实现自己的MesaureItem / DrawItem。这可能是项目似乎重叠的原因。
在复选框中,字符串大小写以下内容可能足以防止重叠:
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);
}
};