Обработка WM_MOUSELEAVE
От: svnicks  
Дата: 16.09.03 11:41
Оценка:
Имеется следующий код
#define ON_WM_MOUSELEAVE() \
{ WM_MOUSELEAVE, 0, 0, 0, AfxSig_vv, \
(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)())&OnMouseLeave },
Понятно, что модифицируется обработка сообщения WM_MOUSELEAVE.
Объясните, пожалуйста, что это за нули, AfxSig_vv, AFX_PMSG и др.
и зачем столько писать в макросе?
Можно ли просто обработать WM_MOUSELEAVE и не писать выше указанный код?
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 почти не сталкивался. Я не сторонник визардов, а ручной работы.
Re: Обработка WM_MOUSELEAVE
От: Чалый Николай Беларусь  
Дата: 16.09.03 17:06
Оценка:
Здравствуйте, svnicks, Вы писали:

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

S>[]
S>Можно ли просто обработать WM_MOUSELEAVE и не писать выше указанный код?

Можно добавить виртуальную функцию WindowProc


LRESULT Window::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
   switch(message)
  {
    case WM_MOUSELEAVE:
    //..
    break;
    //..
  }
}
Re: Обработка WM_MOUSELEAVE
От: Vadim B  
Дата: 16.09.03 21:01
Оценка: +1
Здравствуйте, svnicks, Вы писали:

S>Понятно, что модифицируется обработка сообщения WM_MOUSELEAVE.


Нет. Добавляется строка в таблицу сообщений, которая анализируется фреймвоком при обработке каждого пришедшего сообщения.

S>Объясните, пожалуйста, что это за нули, AfxSig_vv, AFX_PMSG и др.


Если это действительно интересно, то нужно посмотреть структуру таблицы в исходниках MFC. Хотя в 99% случаев для работы это не нужно.

S>Можно ли просто обработать WM_MOUSELEAVE и не писать выше указанный код?


Можно, но зачем? Если используешь MFC — используй те методы, которые в нем приняты, будет и проще, и понятнее. Если не хочешь их использовать — не пользуйся MFC.
Re[2]: Обработка WM_MOUSELEAVE
От: svnicks  
Дата: 17.09.03 06:52
Оценка:
Здравствуйте, Чалый Николай, Вы писали:

ЧН>Можно добавить виртуальную функцию WindowProc


ЧН>
ЧН>LRESULT Window::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
ЧН>{
ЧН>   switch(message)
ЧН>  {
ЧН>    case WM_MOUSELEAVE:
ЧН>    //..
ЧН>    break;
ЧН>    //..
ЧН>  }
ЧН>}
ЧН>


Спасибо, это намного проще
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.