2009-10-07 26 views
9

Quiero imprimir un mensaje usando MessageBox (o similar). También me gustaría controlar exactamente en qué parte de la pantalla aparece el cuadro, pero no puedo encontrar nada en la descripción de MessageBox que le permite controlar la ubicación. ¿Me he perdido algo? Si MessageBox no se puede usar, ¿hay alguna alternativa?Establecer la ubicación de MessageBox?

Por razones demasiado complejas para entrar aquí, preferiría una respuesta que no implique hacer mi propia ventana y pasar la dirección de una función de devolución de llamada.

Respuesta

12

Paso 1: Crear un gancho CBT controlar la creación del cuadro de mensaje:

// global hook procedure 
HHOOK hhookCBTProc = 0; 

LRESULT CALLBACK pfnCBTMsgBoxHook(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == HCBT_CREATEWND) 
    { 
    CREATESTRUCT *pcs = ((CBT_CREATEWND *)lParam)->lpcs; 

    if ((pcs->style & WS_DLGFRAME) || (pcs->style & WS_POPUP)) 
    { 
     HWND hwnd = (HWND)wParam; 

     // At this point you have the hwnd of the newly created 
     // message box that so you can position it at will 
     SetWindowPos(hwnd, ...); 
    } 
    } 

    return (CallNextHookEx(hhookCBTProc, nCode, wParam, lParam)); 
} 

Paso 2: Instalar/quitar el gancho antes y después de que muestra el cuadro de mensaje:

// set hook to center the message box that follows 
hhookCBTProc = SetWindowsHookEx(WH_CBT, 
           pfnCBTMsgBoxHook, 
           0, GetCurrentThreadId()); 

int sResult = MessageBox(hwndParent, pszMsg, pszTitle, usStyle); 

// remove the hook 
UnhookWindowsHookEx(hhookCBTProc); 
4

Si necesitaba un comportamiento adicional para un Messagebox, siempre creé mi propia ventana y la hice parecer como un MessageBox estándar. Lo haces bien una vez y siempre puedes reutilizarlo en otros proyectos.

3

de mensaje es básicamente un conjunto de valores predeterminados. No me gustan? Trae lo tuyo. Si no quiere una ventana real con todas sus complejidades, pero MessageBox es demasiado restrictiva, cree un cuadro de diálogo.