2017-01-09 3 views
1

Я пишу простое приложение MFC, и я заметил что-то странное:MFC - MessageBox перегрузка

если я пытаюсь использовать функцию MessageBox в обработчике кнопки событий, мне нужно 3 параметров: MessageBox (LPCTSTR, LPCTSTR , UINT);

Вместо этого, если я пытаюсь использовать MessageBox внутри функции из класса формы, мне нужно 4 параметра: MessageBox (HWND, LPCTSTR, LPCTSTR, UINT);

Как это работает?

ответ

3

Это потому, что CButton наследует от CWnd, который содержит метод:

https://msdn.microsoft.com/pl-pl/library/0eebkf6f.aspx

int MessageBox(
    LPCTSTR lpszText, 
    LPCTSTR lpszCaption = NULL, 
    UINT nType = MB_OK 
); 

его реализация acutally вызывает глобальную версию (второй из Вашего вопроса), HWND, используемый в этом вызове будет быть взятым из CWnd. Вы можете поиск реализации этой функции в источниках MFC в вашей обзорной студии, это выглядит следующий образом в соответствии с Visual Studio 2015:

int CWnd::MessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption, UINT nType) 
{ 
    if (lpszCaption == NULL) 
     lpszCaption = AfxGetAppName(); 
    int nResult = ::MessageBox(GetSafeHwnd(), lpszText, lpszCaption, nType); 
    return nResult; 
} 

С другой стороны, если вы звоните свободную функцию (глобальный) вы должны предоставить HWND самостоятельно.

[править]

Как xMRi отметил в комментарии, в приложении MFC AfxMessageBox следует использовать вместо MessageBox (оба :: MessageBox и CWnd :: MessageBox - они одинаковы). Причина в том, что AfxMessageBox является диалоговым окном MFC, поэтому он отлично работает со всей инфраструктурой MFC, а :: MessageBox - от WinAPI, который ничего не знает о MFC.

+0

В приложении MFC AfxMessageBox всегда можно использовать! В противном случае приложение может столкнуться с проблемами при переносе модальных данных. – xMRi

+0

@ xMRi спасибо - я включил это в ответ – marcinj

1

Я бы сказал, что внутри обработчика ваш вызов CWnd :: MessageBox и снаружи :: MessageBox.

2

Как писал Стив, в рамках переопределенного метода производного класса CWnd другой вызывается в глобальной области видимости или, по крайней мере, не входит в класс производного класса CWnd, который вызывает разницу.

Для MFC я бы рекомендовал использовать AfxMessageBox() везде, когда вы хотите использовать окно сообщения. Если в какой-то момент вниз по линии вам нужно зацепить ее, есть некоторые трюки, которые вы можете сделать.