Re: Обработка WM_MOUSELEAVE
От: Alexmoon Украина  
Дата: 16.09.03 12:53
Оценка:
Здравствуйте, svnicks, Вы писали:

S>Имеется следующий код

S>#define ON_WM_MOUSELEAVE() \
S> { WM_MOUSELEAVE, 0, 0, 0, AfxSig_vv, \
S> (AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)())&OnMouseLeave },
S>Понятно, что модифицируется обработка сообщения WM_MOUSELEAVE.
S>Объясните, пожалуйста, что это за нули, AfxSig_vv, AFX_PMSG и др.
S>и зачем столько писать в макросе?
S>Можно ли просто обработать WM_MOUSELEAVE и не писать выше указанный код?
Начнем с того, что этот вопрос нужно писать в MFC форум.
Посмотрел я только что макросы DECLARE_MESSAGE_MAP(), BEGIN_MESSAGE_MAP(theClass, baseClass), END_MESSAGE_MAP()
Но раз написал, то ладно. Первый просто объявляет массив _messageEntries[], а второй фактически открывает список его инициализации. Каждый внутренний макрос просто декларирует его отдельный элемент, который представялет из себя
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)
};

Вкратце вот в принципе и все. Я думаю дальше этого массива ты врядли сможешь убежать, поскольку WndProc данного класса от тебя скрыта и ту остается только добавлять элементы в массив согласно правилам. А если хочешь проще, то на первый взгляд разве что просто добавлять в класс объявление обработчика, перекрывать оконную процедуру для окна твоего класса и там обрабатывать все что нужно, а что нет вызывать дефолтную и тот обботчик, который объявлен в массиве _messageEntries.
Точнее сказать не могу. С MFC почти не сталкивался. Я не сторонник визардов, а ручной работы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.