描述:
用ATL作的DLL中如何在OnMouseMove中识别鼠标是否在指定范围内?
解决方案1:
需要使用TRACKMOUSEEVENT,具体:
void CALLBACK
TrackMouseTimerProc(HWND hWnd,UINT uMsg,UINT idEvent,DWORD dwTime) {
RECT rect;
POINT pt;
GetClientRect(hWnd,&rect);
MapWindowPoints(hWnd,NULL,(LPPOINT)&rect,2);
GetCursorPos(&pt);
if (!PtInRect(&rect,pt) || (WindowFromPoint(pt) != hWnd)) {
if (!KillTimer(hWnd,idEvent)) {
// Error killing the timer!
}
PostMessage(hWnd,WM_MOUSELEAVE,0,0);
}
}
BOOL TrackMouseEvent(LPTRACKMOUSEEVENT ptme) {
OutputDebugString(TEXT("TrackMouseEvent\n"));
if (!ptme || ptme->cbSize < sizeof(TRACKMOUSEEVENT)) {
OutputDebugString(TEXT("TrackMouseEvent: invalid "
"TRACKMOUSEEVENT structure\n"));
return FALSE;
}
if (!IsWindow(ptme->hwndTrack)) {
OutputDebugString(
TEXT("TrackMouseEvent: invalid hwndTrack\n"));
return FALSE;
}
if (!(ptme->dwFlags & TME_LEAVE)) {
OutputDebugString(TEXT("TrackMouseEvent: invalid dwFlags\n"));
return FALSE;
}
return SetTimer(ptme->hwndTrack, ptme->dwFlags,
100,(TIMERPROC)TrackMouseTimerProc);
}
void CMouseOutDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (!fInWindow)
{
fInWindow = TRUE;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = GetSafeHwnd();
if (!TrackMouseEvent(&tme)) {
AfxMessageBox("fail");
}
}
CDialog::OnMouseMove(nFlags, point);
}
void CMouseOutDlg::OnLeave()
{
fInWindow = FALSE;
AfxMessageBox("out");
}
fInWindow是CMouseOutDlg的类变量,初值false;
别忘了加上ON_MESSAGE(WM_MOUSELEAVE, OnLeave)
GuanZhu
解决方案3:范围缩小一个象素试试
解决方案4: skyron(我编程,我存在) 的思路
但在你的 ATL 中要加入 一个 lib
你自己查查,TRACKMOUSEEVENT
要详细的,发短消息给我