Как передвинуть MessageBox
От: Sproot_ Россия  
Дата: 23.09.04 14:51
Оценка:
Коллеги, буду несказанно признателен за посильную помощь...
Суть проблемы в следующем:
Есть приложение, которое создает второй поток, в котором, в свою очередь, вызывается MessageBox... этот бокс появляется по середине экрана...
Так вот, хотелось бы, чтоб этот мессаджбокс появлялся отцентровано, относительно главного окна приложения, хэндл этого окна мы имеем, хэндл мессаджбокса, соответственно, нет...
Просто вызов ::MessageBox(hwndMainWnd, "bla-bla", "bla-bla", MB_OK); — не проходит.
Подскажите, пожалуйста, как можно изменить позицию мессаджбокса или хотябы как получить его хэндл...

Заранее спасибо всем откликнувшимся!!
с уважением, Павел.
Re: Как передвинуть MessageBox
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 23.09.04 15:12
Оценка:
Здравствуйте, Sproot_, Вы писали:

S_>Так вот, хотелось бы, чтоб этот мессаджбокс появлялся отцентровано, относительно главного окна приложения, хэндл этого окна мы имеем, хэндл мессаджбокса, соответственно, нет...


Я бы советовал посмотреть сорцы MFC-шной функции AfxMessageBox() — насколько я помню, там вешаешьтся хук типа WH_CBT.
- Искренне ваш, Поросенок Пафнутий
Re: Как передвинуть MessageBox
От: Carc Россия http://www.amlpages.com/home.php
Дата: 25.09.04 18:50
Оценка:
Здравствуйте, Sproot_, Вы писали:

S_>Коллеги, буду несказанно признателен за посильную помощь...

S_>Суть проблемы в следующем:
S_>Есть приложение, которое создает второй поток, в котором, в свою очередь, вызывается MessageBox... этот бокс появляется по середине экрана...
S_>Так вот, хотелось бы, чтоб этот мессаджбокс появлялся отцентровано, относительно главного окна приложения, хэндл этого окна мы имеем, хэндл мессаджбокса, соответственно, нет...
S_>Просто вызов ::MessageBox(hwndMainWnd, "bla-bla", "bla-bla", MB_OK); — не проходит.
S_>Подскажите, пожалуйста, как можно изменить позицию мессаджбокса или хотябы как получить его хэндл...

S_>Заранее спасибо всем откликнувшимся!!

S_>с уважением, Павел.
Здесь есть статья про MessageBox со своим CButton (checkbox) там это делается черех хук, собственно в процедуре хука есть и HWND мессайджбокса, ничто не мешает отцентрировать его куда угодно.
Aml Pages Home
Re[2]: Как передвинуть MessageBox
От: Sproot_ Россия  
Дата: 26.09.04 09:57
Оценка:
Спасибо всем, кто откликнулся!!

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

Наверняка кто-то еще сталкнется с подобной проблемой... специально для них привожу фрагмент своего кода:

HHOOK m_hHookMessageBoxCentring;
string headerOfCentredMessageBox;
LRESULT CALLBACK HookCentringMB(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HCBT_CREATEWND) { //реагируем только на создание окна.
        LPCBT_CREATEWND lc = reinterpret_cast<LPCBT_CREATEWND>(lParam); //достаем параметры создаваемого окна.
        LPCREATESTRUCT ls = lc->lpcs;
        if (ls->lpszName == headerOfCentredMessageBox) {  //на всякий случай надо удостоверитmся, что это окно наше, а то мало ли, что за окно откроется в этот момент(в виду многозадачности винды приходится перестраховываться)
            ::UnhookWindowsHookEx(m_hHookMessageBoxCentring); //убираем хук т.к. нас интересует только создание главного окна сообщения.
            m_hHookMessageBoxCentring = 0;
            headerOfCentredMessageBox = "";
        
            CRect centerWndRect;
            AfxGetMainWnd()->GetWindowRect(&centerWndRect); 

            CPoint centerWnd;
            centerWnd = centerWndRect.CenterPoint();  //находим центр главного окна.

            ls->x = (centerWnd.x - (ls->cx / 2));   //устанавливаем позицию MessageBox-а
            ls->y = (centerWnd.y - (ls->cy / 2));
        }
    }
    return ::CallNextHookEx(m_hHookMessageBoxCentring, nCode, wParam, lParam);  //передаем управление винде
}

int GUIUtils::MessageBoxCentred(const tstring& text, const tstring& caption, UINT type) {   //функция вывода сообщения, которую и будем вызывать по нужде.
    m_hHookMessageBoxCentring = ::SetWindowsHookEx(WH_CBT, HookCentringMB, NULL, ::GetCurrentThreadId());  //устанавливаем хук
    headerOfCentredMessageBox = caption;  //подстраховочная информация о заголовке
    int result;
    result = ::MessageBox(NULL, text.c_str(), caption.c_str(), type);  собственно само сообщение
    if (m_hHookMessageBoxCentring)
                ::UnhookWindowsHookEx(m_hHookMessageBoxCentring);  //убираем хук, если сообщение не прошло.
    return result;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.