【问题标题】:MFC Custom Control Background/Text ColorMFC 自定义控件背景/文本颜色
【发布时间】:2014-09-04 21:47:23
【问题描述】:

所以我已经使用 MFC 几年了,并制作了包括自定义控件在内的各种界面。我最近被要求开始制作一个可以动态设置背景和文本颜色的界面。我开始着手解决这个问题,并且遇到了让我的一些自定义控件正常运行的问题。所有生成 WM_CTLCOLOR 消息的控件都可以很好地使用该接口来允许父控件设置子控件的颜色,但并非我自定义的所有控件都生成这些消息。特别是我基于 CTabCrtl 和一些基于 CWnd 构建的类。这些类在调用绘画之前似乎不会生成 WM_CTLCOLOR 消息。我想知道是否有人对如何获取控件父 CWnd 的背景和文本颜色或如何手动创建 WM_CTLCOLOR 消息有任何想法。我试图获取控件父级的当前 DC,因此我可以调用 GetBkColor() 和 GetTextColor() 但这样做似乎总是返回默认值。我也尝试过创建 WM_CTLCOLOR 消息,但不知道应该在哪里创建它们或确切的语法。任何帮助都会很棒。

【问题讨论】:

  • 许多常用控件支持通过WM_NOTIFY/NM_CUSTOMDRAW进行自定义
  • 根据您所针对的控件,您可能会发现从 VS2008 SP1 出现的 MFC Feature Pack 有一些有用的补充。例如CMFCListCtrl 具有设置前景/背景单元格颜色的覆盖。

标签: c++ mfc


【解决方案1】:

WM_CTLCOLOR 的想法是必须从 WM_PAINT 和 WM_ERASEBKGND 中调用它。 在这种情况下,你有一个 DC。您将消息发送给父级,然后您会得到一个画笔并设置文本和背景颜色。

我只看到一个主要问题,即 WM_CTLCOLOR 不是真正的窗口消息...它只是从 SDK 中描述的各种 WM_CTLCOLOR...消息合成而来。

所以语法记录在 MSDN 中。 将 DC 句柄转换为 WPARAM,并将窗口句柄转换为 LPARAM...

【讨论】:

  • 这正是我想要的!我在发送消息时总是使用 PostMessage() 并忘记了 SendMessage() 是如何工作的。当从绘制例程调用 WM_PAINT 之前,我无法弄清楚如何在 WM_CTLCOLOR 之前对其进行处理。 HDC hdc = ::GetDC(this->m_hWnd); HBRUSH brush = (HBRUSH) ::SendMessage(GetParent()->GetSafeHwnd(), WM_CTLCOLORSTATIC, (WPARAM)hdc, (LPARAM)this); CDC *dc = CDC::FromHandle(hdc); 确切的 WM_CTLCOLOR 消息可以根据您希望如何处理颜色分配进行更改谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多