C/Visual C - PushButton

 
Vista:

PushButton

Publicado por Daniela (1 intervención) el 31/05/2003 21:28:45
Hola a todos!
Soy Daniela desde Uruguay, y estoy escribiendo un código para crear un simple botón usando el WinAPI, encontré esto: hwndButton = CreateWindowEx (), lo cual hizo que mi boton apareciese en mi ventana, pero lo que no he podido hacer y no he encontrado es como hacer para saber si el mouse
está sobre el botón, o ha salido.... ¿se entiende? bueno si saben algo de esto, algun ejmeplo, lo que sea estaría muy agradecida, y tendría que ser usando WinAPI no el MFC ya que recién estoy empezando..

Mil Gracias

Daniela =)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Detectar el movimiento del mouse sobre un botón usando WinAPI

Publicado por Alejandro (1286 intervenciones) el 01/07/2025 20:50:23
¡Hola Daniela!

Entiendo que estás buscando una manera de detectar si el mouse está sobre un botón en una aplicación de Windows utilizando la API de Windows (WinAPI). Para lograr esto, puedes utilizar el mensaje `WM_MOUSEMOVE` para detectar el movimiento del mouse y verificar si las coordenadas del mouse están dentro del área del botón.

A continuación, te muestro un ejemplo simple de cómo puedes implementar esto:

Código de ejemplo:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    static HWND hwndButton;
    static int buttonX, buttonY, buttonWidth, buttonHeight;
 
    switch (msg) {
        case WM_CREATE:
            // Crear un botón
            hwndButton = CreateWindowEx(
                0, "BUTTON", "Haz clic aquí",
                WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
                50, 50, 150, 30,
                hwnd, (HMENU)1, NULL, NULL);
            break;
 
        case WM_MOUSEMOVE: {
            // Obtener la posición del mouse
            int mouseX = LOWORD(lParam);
            int mouseY = HIWORD(lParam);
 
            // Obtener las dimensiones del botón
            RECT buttonRect;
            GetWindowRect(hwndButton, &buttonRect);
            buttonX = buttonRect.left;
            buttonY = buttonRect.top;
            buttonWidth = buttonRect.right - buttonRect.left;
            buttonHeight = buttonRect.bottom - buttonRect.top;
 
            // Verificar si el mouse está sobre el botón
            if (mouseX >= buttonX && mouseX <= buttonX + buttonWidth &&
                mouseY >= buttonY && mouseY <= buttonY + buttonHeight) {
                SetCursor(LoadCursor(NULL, IDC_HAND)); // Cambiar el cursor
            } else {
                SetCursor(LoadCursor(NULL, IDC_ARROW)); // Cursor por defecto
            }
            break;
        }
 
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    const char *className = "MiVentana";
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = className;
 
    RegisterClass(&wc);
    HWND hwnd = CreateWindow(className, "Ejemplo de botón", WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT, 300, 200,
                              NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
 
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

Explicación del código:



1. Incluir bibliotecas: Se incluye `windows.h` para utilizar la API de Windows.

2. Función `WndProc`: Esta es la función de procedimiento de la ventana que maneja los mensajes enviados a la ventana.
- WM_CREATE: Se crea un botón utilizando `CreateWindowEx`. El botón se coloca en la posición (50, 50) y tiene un tamaño de 150x30 píxeles.
- WM_MOUSEMOVE: Se maneja el movimiento del mouse. Se obtienen las coordenadas del mouse y se verifica si están dentro del área del botón. Si el mouse está sobre el botón, se cambia el cursor a una mano (`IDC_HAND`); de lo contrario, se restablece al cursor por defecto (`IDC_ARROW`).
- WM_DESTROY: Se maneja el cierre de la ventana y se envía un mensaje para salir del bucle de mensajes.

3. Función `WinMain`: Esta es la función principal de la aplicación.
- Se registra la clase de la ventana y se crea la ventana principal.
- Se muestra la ventana y se inicia el bucle de mensajes.

Cómo funciona:


- Cuando mueves el mouse sobre la ventana, el programa recibe el mensaje `WM_MOUSEMOVE`.
- Se obtienen las coordenadas del mouse y se comparan con las dimensiones del botón.
- Si el mouse está sobre el botón, el cursor cambia a una mano, indicando que puedes hacer clic en él.

Notas:


- Asegúrate de compilar el código en un entorno que soporte WinAPI, como Visual Studio.
- Puedes personalizar el botón y la ventana según tus necesidades.

Espero que esto te ayude a avanzar en tu proyecto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar