Установить местоположение MessageBox? - PullRequest
9 голосов
/ 07 октября 2009

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

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

Ответы [ 4 ]

12 голосов
/ 07 октября 2009

Шаг 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);
4 голосов
/ 07 октября 2009

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

3 голосов
/ 07 октября 2009

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

1 голос
/ 07 октября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...