2009-10-07 9 views
9

Je veux imprimer un message en utilisant MessageBox (ou similaire). Je voudrais également contrôler où exactement sur l'écran la boîte apparaît, mais ne peut rien trouver dans la description de MessageBox qui vous permet de contrôler l'emplacement. Ai-je manqué quelque chose? Si MessageBox ne peut pas être utilisé, alors existe-t-il une alternative?Définir l'emplacement de MessageBox?

Pour des raisons trop complexes pour entrer ici, je préférerais une réponse qui n'implique pas de faire ma propre fenêtre et de passer l'adresse d'une fonction de rappel.

Répondre

12

Etape 1: Insérer un crochet CBT pour piéger la création de la boîte de message:

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

Etape 2: installer/supprimer le crochet avant et après montrant la boîte de message:

// 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 j'avais besoin d'un comportement supplémentaire pour un MessageBox, j'ai toujours créé ma propre fenêtre et l'a fait ressembler à un MessageBox standard. Vous le faites correctement une fois et vous pouvez toujours le réutiliser dans d'autres projets.

1

Vous pouvez le faire avec une procédure de raccordement CBT. Il existe un article MSDN sur comment faire cela dans VB mais le convertir en C++ ne serait pas difficile.

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

3

MessageBox est essentiellement un ensemble de valeurs par défaut. Ne les aime pas? Apporte le tien. Si vous ne voulez pas une vraie fenêtre avec toutes ses complexités, mais que MessageBox est trop restrictring, créez un dialogue.

Questions connexes