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

Макрос BEGIN_MESSAGE_MAP - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Циклы while и for: в чем суть отличия? http://www.cyberforum.ru/cpp-beginners/thread1497526.html
Пытаюсь понять в чем суть отличия между этими циклами. Пишутся по разному, а по сути тоже самое. Можно ли написать цикл while таким образом, чтобы нельзя было сделать аналогичный цикл с for? или наоборот
C++ Сладкая олимпиадная задача Дан торт который порезан на m*n равных кусков и вы хотите иметь точно один фрукт на каждом куске. Давайте обозначим f(m,n) количество разных вариантов верхушек на торте с m разными фруктами(m ≥ 2), используя каждый фрукт на точно n кусках ( n ≥ 1). Reflections are considered distinct, rotations are not. (Эту строку не знаю как правильно перевести на русский) Например, f(2,1) = 1, f(2,2) =... http://www.cyberforum.ru/cpp-beginners/thread1497525.html
C++ График по формуле
Написал программу , но она не выводит консоль , в чем проблема? #include <GL/glut.h> #include <iostream> #include <math.h> #include <string> #include <fstream> #include <vector> int count = 0; // Размер масива У,Х float* X; // масив для хранение х-ов
Прерывания выполнения программы C++
Подскажите как реализовать подобрый алгоритм Крутиться цикл(условно бесконечный) При нажатии определенной клавиши происходит прерывания выполнения цикла и переход к подальшим действиям Добавлено через 1 час 26 минут Спасибо, разобрался.
C++ Усовершенствовать метод пузырьковой сортировки http://www.cyberforum.ru/cpp-beginners/thread1497434.html
Здравствуйте, хочу спросить, как можно усовершенствовать метод пузырьковой сортировки , таким способом, если количество перестановок равно 0, то сортировать массив больше нет нужды и остановить его, #include<iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { const int size=3; int Mas={5,4,3};
C++ Кто-нибудь может подробно объяснить, что такое allocators, зачем это и что с ними делать? Нигде не нашёл инфы Заранее спасибо. подробнее

Показать сообщение отдельно
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
12.07.2015, 10:42     Макрос BEGIN_MESSAGE_MAP
Пытаюсь разораться что делает макрос
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[].
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 14:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru