Сообщение WM_MOUSELEAVE
От: Cherny  
Дата: 06.05.04 18:58
Оценка:
Подскажите, как в MFC обработать сообщение WM_MOUSELEAVE. Предопределённого макроса для

этого сообщения в MFC нет.
Re: Сообщение WM_MOUSELEAVE
От: molostov  
Дата: 06.05.04 19:47
Оценка:
Здравствуйте, Cherny, Вы писали:

C>Подскажите, как в MFC обработать сообщение WM_MOUSELEAVE. Предопределённого макроса для


C>этого сообщения в MFC нет.


Что означает "в MFC нет". Если окну посылается это сообщение, то не важно с помощью чего это окно создано: с помощью классов MFC или напрямую API функциями.
Если визард не показывает это сообщение, значит надо делать самому ручками:
1. Добавить функцию обработчик в класс окна.
2. Добавить в карту сообщений ON_MESSAGE для MOUSELEAVE.

Для дополнительной информации почитайте в MSDN раздел "Message Maps"
Re: Сообщение WM_MOUSELEAVE
От: Shhady Россия  
Дата: 06.05.04 19:56
Оценка:
Здравствуйте, Cherny, Вы писали:

C>Подскажите, как в MFC обработать сообщение WM_MOUSELEAVE. Предопределённого макроса для


C>этого сообщения в MFC нет.


В своём производным от CWnd классе добавляешь
...
public:
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);


в cpp
...
BEGIN_MESSAGE_MAP(..., ...)
...
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
...
END_MESSAGE_MAP()

...
LRESULT ...::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
    свой код
    return true;
}
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
Re: Сообщение WM_MOUSELEAVE
От: logogin  
Дата: 06.05.04 20:01
Оценка:
Здравствуйте, Cherny, Вы писали:

C>Подскажите, как в MFC обработать сообщение WM_MOUSELEAVE. Предопределённого макроса для


C>этого сообщения в MFC нет.


Думаю, что так:

//{{AFX_MSG(...)
...................
    afx_msg LRESULT OnMouseLeave( WPARAM, LPARAM );
...................
    //}}AFX_MSG
DECLARE_MESSAGE_MAP()


Это в header-файле.

BEGIN_MESSAGE_MAP(...,...)
    //{{AFX_MSG_MAP(...)
.................
ON_MESSAGE( WM_MOUSELEAVE, OnMouseLeave )
.................
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


Это в cpp-файле
Re[2]: Сообщение WM_MOUSELEAVE
От: molostov  
Дата: 06.05.04 20:04
Оценка:
Здравствуйте, Shhady, Вы писали:

S>Здравствуйте, Cherny, Вы писали:


C>>Подскажите, как в MFC обработать сообщение WM_MOUSELEAVE. Предопределённого макроса для


C>>этого сообщения в MFC нет.


S>В своём производным от CWnd классе добавляешь

S>
S>...
S>public:
S>afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
S>


S>в cpp

S>
S>...
S>BEGIN_MESSAGE_MAP(..., ...)
S>...
S>ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
S>...
S>END_MESSAGE_MAP()

S>...
S>LRESULT ...::OnMouseLeave(WPARAM wParam, LPARAM lParam)
S>{
S>    свой код
S>    return true;
S>}
S>


Все верно, вот только возвращать надо не bool, а какой-нить LRESULT.
Re[3]: Сообщение WM_MOUSELEAVE
От: Shhady Россия  
Дата: 06.05.04 20:16
Оценка:
Здравствуйте, molostov, Вы писали:

M>Здравствуйте, Shhady, Вы писали:


S>>Здравствуйте, Cherny, Вы писали:


C>>>Подскажите, как в MFC обработать сообщение WM_MOUSELEAVE. Предопределённого макроса для


C>>>этого сообщения в MFC нет.


S>>В своём производным от CWnd классе добавляешь

S>>
S>>...
S>>public:
S>>afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
S>>


S>>в cpp

S>>
S>>...
S>>BEGIN_MESSAGE_MAP(..., ...)
S>>...
S>>ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
S>>...
S>>END_MESSAGE_MAP()

S>>...
S>>LRESULT ...::OnMouseLeave(WPARAM wParam, LPARAM lParam)
S>>{
S>>    свой код
S>>    return true;
S>>}
S>>


M>Все верно, вот только возвращать надо не bool, а какой-нить LRESULT.


ок.
return 0
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
Re[3]: Сообщение WM_MOUSELEAVE
От: mukos СССР  
Дата: 25.02.05 12:55
Оценка:
Здравствуйте, molostov, Вы писали:

M>Здравствуйте, Shhady, Вы писали:


S>>Здравствуйте, Cherny, Вы писали:


C>>>Подскажите, как в MFC обработать сообщение WM_MOUSELEAVE. Предопределённого макроса для


C>>>этого сообщения в MFC нет.


S>>В своём производным от CWnd классе добавляешь

S>>
S>>...
S>>public:
S>>afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
S>>


S>>в cpp

S>>
S>>...
S>>BEGIN_MESSAGE_MAP(..., ...)
S>>...
S>>ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
S>>...
S>>END_MESSAGE_MAP()

S>>...
S>>LRESULT ...::OnMouseLeave(WPARAM wParam, LPARAM lParam)
S>>{
S>>    свой код
S>>    return true;
S>>}
S>>


M>Все верно, вот только возвращать надо не bool, а какой-нить LRESULT.


Да хрена лысого......
у мфсях видимо не ловится это сообщение в очереди сообщений
поэтому его в списке обрабатываемых сообщений и нет......
Конечно можно поковырять в отладчике ихний WindowProc
но думаю бессмысленно....
Приходиться выкручиваться через NCMOUSEMOVE.......
голимо конечно, но не править же мфсишную библиотеку f.ck
Re: Сообщение WM_MOUSELEAVE
От: _const_  
Дата: 25.02.05 13:30
Оценка: 2 (1)
Здравствуйте, Cherny, Вы писали:

C>Подскажите, как в MFC обработать сообщение WM_MOUSELEAVE. Предопределённого макроса для


C>этого сообщения в MFC нет.


В OnMouseMove вставляешь след. строки:


    TRACKMOUSEEVENT te;
    te.cbSize = sizeof(te);
    te.dwFlags = TME_LEAVE;
    te.hwndTrack = m_hWnd;
    te.dwHoverTime = HOVER_DEFAULT;
    if (!::_TrackMouseEvent(&te))
        TRACE("Track ERROR!\n");


Ну и добавляешь стандартный обработчик сообщения, как об этом уже сказали.
В .h:
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);


В .cpp:

BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
    //{{AFX_MSG_MAP(CDumpDlg)
    ON_WM_MOUSEMOVE()
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()

LRESULT CMyWnd::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
...
    return 0;
}
Re[4]: Сообщение WM_MOUSELEAVE
От: mukos СССР  
Дата: 25.02.05 13:46
Оценка:
M>Да хрена лысого......
M>у мфсях видимо не ловится это сообщение в очереди сообщений
M>поэтому его в списке обрабатываемых сообщений и нет......
M>Конечно можно поковырять в отладчике ихний WindowProc
M>но думаю бессмысленно....
M>Приходиться выкручиваться через NCMOUSEMOVE.......
M>голимо конечно, но не править же мфсишную библиотеку f.ck

Вообщето выход есть-
я правда не попробовал ....да и не буду
лень....
Если только перегрузить WindowProc- есть такая возможность в MFC
Re[5]: Сообщение WM_MOUSELEAVE
От: mukos СССР  
Дата: 25.02.05 13:59
Оценка:
Здравствуйте, mukos, Вы писали:

M>>Да хрена лысого......

M>>у мфсях видимо не ловится это сообщение в очереди сообщений
M>>поэтому его в списке обрабатываемых сообщений и нет......
M>>Конечно можно поковырять в отладчике ихний WindowProc
M>>но думаю бессмысленно....
M>>Приходиться выкручиваться через NCMOUSEMOVE.......
M>>голимо конечно, но не править же мфсишную библиотеку f.ck

M>Вообщето выход есть-

M>я правда не попробовал ....да и не буду
M>лень....
M>Если только перегрузить WindowProc- есть такая возможность в MFC

и опять хрена лысого...
Код такой
//DEL LRESULT CCondition::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
//DEL {
//DEL if(message==WM_MOUSELEAVE)
//DEL MessageBox("FuckIt");
//DEL return CDialog::WindowProc(message, wParam, lParam);
//DEL }
по идее ведь должно работать
Если у кого есть соображения милости прошу muko21@inbox.ru
Re[6]: Сообщение WM_MOUSELEAVE
От: _const_  
Дата: 25.02.05 14:12
Оценка:
Здравствуйте, mukos, Вы писали:

M>Здравствуйте, mukos, Вы писали:


M>>>Да хрена лысого......

M>>>у мфсях видимо не ловится это сообщение в очереди сообщений
M>>>поэтому его в списке обрабатываемых сообщений и нет......
M>>>Конечно можно поковырять в отладчике ихний WindowProc
M>>>но думаю бессмысленно....
M>>>Приходиться выкручиваться через NCMOUSEMOVE.......
M>>>голимо конечно, но не править же мфсишную библиотеку f.ck

M>>Вообщето выход есть-

M>>я правда не попробовал ....да и не буду
M>>лень....
M>>Если только перегрузить WindowProc- есть такая возможность в MFC

M>и опять хрена лысого...

M>Код такой
M>//DEL LRESULT CCondition::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
M>//DEL {
M>//DEL if(message==WM_MOUSELEAVE)
M>//DEL MessageBox("FuckIt");
M>//DEL return CDialog::WindowProc(message, wParam, lParam);
M>//DEL }
M> по идее ведь должно работать
M>Если у кого есть соображения милости прошу muko21@inbox.ru

Да все там ловится! Читай все сообщения темы и MSDN!
Re[7]: Сообщение WM_MOUSELEAVE
От: Аноним  
Дата: 28.02.05 11:07
Оценка:
Здравствуйте, _const_, Вы писали:

__>Здравствуйте, mukos, Вы писали:


M>>Здравствуйте, mukos, Вы писали:


M>>>>Да хрена лысого......

M>>>>у мфсях видимо не ловится это сообщение в очереди сообщений
M>>>>поэтому его в списке обрабатываемых сообщений и нет......
M>>>>Конечно можно поковырять в отладчике ихний WindowProc
M>>>>но думаю бессмысленно....
M>>>>Приходиться выкручиваться через NCMOUSEMOVE.......
M>>>>голимо конечно, но не править же мфсишную библиотеку f.ck

M>>>Вообщето выход есть-

M>>>я правда не попробовал ....да и не буду
M>>>лень....
M>>>Если только перегрузить WindowProc- есть такая возможность в MFC

M>>и опять хрена лысого...

M>>Код такой
M>>//DEL LRESULT CCondition::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
M>>//DEL {
M>>//DEL if(message==WM_MOUSELEAVE)
M>>//DEL MessageBox("FuckIt");
M>>//DEL return CDialog::WindowProc(message, wParam, lParam);
M>>//DEL }
M>> по идее ведь должно работать
M>>Если у кого есть соображения милости прошу muko21@inbox.ru

__>Да все там ловится! Читай все сообщения темы и MSD


А я знаете ли просто так написал......
даже не разу не попробовал
Пришлите пожалуйста работающий код .....
который проверен ..... а не так что вот это типа должно работать
Re[6]: Сообщение WM_MOUSELEAVE
От: Pavel Dvorkin Россия  
Дата: 28.02.05 11:13
Оценка:
Здравствуйте, mukos, Вы писали:

