Hello, All !
Не сочтите за труд.
Помогите разобраться.
Вопрос 1.
Не могу понять почему нельзя использовать DECLARE_MESSAGE_MAP()
во вложенном классе.
////// пример a.h /////
#if !defined(A_H)
#define A_H
#pragma once
#include "stdafx.h"
class A : public CDialog {
class B : public CButton {
public:
BOOL Create(CWnd* pParentWnd);
protected:
int m_b;
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
DECLARE_MESSAGE_MAP()
};
public:
A (CWnd* pParent = NULL); // standard constructor
protected:
int m_a;
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
};
#endif
////// пример a.cpp /////
BEGIN_MESSAGE_MAP(A::B, CButton)
ON_WM_DRAWITEM()
END_MESSAGE_MAP()
// <skip>
BEGIN_MESSAGE_MAP(A, CDialog)
// <skip>
END_MESSAGE_MAP()
// <skip>
/////////////////////////
Вобщем синтаксис как-бы позволяет описать для каждого класса свою карту обработки сообщений.
Однако компилятор этого понять не хочет ...
error C2327: 'B::CButton::CWnd::OnDrawItem' : member from enclosing class is not a type name, static, or enumerator
error C2248: 'OnDrawItem' : cannot access protected member declared in class 'CWnd'
Если из описания класса B убрать DECLARE_MESSAGE_MAP() и соответственно BEGIN...END из реализации,
то все чудесным образом начинает работать, и что совершенно непонятно —
кто-то вполне корректно дергает B::DrawItem.
Отсюда вопрос 2.
Кто вызывает B::DrawItem?
И на кой? Если, как говорится никто не просил.