Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

Макрос BEGIN_MESSAGE_MAP - C++

12.07.2015, 10:42. Просмотров 494. Ответов 0
Метки нет (Все метки)

Пытаюсь разораться что делает макрос
C++
1
BEGIN_MESSAGE_MAP(CSpaceship,CCmdTarget)
Там код получается неясный, вот определение самого макроса:
C++
1
2
3
4
5
6
7
8
9
10
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
    PTM_WARNING_DISABLE \
    const AFX_MSGMAP* theClass::GetMessageMap() const \
        { return GetThisMessageMap(); } \
    const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() \
    { \
        typedef theClass ThisClass;                        \
        typedef baseClass TheBaseClass;                    \
        static const AFX_MSGMAP_ENTRY _messageEntries[] =  \
        {
Получается он создает две функции: обертку-GetMessageMap из которой вызывается GetThisMessageMap
От сама функция GetThisMessageMap не ясная, что в ней происходит?
Там создаются два на класс и на базовый класс ThisClass и TheBaseClass. И происходит инициализация массива указателей или что то не ясно?
AFX_MSGMAP_ENTRY - это структура
вот ее определение:
C++
1
2
3
4
5
struct AFX_MSGMAP
{
    const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
    const AFX_MSGMAP_ENTRY* lpEntries;
};
Она содержит какую то неясную строку (PASCAL* pfnGetBaseMap)(), Что это такое? PASCAL - это __stdcall. И что эта строка
C++
1
const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
означает, я что то ниче не пойму что за синтаксис, что это получается такая фигня?
C++
1
const AFX_MSGMAP* (__stdcall* pfnGetBaseMap)();
не ясно что это за синтаксис такой. Ну это похоже на указатель но почему там еще в конце пустые скобки как у функции?

AFX_MSGMAP_ENTRY* - это структура вот ее определение:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
struct AFX_MSGMAP_ENTRY
{
    UINT nMessage;   // windows message
    UINT nCode;      // control code or WM_NOTIFY code
    UINT nID;        // control ID (or 0 for windows messages)
    UINT nLastID;    // used for entries specifying a range of control id's
    UINT_PTR nSig;       // signature type (action) or pointer to message #
    AFX_PMSG pfn;    // routine to call (or special value)
};


C++
1
const AFX_MSGMAP* (__stdcall* pfnGetBaseMap)();
Что это? Это указатель на функцию чтоли?

И для более ясности посмотрим определение макроса END_MESSAGE_MAP
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
#define END_MESSAGE_MAP() \
        {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \
    }; \
        static const AFX_MSGMAP messageMap = \
        { &TheBaseClass::GetThisMessageMap, &_messageEntries[0] }; \
        return &messageMap; \
    }                                 \
    PTM_WARNING_RESTORE


C++
1
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 }
Это строка что инициализирует указатель на структуры AFX_MSGMAP_ENTRY*
Перед этими скобками идет целый список макросов, ну в принципе только что я догадался что это в скобках, это инициализация последнего элемента массива указателей типо чтобы последний элемент был инициализирован такой строкой. , но там же вписывается целый ряд макросов такого вида например ON_WM_PAINT() и его определение:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
#define ON_WM_PAINT() \
    { WM_PAINT, 0, 0, 0, AfxSig_vv, \
        (AFX_PMSG)(AFX_PMSGW) \
        (static_cast< void (AFX_MSG_CALL CWnd::*)(void) > ( &ThisClass :: OnPaint)) },

Мы видим 6 параметров, то есть инициализация структуры одного элемента происходит через {}, Последний параметр это хз что это такое. От эта строчка ничего не ясно что она означает:
C++
1
2
(AFX_PMSG)(AFX_PMSGW) \
        (static_cast< void (AFX_MSG_CALL CWnd::*)(void) > ( &ThisClass :: OnPaint))
Глянем 6 параметр структуры AFX_MSGMAP_ENTRY, это AFX_PMSG pfn; и определение макроса AFX_PMSG:
Кликните здесь для просмотра всего текста
C++
1
2
3
#define AFX_MSG_CALL
#endif
typedef void (AFX_MSG_CALL CCmdTarget::*AFX_PMSG)(void);
И на что оно похоже? Похоже на указатель на класс CCmdTarget:: какого то метода из этого класса да? Ниче не ясно.

Добавлено через 11 минут
Вот реальная карта сообщений:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
BEGIN_MESSAGE_MAP(Ctest_timerDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_WM_TIMER()       // реагировать на таймер
    ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)//собственная функция
 
    ON_MESSAGE(WM_THREADENDED,OnThreadEnded)
 
    ON_BN_CLICKED(IDC_BUTTON1, &Ctest_timerDlg::OnBnClickedButton1)
    ON_BN_CLICKED(IDC_BUTTON2, &Ctest_timerDlg::OnBnClickedButton2)
    ON_BN_CLICKED(IDC_BUTTON3, &Ctest_timerDlg::OnBnClickedButton3)
    ON_BN_CLICKED(IDC_BUTTON4, &Ctest_timerDlg::OnBnClickedButton4)
    ON_BN_CLICKED(IDC_BUTTON5, &Ctest_timerDlg::OnBnClickedButton5)
END_MESSAGE_MAP()

Получается что все эти макросы: ON_WM_SYSCOMMAND,ON_WM_PAINT,ON_WM_QUERYDRAGICON и т.д. они преобразуются в {} с шестью параметрами для инициализации массива структур static const AFX_MSGMAP_ENTRY _messageEntries[].
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2015, 10:42     Макрос BEGIN_MESSAGE_MAP
Посмотрите здесь:

Макрос на с++ - C++
Здравствуйте, надо разработать макрос type(x,y) который объявляет x как некий тип с именем y.

Макрос - C++
Как в макросе интовское число разделить на число с запятой?

макрос COMBINE - C++
Доброго времени суток. Дан код: #define SUFFIX 5 #define COMBINE(a,b) COMBINE1(a,b) #define COMBINE1(a,b) ...

Разработайте макрос - C++
Очень нужна ваша помощь, скоро контрольная, а я никак не могу разобраться 2. Разработайте макрос tolower(c) который преобразует символ c...

Реализуйте макрос - C++
Реализуйте макрос MAX от трёх параметров, который присваивает целочисленной (int) переменной, переданной в качестве третьего аргумента,...

Сложный макрос - C++
Создать макрос buffer(n) который резервирует в памяти буфер емкостью n байтов и при каждом обращении выдает адрес очередного байта или...

Макрос-класс? - C++
Привет всем! Порылся в источниках teeworlds и нашёл вот что: class IClient : public IInterface { MACRO_INTERFACE(&quot;client&quot;, 0) ...

Макрос MyAssert - C++
Всем привет! Снова обращаюсь к вам за помощью. Задание такое: &quot;Напишите макрос MyAssert, который выводит сообщение об ошибке, имя файла...

Макрос DPrint - C++
С предыдущим я заданием я уже разобрался, а вот со следующим: &quot;Напишите макрос DPrint , проверяющий наличие режима отладки, и если режим...

Сложный макрос - C++
В книге была задача, написать макрос, определяющий массив типа Type, который называется Name, имеет Number элементов, и все элементы...

Макрос TRACE - C++
Здорова! Часто вижу в коде TRACE, но что то ничего не пойму что он делает, вот есть код: #include &lt;iostream&gt; using std::cout; ...

Не работает макрос - C++
Добрый день. Есть макросы:#define ACTION(var, value) int var = value; #define EXEC_ACTION(value, handler, ...) handler(value,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru