Здравствуйте, 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 почти не сталкивался. Я не сторонник визардов, а ручной работы.
Здравствуйте, svnicks, Вы писали:
S>Имеется следующий код
S>[]
S>Можно ли просто обработать WM_MOUSELEAVE и не писать выше указанный код?
Можно добавить виртуальную функцию WindowProc
LRESULT Window::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_MOUSELEAVE:
//..
break;
//..
}
}
Здравствуйте, Чалый Николай, Вы писали:
ЧН>Можно добавить виртуальную функцию WindowProc
ЧН>ЧН>LRESULT Window::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
ЧН>{
ЧН> switch(message)
ЧН> {
ЧН> case WM_MOUSELEAVE:
ЧН> //..
ЧН> break;
ЧН> //..
ЧН> }
ЧН>}
ЧН>
Спасибо, это намного проще