【问题标题】:Why the DrawItem method of my owner draw listbox can't be called为什么我的所有者绘制列表框的DrawItem方法不能调用
【发布时间】:2011-03-25 04:01:56
【问题描述】:

我尝试用 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++查看了listbox收到的消息,发现了一些很奇怪的消息(WM_USER+7211)。
我的操作系统是WinXp,使用VS2008。

【问题讨论】:

  • ModifyStyle 为时已晚,创建窗口时必须打开该标志。不知道在 WTL 中是如何做到的。

标签: winapi listbox wtl ownerdrawn ondrawitem


【解决方案1】:
  • BS_OWNERDRAW?那是一种按钮样式。
  • 即使使用 LBS_OWNERDRAWFIXED,您仍然需要处理 WM_MEASUREITEM。
  • 某些控件样式(例如)LBS_OWNERDRAWFIXED只能在创建控件时设置(这就是您所说的“在属性表中将 Owner Draw 设置为 Fixed”的意思吗?如果是,为什么修改代码中的样式?)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-14
    • 2010-12-12
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多