1

我使用了一个派生自 的类CListBox,并使用以下方法创建它:

style:WS_CHILD|WS_VISIBLE |LBS_OWNERDRAWFIXED | WS_VSCROLL | WS_HSCROLL

我希望 ListBox 的项目具有固定大小,不受列表框大小的影响。所以我重写了 MeasureItem() 方法,在该方法中我指定了项目的大小,如下所示:

void CMyListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
    lpMIS->itemHeight = ALBUM_ITEM_HEIGHT;
    lpMIS->itemWidth = ALBUM_ITEM_WIDTH;
}

但是项目的大小会随着列表框大小的变化而变化。我的方法有什么问题吗?

4

2 回答 2

1

参考资料中没有提到的是每次调整控件大小时WM_MEASUREITEM都会调用它。*_OWNERDRAWFIXED

然而,我不知道这种行为有多正式以及是否应该依赖它,但它已经在CodeGuru和谷歌上的几个论坛帖子中得到验证。

如果您不想处理该消息,则只需在第一次OnMeasureItem()调用中的某处设置一个私有标志,并在您下次检查它是否已设置时立即返回。

于 2009-07-14T14:46:18.567 回答
0

如果您查看该MSDN条目,CListBox::MeasureItem您会发现它只被调用一次,除非设置了LBS_OWNERDRAWVARIABLE(not LBS_OWNERDRAWFIXED) 样式。如果我理解正确,那么这将解释您所看到的行为,因为MeasureItem每次控件的大小更改时都需要调用它。

另外,您是否考虑过MFC 技术说明 14:自定义控件中提出的要点?

于 2008-10-31T11:19:36.473 回答