Как сказал @Heinz Traub, проблема возникает из-за курсора, определенного в вызове RegisterClass
или RegisterClassEx
. У вас, вероятно, есть код вроде:
BOOL CMyWnd::RegisterWindowClass()
{
WNDCLASS wndcls;
// HINSTANCE hInst = AfxGetInstanceHandle();
HINSTANCE hInst = AfxGetResourceHandle();
if (!(::GetClassInfo(hInst, _T("MyCtrl"), &wndcls)))
{
// otherwise we need to register a new class
wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
wndcls.hInstance = hInst;
wndcls.hIcon = NULL;
wndcls.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
wndcls.hbrBackground = (HBRUSH) (COLOR_3DFACE + 1);
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = _T("MyCtrl");
if (!AfxRegisterClass(&wndcls))
{
AfxThrowResourceException();
return FALSE;
}
}
return TRUE;
}
где wndcls.hCursor
говорит, какой курсор будет использоваться при выдаче сообщения WM_SETCURSOR
; это происходит каждый раз, когда происходит движение мыши, и не только.
Я решил похожую проблему следующим образом:
В карте сообщений класса добавьте запись для сообщения WM_SETCURSOR
:
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
//... other messages
ON_WM_SETCURSOR()
END_MESSAGE_MAP()
Добавьте метод OnSetCursor
, который переопределит реализацию родительского класса:
BOOL CMyWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (SomeCondition())
return FALSE;
return __super::OnSetCursor(pWnd, nHitTest, message);
}
Объяснение: когда SomeCondition()
истинно, вы не будете вызывать реализацию родителя. Может быть, вы всегда хотите, чтобы курсор не заменял поведение родительского класса, поэтому вам просто нужен еще более короткий метод:
BOOL CMyWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
return FALSE;
}
И объявление метода в заголовочном файле:
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);