C/Visual C - ¿Equivalente de DOEVENTS en VISUAL C++ 5.0?

 
Vista:
sin imagen de perfil

¿Equivalente de DOEVENTS en VISUAL C++ 5.0?

Publicado por Fernando (4 intervenciones) el 25/04/2003 21:26:20
Hola, ¿como puedo implementar un programa en Visual C++ 5.0 con el equivalente al doevents de Visual Basic para permitir que otros programa puedan coger el control?.

Gracias.
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

Implementación de funcionalidad equivalente a DOEVENTS en Visual C++ 5.0

Publicado por Alejandro (1190 intervenciones) el 19/05/2025 20:03:47
Para implementar una funcionalidad equivalente a `DOEVENTS` de Visual Basic en Visual C++ 5.0, puedes utilizar un bucle de mensajes que permita que tu aplicación procese otros eventos del sistema, como la entrada del ratón o del teclado, y permita que otros programas tomen el control. Aquí te muestro cómo hacerlo:

1. Bucle de mensajes:
- En Visual C++, puedes usar un bucle de mensajes para procesar eventos. Esto se puede hacer utilizando la función `PeekMessage` para verificar si hay mensajes en la cola de mensajes y luego procesarlos con `TranslateMessage` y `DispatchMessage`.

2. Ejemplo de implementación:
- Aquí tienes un ejemplo básico de cómo podrías implementar esta funcionalidad en tu aplicación:

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
#include <windows.h>
 
// Prototipo de la función de ventana
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
    // Registro de la clase de ventana
    const char CLASS_NAME[] = "MiVentanaClase";
    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;
 
    RegisterClass(&wc);
 
    // Creación de la ventana
    HWND hwnd = CreateWindowEx(0, CLASS_NAME, "Mi Aplicación", WS_OVERLAPPEDWINDOW,
                                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                                NULL, NULL, hInstance, NULL);
 
    ShowWindow(hwnd, nShowCmd);
 
    // Bucle de mensajes
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
 
        // Aquí puedes manejar otros mensajes
 
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}
 
void DoEvents() {
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

3. Uso de la función DoEvents:
- Puedes llamar a la función `DoEvents()` en cualquier parte de tu código donde necesites permitir que otros programas tomen el control. Por ejemplo, si tienes un bucle que realiza una tarea larga, puedes insertar `DoEvents()` dentro del bucle para permitir que la interfaz de usuario siga respondiendo y que otros eventos sean procesados.

1
2
3
4
5
6
7
for (int i = 0; i < 100; i++) {
    // Realiza una tarea
    Sleep(100); // Simula una tarea que toma tiempo
 
    // Permite que otros eventos sean procesados
    DoEvents();
}

Consideraciones:


- Rendimiento: Ten en cuenta que el uso excesivo de `DoEvents()` puede afectar el rendimiento de tu aplicación, ya que introduce un bucle adicional para procesar mensajes.
- Interacción con otros programas: Este enfoque permite que tu aplicación siga siendo receptiva mientras se ejecutan otras tareas, pero no garantiza que otros programas tomen el control de inmediato.

¡Buena suerte con tu proyecto, Fernando!
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