1

问题是这样的:我在VS2005中写了一个windows应用程序,构建成功。然后我把它转移到VS2008,当我编译程序时,会有错误信息显示:error 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 提供的链接中看到的那样,原始海报确实具有正确的签名。

原来这是 MFC 本身的一个错误。在 afxmsg_.h 中找到 ON_WM_CTLCOLOR_REFLECT,您会注意到 CtlColor 前面缺少“&”。我猜旧的编译器并不介意。添加“&”使其成为“&CtlColor”并修复错误。

或者,如果您不喜欢更改官方标题,您可以在自己的代码中 #under ON_WM_CTLCOLOR_REFLECT 并再次正确定义它。

我注意到该文件中的许多其他(也许是全部?)反映的消息也有同样的问题。

于 2014-10-23T13:10:41.907 回答