2014-12-20 4 views
0

У меня есть propertysheet, и у него есть три страницы (стр. 1, стр. 2, стр. 3) соответственно. Для чего я добавил как окно сообщений всякий раз, когда нажимается кнопка «Отмена» или нажата кнопка [X], или нажата кнопка [X] или Esc.Как запретить приложению не отображать несколько сообщений об отправке сообщений?

Выполняемые:

1.Ran приложения.

  1. Отключена кнопка «Отмена» и окно с сообщением. (Не отменил сообщение).

  2. Теперь перейдите на панель задач и щелкните правой кнопкой мыши значок приложения и нажмите «закрыть окно». Именно здесь возникла проблема; то есть появляется еще одно окно окна сообщения.

На самом деле этого не должно быть, не так ли? Он должен быть ограничен только одним полем сообщений.

//This is being triggered when close window or cancel button is pressed. 

BOOL OnQueryCancel() 
{ 

    if(IDOK == ::MessageBox(m_hWnd, L"Closing the application", 
          L"Warning", MB_OKCANCEL | MB_ICONWARNING)) 
    { 
     return TRUE; 
    } 
    return FALSE; 
} 

Как я могу предотвратить отображение нескольких сообщений? Я должен обратить внимание на уже открытое окно сообщений.

+0

Только не делайте этого? –

+0

Как узнать, открыт ли почтовый ящик или нет? – Siva

+1

Это не вопрос. Покажите нам некоторый код, желательно [короткий, самостоятельный, правильный компилируемый пример] (http://sscce.org/). –

ответ

1

Во-первых, вы должны использовать AfxMessageBox, что облегчает работу в MFC. Во-вторых, это обычная операция в Windows - это просто ответ на закрытые сообщения. Я бы добавил переменную, чтобы указать, что поле отображается уже:

//Part of your class 
BOOL m_bIsPromptActive; 

BOOL OnQueryCancel() 
{ 
    if(!m_bIsPromptActive) 
    { 
    m_bIsPromptActive = TRUE; 

    if(IDOK == ::MessageBox(m_hWnd, L"Closing the application", 
          L"Warning", MB_OKCANCEL | MB_ICONWARNING)) 
    { 
     return TRUE; 
    } 

    m_bIsPromptActive = FALSE; 
    } 
    else 
    { 
    // Message is already displayed. Set the focus to this window 
    ::SetFocus(m_hWnd); // or this->SetFocus(); 
    // You can also look at ::BringWindowToFront() 
    } 

    return FALSE; 
} 
+0

Спасибо за ваш ответ. Он работал как charm.Here в другой части вы настраиваете фокус на родительское окно. Можем ли мы установить фокус на окно сообщения вместо того, чтобы устанавливать фокус на родительское окно. – Siva

+0

Вы не можете установить фокус на MessageBox, потому что у вас нет дескриптора. Тем не менее, MB является дочерним по форме (вы передали m_hWnd), и поскольку он модальный, родитель будет уделять ему основное внимание. (Вы можете получить ручку MB, но не стоит того). –

Смежные вопросы