为什么无法调用我的所有者绘制列表框的DrawItem方法

时间:2010-08-04 09:24:01

标签: winapi listbox wtl ownerdrawn ondrawitem

我尝试用WTL编写一个所有者绘制列表框。我的代码看起来像这样

template<class T, class TBase = CListBox, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CMyListBoxImpl : 
   public CWindowImpl< T, TBase, TWinTraits >,
   public COwnerDraw< T >
{
...
BEGIN_MSG_MAP(CMyListBoxImpl)
    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
    MESSAGE_HANDLER(WM_SIZE, OnSize) 
    MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
    CHAIN_MSG_MAP(COwnerDraw< T >)
    DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()

...

void Init()
{
    ...
    ModifyStyle(0, BS_OWNERDRAW | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS);
    ...
}
void DrawItem(LPDRAWITEMSTRUCT lpdis)
{
  ...

我还在父级的消息循环中添加了REFLECT_NOTIFICATIONS,并在属性表中将Owner Draw设置为Fixed。但我还是收不到这条消息。然后我使用spy ++来检查列表框收到的消息,我发现了一些非常奇怪的消息(WM_USER+7211)。
我的操作系统是WinXp并使用VS2008。

1 个答案:

答案 0 :(得分:1)

  • BS_OWNERDRAW?这是一种按钮式。
  • 即使使用LBS_OWNERDRAWFIXED,您仍然需要处理WM_MEASUREITEM。
  • 某些控件样式(如)LBS_OWNERDRAWFIXED可以在创建控件时设置 (这是你的意思是“并将属性表中的所有者绘制设置为固定”?,如果是这样,为什么修改代码中的样式?)

This forum thread也可能有所帮助...