1

質問は次のようなものです: 私は VS2005 で Windows アプリケーションを作成し、成功を収めています。次に、それを VS2008 に転送します。プログラムをビルドすると、エラー メッセージが表示されます。エラー C4867: 'CGroupBox::CtlColor': function call missing argument list; 「&CGroupBox::CtlColor」を使用して、メンバーへのポインターを作成します。メッセージ マップは次のとおりです。

BEGIN_MESSAGE_MAP(CGroupBox, CButton)
//{{AFX_MSG_MAP(CGroupBox)
ON_WM_PAINT()
ON_WM_CTLCOLOR_REFLECT()
//ON_WM_CTLCOLOR()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP

END_MESSAGE_MAP()

機能は次のとおりです。

HBRUSH CGroupBox::CtlColor(CDC* pDC, UINT nCtlColor) 
{
GetParent()->Invalidate();
return NULL;
}

しかし、 ON_WM_CTLCOLOR() に変更すると、ビルドを成功させることができます。

4

2 に答える 2

3

エラー メッセージは、メッセージ ハンドラーの署名が使用している署名と一致しないためです。MSDN で ON_WM_CTLCOLOR_REFLECT() および ON_WM_CTLCOLOR() の署名を調べて、正しいものを取得します。

タイトルの質問に関しては、一部のコントロールは通常、通知メッセージを親に送信します。そのコントロールを再利用するたびに、その親ウィンドウを変更する必要があるため、これは不便です。したがって、MFC には「リフレクション」サポートがあります。これは基本的に、「子コントロールから通知を受け取ったら、まずそのコントロールにバウンスして、そのコントロール自体がそれを処理する方法を知っているかどうかを確認してください」と言う方法です。

詳細については、https://web.archive.org/web/20101229015404/http://msdn.microsoft.com/en-us/library/eeah46xd (v=vs.80).aspx を参照してください。

于 2012-12-14T16:01:57.620 に答える
0

Roel が提供したリンクからわかるように、元のポスター DID には正しい署名があります。

これは MFC 自体のバグであることが判明しました。afxmsg_.h で ON_WM_CTLCOLOR_REFLECT を見つけると、CtlColor の前に「&」がないことがわかります。古いコンパイラは気にしなかったと思います。「&」を追加して「&CtlColor」にすると、エラーが修正されます。

または、公式のヘッダーを変更したくない場合は、独自のコードの #under ON_WM_CTLCOLOR_REFLECT で適切に定義し直すことができます。

そのファイル内の他の多くの (おそらくすべて?) 反映されたメッセージにも同じ問題があることに気付きました。

于 2014-10-23T13:10:41.907 に答える