MFC - MessageBox重载

时间:2017-01-09 16:19:27

标签: c++ mfc messagebox

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

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

相反,如果我尝试在表单类中使用MessageBox,我需要4个参数:MessageBox(HWND,LPCTSTR,LPCTSTR,UINT);

它如何运作?

3 个答案:

答案 0 :(得分:3)

这是因为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一无所知。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

我会在处理程序内部调用CWnd :: MessageBox和outside :: MessageBox。