Re[2]: Что не так?
От: Jambo  
Дата: 09.01.04 22:40
Оценка:
Здравствуйте, Андрей, Вы писали:

А>1. Если ты написал ON_WM_DRAWITEM(), то ты должен написать реализацию метода OnDrawItem — компилятор тебе об этом и говорит.


Спасибо здесь я немного прорзрел. Я почему-то искренне верил, что в ответ на сообщение WM_DRAWITEM будет дергаться именно мой виртуальный DrawItem. про OnDrawItem я почемуто не подумал. Собственно это твое замечание больше помогло найти ответ на второй вопрос.
Первый все равно пока висит...
Дело в следующем, (забыл сразу об этом написать)
Если вложенный класс B вынуть из A

/// new пример a.h /////
// <skip>
class B : public CButton {

       public:
       BOOL Create(CWnd* pParentWnd);
       protected:
       int m_b;
       virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
       DECLARE_MESSAGE_MAP()
};

class A : public CDialog {
       public:
       A (CWnd* pParent = NULL);   // standard constructor
       protected:
       int m_a;
       virtual BOOL OnInitDialog();
       DECLARE_MESSAGE_MAP()
};
//////////////////////////////

Реализация та же, только поправлены имена классов, я ее здесь опускаю,
то выясняется две вещи.
1. Не надо реализовывать никакой OnDrawItem, — на это ответ уже найден,
перехват WM_DRAWITEM здесь вообще оказался лишним, хотя всетаки кто-то его
обрабатывает, наверное-какой нибудь родитель, вобщем ясно, что дело не в нем.
2. Все лихо компилится и корректно работает.
Вывод: /возможно не правильный/
Нежелание компилятора скушать первый вариант — очень сильно связано именно с вложенностью классов.

А>2. Ты же описал метод DrawItem, вот компилятор его и дергает А чтобы он вызывался, никакой карты сообщений не надо. Именно из метода OnDrawItem и дергаются вирутальные методы DrawItem.

Совершенно верно для DrawItem, карта действительно не нужна. Например в CButton он сделан специально для кнопарей со стилем BS_OWNERDRAW
само-рисующиеся кнопочки, если можно так выразится..
Но дело-то не только в нем (простото ради краткости перехват др. сообщений я не описывал), для других WM_* все осталось по преженму — первый пример не компилится
хоть тресни.

А>А в остальном, насколько я помню, вполне возможно использовать макросы сообщений во вложенных классах.

В начале я тоже в этом не сомневался...


А>В общем, смотри исходники MFC


Пытаюсь, там вроде все логично...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.