在对话框模板中,我放置了一个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个项目,其中一个已检查,并带有正确的字符串。但是,物品高度是错误的。似乎复选框的高度用于确定项目高度,导致文本与下面的项目重叠。
这个类的默认行为不应该是这个,而不必单独设置每个项目的高度吗?
答案 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);
}
};