Что не так?
От: Jambo  
Дата: 09.01.04 04:54
Оценка:
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?
И на кой? Если, как говорится никто не просил.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.