/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

MessageBox

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
LunatikO



Registrado: 24 Sep 2007
Mensajes: 9
Ubicación: La Luna (de Valencia)

MensajePublicado: 12/11/2007 2:59 pm
Título: MessageBox

Hola a todos.

Veréis, tengo un programilla, hecho en Dev-C++, estos típicos por línea de comandos. El caso es que hago una llamada a la API MessageBox (windows.h). Funciona a la parfección, pero lo que pasa es que se queda detrás de la ventana de la consola de comandos, y en la barra de tareas aparece como un programa a parte. La utilizo así:

Código:

#include <windows.h>
int main()
{
  //... todo el código del programa
  c=MessageBox(0,Mensaje,Titulo,MB_YESNO+MB_ICONQUESTION);
}


Funciona muy bien, pero pasa eso, que se queda detrás, y no es muy estético. He probado con:

Código:

c=MessabeBox(GetModuleHandle(NULL),Mensaje,Titulo,MB_OK+MB_ICONQUESTION);


pero entonces el mensaje no se muestra, y "c" bueno, ya tiene valores de antes, pero no sé que le pasaría si estuviera sin inicializar.

¿Qué puedo hacer para visualizar el mensaje correctamente?

Gracias desde ya.

Salu2.
_________________
Comité Contra las Faltas Voluntarias y el Lenguaje SMS:


Ultima edición por LunatikO el 16/11/2007 6:25 am; editado 1 vez
Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 120
Ubicación: Argentina

MensajePublicado: 12/11/2007 4:57 pm
Título:

El argumento 0 para el primer parámetro indica HWND_DESKTOP, por eso si funciona el primer ejemplo.
No debes utilizar la función GetModuleHandle ya que no devuelve el "handle" o controlador de la ventana, ni siquiera es el tipo que espera la función MessageBox(HWND....).
No deberias utilizar el operador + para "concatenar" los diferentes tipos de estados, en cambio debes utilizar el operador |.
Para que el cuadro de mensaje no pase a segundo plano debes utilizar el estado MB_TOPMOST, pero esto no quita que puedas mover la Consola. La solución a esto está documentada, este es el código de ejemplo:
Código:

int main(void)
{
    HWND hWnd = GetConsoleHwnd();

    MessageBox(hWnd,(LPCTSTR)"Texto",(LPCTSTR)"Titulo",MB_TOPMOST | MB_ICONEXCLAMATION);
    return EXIT_SUCCESS;
}


Código:


HWND GetConsoleHwnd(void)
{
    #define MY_BUFSIZE 1024 // buffer size for console window titles
    HWND hwndFound;         // this is what is returned to the caller

    char pszNewWindowTitle[MY_BUFSIZE]; // contains fabricated WindowTitle
    char pszOldWindowTitle[MY_BUFSIZE]; // contains original WindowTitle

    // fetch current window title

    GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);

    // format a "unique" NewWindowTitle

    wsprintf(pszNewWindowTitle,"%d/%d",
                GetTickCount(),
                GetCurrentProcessId());

    // change current window title

    SetConsoleTitle(pszNewWindowTitle);

    // ensure window title has been updated

    Sleep(40);

    // look for NewWindowTitle

    hwndFound=FindWindow(NULL, pszNewWindowTitle);

    // restore original window title

    SetConsoleTitle(pszOldWindowTitle);

    return(hwndFound);
}


Saludos.
Volver arriba
LunatikO



Registrado: 24 Sep 2007
Mensajes: 9
Ubicación: La Luna (de Valencia)

MensajePublicado: 13/11/2007 2:55 am
Título:

Gracias.

Ya imaginaba que el primer parámetro tenía que ser Handle de mi ventana de comandos, pero no sabía cómo indicárselo.


En cuanto a lo de usar | en vez de +, te puedo decir con seguridad que da lo mismo. Puedes comprobarlo sumando dos números, primero en base 10 y después en base 2. Comprobarás que es lo mismo que usar | bit a bit en el número.

Además, el + funciona perfectamente.

Saludos.


P.D.: creo que sumando cualquier número no funciona, pero sí con los valores MB_OK MB_YESNO MB_ICONINFORMATION... por que están declarados (en binario) así:

000001
000010
000100
001000
010000
...

para que ambos operadores | y + puedan funcionar.

P.P.D.: Escribo en el foro de principiantes porque soy principiante en C, pero en realidad soy programador en Pascal desde hace tiempo.



Salu2 de nuevo.
_________________
Comité Contra las Faltas Voluntarias y el Lenguaje SMS:
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com