Установить местоположение MessageBox?

Я хочу распечатать сообщение с помощью MessageBox (или аналогичного). Я также хотел бы контролировать, где именно на экране появляется окно, но не могу найти ничего в описании MessageBox, что позволяет вам контролировать местоположение. Я что-то пропустил? Если нельзя использовать MessageBox, то есть ли альтернатива?

По причинам слишком сложным, чтобы вдаваться в них, я бы предпочел ответ, который не включал создание моего собственного окна и передачу адреса функции обратного вызова.


person Mick    schedule 07.10.2009    source источник


Ответы (4)


Шаг 1. Создайте ловушку CBT, чтобы перехватывать создание окна сообщения:

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

Шаг 2. Установите/удалите хук до и после отображения окна сообщения:

// 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);
person Blake7    schedule 07.10.2009

Если мне нужно было дополнительное поведение для Messagebox, я всегда создавал собственное окно и делал его похожим на стандартный MessageBox. Вы делаете это правильно один раз, и вы всегда можете повторно использовать это в других проектах.

person TalkingCode    schedule 07.10.2009

MessageBox — это в основном набор значений по умолчанию. Не нравятся они? Принести свои собственные. Если вам не нужно настоящее окно со всеми его сложностями, но MessageBox слишком ограничивает, создайте диалог.

person MSalters    schedule 07.10.2009

Вы можете сделать это с помощью процедуры ловушки CBT. В MSDN есть статья о том, как это сделать в VB, но преобразовать ее в C++ не составит труда.

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

person Rob    schedule 07.10.2009