Это потому, что 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.
В приложении MFC AfxMessageBox всегда можно использовать! В противном случае приложение может столкнуться с проблемами при переносе модальных данных. – xMRi
@ xMRi спасибо - я включил это в ответ – marcinj