即使我在MeasureItem()方法中指定大小,更改列表框大小时CListBox的项大小也会更改?

时间:2008-10-31 10:14:07

标签: mfc ownerdrawn clistbox

我使用了一个派生自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;
}

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

2 个答案:

答案 0 :(得分:1)

参考文献中未提及的是每次调整WM_MEASUREITEM控件时*_OWNERDRAWFIXED被称为

我不知道,这种行为的官方程度如何以及是否应该依赖,但已经在CodeGuru和Google上发现的几个论坛帖子进行了验证。

如果您不想处理该消息,那么只需在第一个OnMeasureItem()调用中的某个地方设置一个私有标记,并在检查下次设置它时立即从中返回。

答案 1 :(得分:0)

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

另外,您是否考虑了MFC Technical Note 14 : Custom Controls中的观点?