我正在编写一个简单的MFC应用程序,我注意到一些奇怪的事情:
如果我尝试在按钮事件处理程序中使用MessageBox函数,我需要3个参数:MessageBox(LPCTSTR,LPCTSTR,UINT);
相反,如果我尝试在表单类中使用MessageBox,我需要4个参数:MessageBox(HWND,LPCTSTR,LPCTSTR,UINT);
它如何运作?
答案 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。