Здравствуйте, Андрей, Вы писали:
А>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
Пытаюсь, там вроде все логично...