2017-01-09 14 views
1

私は、単純なMFCアプリケーションを書いていると私は奇妙な何かを気づい:MFC - メッセージボックス過負荷

私は、ボタンのイベントハンドラ内MessageBox関数を使用しようとすると、私は3つのパラメータが必要:メッセージボックス(LPCTSTR、LPCTSTR 、UINT)。

代わりに、フォームクラスから関数内でMessageBoxを使用しようとすると、MessageBox(HWND、LPCTSTR、LPCTSTR、UINT)の4つのパラメータが必要です。

どのように動作しますか?

答えて

3

CButtonのメソッドが含まれているのCWndを継承するためです。その実装はacutallyこの呼び出しに使用されるHWNDがする、グローバルバージョン(あなたの質問から二番目)を呼び出し

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

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

をCWndから取られます。あなたは次のように、それは、Visual Studio 2015の下に見える、あなたのVisual StudioのディレクトリにMFCソースでは、この機能の実装を検索することができます

int CWnd::MessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption, UINT nType) 
{ 
    if (lpszCaption == NULL) 
     lpszCaption = AfxGetAppName(); 
    int nResult = ::MessageBox(GetSafeHwnd(), lpszText, lpszCaption, nType); 
    return nResult; 
} 

一方、あなたがフリー機能(グローバル1)を呼び出す場合は、HWNDを提供しなければなりません自分で。

[編集]

xMRiコメントで指摘したように、MFCアプリケーションでAfxMessageBoxが代わりにメッセージボックスを使用する必要があります(両方::メッセージボックスとのCWnd ::メッセージボックス - それらが同じです)。理由は、AfxMessageBoxはMFCダイアログボックスであり、MFCインフラストラクチャ全体をうまく演じるためです。:: MessageBoxは、実際にはMFCについては何も知らないWinAPIからのものです。

+0

MFCアプリケーションでは、AfxMessageBoxを常に使用する必要があります。さもなければ、アプリケーションはモーダルになるときに問題に遭遇するかもしれません。 – xMRi

+0

@ xMRiありがとうございます - 私は答えにそれを含めました – marcinj

1

私はハンドラの中でCWnd :: MessageBoxとOut :: MessageBoxを呼び出していると言います。

2

Steveが書いたように、CWnd派生クラスのオーバーライドされたメソッド内で呼び出されています。もう1つはグローバルスコープで呼び出されているか、少なくともCWnd派生クラスのスコープ内にはありません。

MFCの場合は、メッセージボックスを使用する場合はどこでもAfxMessageBox()を使用することをおすすめします。あなたがそれをフックする必要があるラインの下のあるポイントでは、あなたができるいくつかのトリックがあります。

関連する問題