| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
LunatikO
Registrado: 24 Sep 2007 Mensajes: 9 Ubicación: La Luna (de Valencia)
| Publicado: 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
| Publicado: 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)
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |