VS2008中ON_WM_CTLCOLOR_REFLECT()和ON_WM_CTLCOLOR()之间有什么区别?

时间:2012-12-14 06:53:25

标签: mfc windows-ce

问题是这样的: 我在VS2005中编写了一个Windows应用程序,取得了成功。然后我将它转移到VS2008,当我构建程序时,会出现错误消息显示:  错误C4867:'CGroupBox :: CtlColor':函数调用缺少参数列表;使用'& 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(),我可以成功构建。

2 个答案:

答案 0 :(得分:2)

错误消息是因为消息处理程序的签名与您正在使用的签名不匹配。在MSDN上查找ON_WM_CTLCOLOR_REFLECT()和ON_WM_CTLCOLOR()的签名以获取正确的签名。

对于标题中的问题,某些控件通常会将其通知消息发送给其父级。这很不方便,因为每次重新使用该控件时,都需要更改其父窗口。因此,MFC具有“反射”支持,这基本上是一种说法'当你收到来自儿童控制的通知时,首先尝试将其反弹回该控件以查看该控件是否知道如何自己处理它。'

阅读http://msdn.microsoft.com/en-us/library/eeah46xd%28v=vs.80%29.aspx上的详细信息。

答案 1 :(得分:0)

我遇到了同样的问题,正如您从Roel提供的链接中看到的那样,原始海报DID具有正确的签名。

原来这是MFC本身的一个错误。在afxmsg_.h中找到ON_WM_CTLCOLOR_REFLECT,你会注意到CtlColor缺少“&”在它之前。我想较旧的编译器并不介意。添加“&”使它成为“& CtlColor”并且错误是固定的。

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

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