2017-01-09 27 views
1

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

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

它是如何工作的?

回答

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。

+0

在MFC应用程序AfxMessageBox hsould总是使用!否则,应用程序可能会在模态时遇到麻烦。 – xMRi

+0

@xMRi谢谢 - 我已经包括在答案 – marcinj

1

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

2

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

对于MFC,我想在使用消息框的任何地方推荐使用AfxMessageBox()。如果在某一点上你需要勾住它,那么你可以做一些技巧。