2009-10-07 14 views
9

Chcę wydrukować wiadomość za pomocą MessageBox (lub podobnego). Chciałbym również kontrolować, gdzie dokładnie na ekranie pojawia się pudełko, ale nie mogę znaleźć nic w opisie MessageBox, który pozwala kontrolować lokalizację. Przegapiłem coś? Jeśli nie można użyć MessageBox, czy istnieje alternatywa?Ustaw lokalizację MessageBox?

Z powodów zbyt skomplikowanych, aby tu wejść, wolałbym odpowiedź, która nie wymagałaby utworzenia własnego okna i podania adresu funkcji zwrotnej.

Odpowiedz

12

Etap 1: utworzyć hak CBT pułapkę utworzenie komunikat:

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

Etap 2: montaż/demontaż hak przed i po pokazano komunikat:

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

Jeśli potrzebowałem dodatkowego zachowania dla skrzynki wiadomości, zawsze tworzyłem własne okno i wyglądałem jak standardowy MessageBox. Robisz to raz na raz i zawsze możesz użyć go ponownie w innych projektach.

3

MessageBox to w zasadzie zestaw domyślnych. Nie lubisz ich? Przynieś własne. Jeśli nie chcesz prawdziwego okna ze wszystkimi jego złożonościami, ale MessageBox jest zbyt restrykcyjny, utwórz okno dialogowe.