M>//DEL LRESULT CCondition::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)

M>//DEL {
M>//DEL if(message==WM_MOUSELEAVE)
M>//DEL MessageBox("FuckIt");
M>//DEL return CDialog::WindowProc(message, wParam, lParam);
M>//DEL }
M> по идее ведь должно работать
M>Если у кого есть соображения милости прошу muko21@inbox.ru

TrackMouseEvent вызывал ?
With best regards
Pavel Dvorkin
Re[8]: Сообщение WM_MOUSELEAVE
От: Аноним  
Дата: 28.02.05 11:24
Оценка:
Здравствуйте, Аноним, Вы писали:


А>А я знаете ли просто так написал......

А>даже не разу не попробовал
А> Пришлите пожалуйста работающий код .....
А>который проверен ..... а не так что вот это типа должно работать


В OnMouseMove вставляешь след. строки:

[ccode]
TRACKMOUSEEVENT te;
te.cbSize = sizeof(te);
te.dwFlags = TME_LEAVE;
te.hwndTrack = m_hWnd;
te.dwHoverTime = HOVER_DEFAULT;
if (!::_TrackMouseEvent(&te))
TRACE("Track ERROR!\n");
[\ccode]


Ну и добавляешь стандартный обработчик сообщения, как об этом уже сказали.
В .h:
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);



В .cpp:

BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
//{{AFX_MSG_MAP(CDumpDlg)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()

LRESULT CMyWnd::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
...
return 0;
}
Re[8]: Сообщение WM_MOUSELEAVE
От: _const_  
Дата: 28.02.05 11:29
Оценка:
Сорри, не на ту кнопку нажал.
Этот код проверен и работает... Только красоту не наводил.

В OnMouseMove:

    TRACKMOUSEEVENT te;
    te.cbSize = sizeof(te);
    te.dwFlags = TME_LEAVE;
    te.hwndTrack = m_hWnd;
    te.dwHoverTime = HOVER_DEFAULT;
    if (!::_TrackMouseEvent(&te))
        TRACE("Track ERROR!\n");


В .h:
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);



В .cpp:
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
    //{{AFX_MSG_MAP(CDumpDlg)
    ON_WM_MOUSEMOVE()
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()

LRESULT CMyWnd::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
...
    TRACE("LEAVE!\n");
    return 0;
}
Re[9]: Сообщение WM_MOUSELEAVE
От: Аноним  
Дата: 28.02.05 12:15
Оценка:
Здравствуйте, _const_, Вы писали:

__>Сорри, не на ту кнопку нажал.

__>Этот код проверен и работает... Только красоту не наводил.

__>В OnMouseMove:

__>

__>    TRACKMOUSEEVENT te;
__>    te.cbSize = sizeof(te);
__>    te.dwFlags = TME_LEAVE;
__>    te.hwndTrack = m_hWnd;
__>    te.dwHoverTime = HOVER_DEFAULT;
__>    if (!::_TrackMouseEvent(&te))
__>        TRACE("Track ERROR!\n");
__>


__>В .h:

__>
__>afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
__>



__>В .cpp:

__>
__>BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
__>    //{{AFX_MSG_MAP(CDumpDlg)
__>    ON_WM_MOUSEMOVE()
__>    //}}AFX_MSG_MAP
__>    ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
__>END_MESSAGE_MAP()

__>LRESULT CMyWnd::OnMouseLeave(WPARAM wParam, LPARAM lParam)
__>{
__>...
__>    TRACE("LEAVE!\n");
__>    return 0;
__>}
__>


Спасибо

Я действительно был не прав....
Моя невнимательность при чтении MSDN
Думал что сообщение генерируется самой виндой по типу MOUSEMOVE....
и еще раз спасибо за указанные недостатки
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.