Como @Heinz Traub dijo que el problema proviene del cursor definido en la llamada RegisterClass
o RegisterClassEx
. Es probable que tenga un código como:
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;
}
donde el wndcls.hCursor
dice lo que va a ser utilizado cursor cuando se lanza WM_SETCURSOR
mensaje; sucede cada vez que ocurre un movimiento del mouse y no solo.
He resuelto un problema similar de esta manera:
En la clase mapa de mensajes añadir una entrada para el mensaje WM_SETCURSOR
:
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
//... other messages
ON_WM_SETCURSOR()
END_MESSAGE_MAP()
Añadir el método OnSetCursor
, lo que cancelaría la clase padre aplicación :
BOOL CMyWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (SomeCondition())
return FALSE;
return __super::OnSetCursor(pWnd, nHitTest, message);
}
Explicación: cuando SomeCondition()
es cierto, no se llama a la implementación de los padres.Puede ser que usted desee tener siempre un cursor no son anulados con el comportamiento de la clase padre, por lo que sólo necesita un método aún más corto:
BOOL CMyWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
return FALSE;
}
y la declaración del método en el archivo de cabecera es:
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
Cambiar a NULL no resolvió el problema. En lugar de permitir que el cursor cambie, el cursor siempre fue <-> en lugar de la flecha normal. Y los mensajes de los mensajes WM_SETCURSOR siempre se estaban enviando, ya que pude verificar el uso de Spy ++ de 64 bits. Sin embargo, subí porque me hiciste aprender algo nuevo. – sergiol