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

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

1 голос
/ 04 августа 2010
  • BS_OWNERDRAW? Это стиль кнопки.
  • Даже с LBS_OWNERDRAWFIXED вам все равно нужно обрабатывать WM_MEASUREITEM.
  • Некоторые стили элемента управления (например, LBS_OWNERDRAWFIXED) могут * только быть установлены при создании элемента управления. стиль в коде?)

Эта ветка форума также может помочь ...

...