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

发布于 2024-09-13 07:26:45 字数 962 浏览 6 评论 0 原文

我尝试用 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。

I try to write a owner draw listbox with WTL. My code looks like this

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)
{
  ...

I also added REFLECT_NOTIFICATIONS in the parent's message loop, and set Owner Draw to Fixed in property sheet. But I still can't receive the message. Then I used spy++ to examine the message that the listbox receive, I found some message that is very strange (WM_USER+7211).
My os is WinXp and use VS2008.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

红焚 2024-09-20 07:26:45
  • BS_OWNERDRAW?那是一个按钮样式。
  • 即使使用 LBS_OWNERDRAWFIXED,您仍然需要处理 WM_MEASUREITEM。
  • 某些控件样式(例如)LBS_OWNERDRAWFIXED 只能在创建控件时设置(这就是您所说的“并在属性表中将 Owner Draw 设置为固定”的意思吗?如果是这样,为什么要修改样式在代码中?)

此论坛主题也可能有帮助...

  • BS_OWNERDRAW? That is a button style.
  • Even with LBS_OWNERDRAWFIXED, you still need to handle WM_MEASUREITEM.
  • Some control styles (like) LBS_OWNERDRAWFIXED can only be set when the control is created (Is that what you mean by "and set Owner Draw to Fixed in property sheet"?, if so, why modify the style in code?)

This forum thread might also be of help...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文