【问题标题】:What is the difference between ON_WM_CTLCOLOR_REFLECT() and ON_WM_CTLCOLOR() in VS2008?VS2008 中的 ON_WM_CTLCOLOR_REFLECT() 和 ON_WM_CTLCOLOR() 有什么区别?
【发布时间】:2012-12-14 06:53:24
【问题描述】:

问题是这样的: 我在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() ,我可以成功构建。

【问题讨论】:

  • 一旦您创建了一个新的 MFC 控件类,您就可以为其定义消息处理程序。反射消息处理程序允许您的控件类在父级接收到消息之前处理自己的消息。

标签: mfc windows-ce


【解决方案1】:

错误消息是因为消息处理程序的签名与您使用的签名不匹配。在 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的详细信息。

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题,从 Roel 提供的链接中可以看出,原始发帖人确实有正确的签名。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      • 2015-03-26
      相关资源
      最近更新 更多