¿Por qué la ventana no coloca el cursor correctamente?
Frecuentes
Visto 1,656 equipos
0
As MSDN describe:
Cuando el mouse se mueve sobre una ventana, la ventana recibe un
WM_SETCURSOR
mensaje (a menos que otra ventana haya capturado el ratón).Si la aplicación pasa
WM_SETCURSOR
aDefWindowProc
, laDefWindowProc
La función utiliza el siguiente algoritmo para establecer la imagen del cursor:
- Si la ventana tiene un padre, reenvía el
WM_SETCURSOR
mensaje al padre para manejar.- De lo contrario, si la ventana tiene un cursor de clase, establezca el cursor en el cursor de clase.
- Si no hay un cursor de clase, establezca el cursor en el cursor de flecha.
Y aquí está mi código fuente:
#include <tchar.h>
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInsTance, LPTSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wcex = { 0 };
HWND hWnd;
BOOL ret;
MSG msg;
wcex.cbSize = sizeof(wcex);
wcex.lpfnWndProc = WndProc;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
// wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.lpszClassName = TEXT("MainWindow");
wcex.hIconSm = wcex.hIcon;
RegisterClassEx(&wcex);
hWnd = CreateWindow(wcex.lpszClassName, TEXT("Test"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while (ret = GetMessage(&msg, NULL, 0, 0))
{
if (ret == -1)
{
return EXIT_FAILURE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(EXIT_SUCCESS);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
Cuando muevo el cursor rápidamente sobre la ventana, el cursor no cambia a una flecha, se convierte en una flecha de cambio de tamaño; si me fijo wcex.hCursor
a LoadCursor(NULL, IDC_ARROW)
, todo va a estar bien. Mi pregunta es: ¿por qué mi código no funciona como dice MSDN?
Quiero decir, si no me fijo wcex.hCursor
, y no manejo el WM_SETCURSOR
mensaje, el DefWindowProc
debería "establecer el cursor en el cursor de flecha", pero parece que no es así. ¿Porqué es eso?
1 Respuestas
4
Ver descripción de la hCursor
miembro de WNDCLASSEX
:
Un identificador para el cursor de clase. Este miembro debe ser un identificador de un recurso de cursor. Si este miembro es NULL, una aplicación debe establecer explícitamente la forma del cursor siempre que el mouse se mueva en la ventana de la aplicación.
Respondido 02 Jul 12, 09:07
@EFanZh, en otras palabras, debe manejar WM_CURSOR en su ciclo de eventos. - RojoX
Entonces, ¿por qué MSDN dice que DefWindowProc
actuará como "Si no hay un cursor de clase, establezca el cursor en el cursor de flecha". - EfanZh
@EFanZh No lo sé. Aparentemente es un error en el tutorial, que no es una documentación oficial de la API. - Dmitri Egorenkov
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c winapi cursor or haz tu propia pregunta.
Yo reproduzco. Ese artículo es simplemente incorrecto, sigue lo que te dicen los documentos para WM_SETCURSOR. - Hans Passant