2009-10-07 13 views
9

Desidero stampare un messaggio utilizzando MessageBox (o simile). Mi piacerebbe anche controllare dove esattamente appare sullo schermo la scatola ma non riesci a trovare nulla nella descrizione di MessageBox che ti permetta di controllare la posizione. Ho dimenticato qualcosa? Se MessageBox non può essere utilizzato, esiste un'alternativa?Imposta la posizione di MessageBox?

Per ragioni troppo complesse per entrare qui, preferirei una risposta che non riguardasse la creazione della mia finestra e il passaggio dell'indirizzo di una funzione di callback.

risposta

12

Fase 1: Creare un gancio CBT per intrappolare la creazione della finestra di messaggio:

// 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)); 
} 

Fase 2: Installare/Rimuovere il gancio prima e dopo mostra la finestra di messaggio:

// 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

Se avessi bisogno di un comportamento addizionale per un Messagebox, ho sempre creato la mia finestra e l'ho resa simile a un MessageBox standard. Lo fai una volta e puoi sempre riutilizzarlo in altri progetti.

1

È possibile eseguire questa operazione con una procedura di aggancio CBT. C'è un articolo su MSDN su come farlo in VB ma convertirlo in C++ non sarebbe difficile.

http://support.microsoft.com/kb/180936

3

MessageBox è un fondamentalmente un insieme di valori predefiniti. Non ti piacciono? Porta il tuo. Se non vuoi una finestra reale con tutte le sue complessità, ma MessageBox è troppo restrittivo, crea una finestra di dialogo.

Problemi correlati