C ++: Как центрировать MessageBox? - PullRequest
1 голос
/ 10 июня 2011

Использование Visual Studio C ++ с MFC. Как центрировать MessageBox в его родительском окне? В настоящее время он центрируется на рабочем столе.

Ответы [ 4 ]

3 голосов
/ 12 июня 2011

:: AfxMessageBox () появляется в центре MainFrame для меня. По сути, это вызов :: MessageBox () с дескриптором MainFrame в качестве первого параметра. Разве это не работает для вас?

0 голосов
/ 16 апреля 2019

Вам нужно установить хук и изменить положение диалогового окна при создании.

HHOOK hHookCBT{};

int MessageBoxCentered(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
{
    // Center message box at its parent window
    hHookCBT = SetWindowsHookEx(WH_CBT,
        [](int nCode, WPARAM wParam, LPARAM lParam) -> LRESULT
        {
            if (nCode == HCBT_CREATEWND)
            {
                if (((LPCBT_CREATEWND)lParam)->lpcs->lpszClass == (LPWSTR)(ATOM)32770)  // #32770 = dialog box class
                {
                    RECT rcParent{};
                    GetWindowRect(((LPCBT_CREATEWND)lParam)->lpcs->hwndParent, &rcParent);
                    ((LPCBT_CREATEWND)lParam)->lpcs->x = rcParent.left + ((rcParent.right - rcParent.left) - ((LPCBT_CREATEWND)lParam)->lpcs->cx) / 2;
                    ((LPCBT_CREATEWND)lParam)->lpcs->y = rcParent.top + ((rcParent.bottom - rcParent.top) - ((LPCBT_CREATEWND)lParam)->lpcs->cy) / 2;
                }
            }

            return CallNextHookEx(hHookCBT, nCode, wParam, lParam);
        },
        0, GetCurrentThreadId());

    int iRet{ MessageBox(hWnd, lpText, lpCaption, uType) };

    UnhookWindowsHookEx(hHookCBT);

    return iRet;
}
0 голосов
/ 25 мая 2012

Кто сказал "не могу"?

Попробуйте:

Это для Win32 API, написано на C. Переведите его, как вам нужно ...

case WM_NOTIFY:{
  HWND X=FindWindow("#32770",NULL);
  if(GetParent(X)==H_frame){int Px,Py,Sx,Sy; RECT R1,R2;
    GetWindowRect(hwnd,&R1); GetWindowRect(X,&R2);
    Sx=R2.right-R2.left,Px=R1.left+(R1.right-R1.left)/2-Sx/2;
    Sy=R2.bottom-R2.top,Py=R1.top+(R1.bottom-R1.top)/2-Sy/2;
    MoveWindow(X,Px,Py,Sx,Sy,1);
  }
} break;

Добавьте это к коду WndProc ... Вы можете установить положение так, как вам нравится, в этом случае оно просто центрируется в главном окне программы.Это будет сделано для любого окна сообщения, или диалога открытия / сохранения файла, и, вероятно, некоторых других собственных элементов управления.Я не уверен, но я думаю, что вам может понадобиться включить COMMCTRL или COMMDLG, чтобы использовать это, по крайней мере, вы захотите, если хотите открыть / сохранить диалоги.

Я экспериментировал с просмотром кодов уведомлений и hwndFromНМГДР, то решил, что это так же эффективно, и гораздо проще, а не так.Если вы действительно хотите быть очень конкретным, попросите FindWindow найти уникальный заголовок (заголовок), который вы даете тому окну, которое хотите найти.

Это срабатывает до того, как окно сообщений отображается на экране, поэтому, если вы установитеглобальный флаг, который указывает, когда ваш код выполняет действие, и ищет уникальную подпись; вы должны быть уверены, что выполняемые вами действия будут происходить только один раз (вероятно, будет несколько уведомителей).Я не изучал это подробно, но мне удалось заставить CreateWindow поместить поле редактирования в диалоговое окно сообщения.Это выглядело так неуместно, как ухо крысы, привитое к позвоночнику клонированной свиньи, но это работает.Делать так можно гораздо проще, чем кататься самостоятельно.

Ворона.

РЕДАКТИРОВАТЬ: Небольшое исправление для решения проблемы, поднятой Раймондом Ченом.Убедитесь, что родительские дескрипторы согласуются во всем, и это должно работать нормально.Это для меня, даже с двумя экземплярами одной и той же программы ...

0 голосов
/ 10 июня 2011

Вы не можете. Вот почему многие люди пишут свои собственные классы MessageBox.

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