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

Макрос BEGIN_MESSAGE_MAP - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
12.07.2015, 10:42     Макрос BEGIN_MESSAGE_MAP #1
Пытаюсь разораться что делает макрос
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++
Если макрос на VBA переписать на С++, то макрос станет работать быстрее? C++
Макрос на с++ C++
C++ Сложный макрос
Разработайте макрос C++
Сложный макрос C++
C++ макрос препроцессора
C++ Макрос TRACE

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

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

Текущее время: 21:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru