Почему метод DrawItem моего владельца списка рисования не может быть вызван

Я пытаюсь написать список рисования владельца с помощью 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 ответ

Решение
  • BS_OWNERDRAW? Это стиль кнопки.
  • Даже с LBS_OWNERDRAWFIXED вам все равно нужно обрабатывать WM_MEASUREITEM.
  • Некоторые стили элемента управления (например, LBS_OWNERDRAWFIXED) могут быть установлены только при создании элемента управления (это то, что вы подразумеваете под "и задаете для параметра" Владелец рисования "значение" Фиксированный на листе свойств "?", Если да, зачем изменять стиль в коде?)

Эта ветка форума также может быть полезна...

Другие вопросы по тегам