我正在写一个简单的MFC应用程序,我注意到一些奇怪的事情:MFC - MessageBox的过载
,如果我尝试使用按钮事件处理程序中MessageBox函数,我需要3个参数:MessageBox的(LPCTSTR,LPCTSTR ,UINT);如果我尝试在表单类中使用MessageBox,我需要4个参数:MessageBox(HWND,LPCTSTR,LPCTSTR,UINT);
它是如何工作的?
我正在写一个简单的MFC应用程序,我注意到一些奇怪的事情:MFC - MessageBox的过载
,如果我尝试使用按钮事件处理程序中MessageBox函数,我需要3个参数:MessageBox的(LPCTSTR,LPCTSTR ,UINT);如果我尝试在表单类中使用MessageBox,我需要4个参数:MessageBox(HWND,LPCTSTR,LPCTSTR,UINT);
它是如何工作的?
这是因为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。
我会说处理程序内你的调用CWnd :: MessageBox和外部:: MessageBox。
正如Steve所写,一个在CWnd派生类的重写方法中被调用,另一个在全局作用域中被调用,或者至少不在CWnd派生类的作用域中导致差异。
对于MFC,我想在使用消息框的任何地方推荐使用AfxMessageBox()。如果在某一点上你需要勾住它,那么你可以做一些技巧。
在MFC应用程序AfxMessageBox hsould总是使用!否则,应用程序可能会在模态时遇到麻烦。 – xMRi
@xMRi谢谢 - 我已经包括在答案 – marcinj