我有一个高度可变的所有者绘制ListBox控件。当我调用AddString时,会发送一条MeasureItem消息,要求我告诉Windows项目的大小。问题是,代码还没有机会调用SetItemData,因此代码还不能确定大小。

我尝试过调用SetRedraw(FALSE),希望可以延迟测量请求,但是没有运气。

那么如何将一个项目添加到CListBox并同时传递项目数据呢?我尝试过使用LBS_HASSTRINGS,也可以不使用。不知道还有什么尝试。

最佳答案

如果您的列表框控件不具有LBS_HASSTRINGS样式,则AddString()的指针参数不被视为字符串,而是被视为项数据(请参见LB_ADDSTRING文档中的“备注”部分)。

因此,如果列表项包含字符串和某些项数据,则可以将这两条信息包装在结构或类中,然后将指向该包装器的指针传递给AddString()

好处是,在调用MeasureItem()时,字符串和项目数据都将可用。缺点是,如果对列表进行排序,则必须实现CompareItem(),并且在删除项目时以及销毁列表框控件之前都必须释放包装器。

08-25 21:10