MFC - 消息框重载

MFC - MessageBox overload

我正在编写一个简单的 MFC 应用程序,我注意到一些奇怪的事情:

如果我尝试在按钮事件处理程序中使用 MessageBox 函数,我需要 3 个参数:MessageBox(LPCTSTR, LPCTSTR, UINT);

相反,如果我尝试在不合形式的函数中使用 MessageBox class,我需要 4 个参数:MessageBox(HWND, LPCTSTR, LPCTSTR, UINT);

它是如何工作的?

我会说你的调用在处理程序内部 CWnd::MessageBox 和在 ::MessageBox 外部。

这是因为CButton继承自CWnd,其中包含一个方法:

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

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

它的实现实际上调用了一个全局版本(你问题中的第二个),这个调用中使用的 HWND 将从 CWnd 中获取。您可以在 Visual Studio 目录中的 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 一无所知。

正如 Steve 所写,一个是在 CWnd 派生的重写方法中调用的 class,另一个是在全局范围内调用的,或者至少不是在 CWnd 派生的范围内调用的 class 这导致了差异。

对于 MFC,当您想使用消息框时,我建议在任何地方都使用 AfxMessageBox()。如果在某个时候你需要挂钩它,你可以使用一些技巧。