【问题标题】:Redirect a WM_PAINT to default handler, replacing the DC?将 WM_PAINT 重定向到默认处理程序,替换 DC?
【发布时间】:2016-01-15 13:17:19
【问题描述】:

给定一个派生自 CEdit 的类,是否可以截获 WM_PAINT 消息,使用不同的 CDC 调用基类消息?

    class CEditNew : public CWindowImpl<CEditNew, CEdit>
    {
    public:

        BEGIN_MSG_MAP(CEditNew)
            MESSAGE_HANDLER(WM_PAINT, OnPaint)  
        END_MSG_MAP()

        LRESULT OnPaint(UINT, WPARAM, LPARAM, BOOL &)
        {           
            return 0;
        }
    };

我可以通过调用 SubclassWindow 来拦截 CEdit 的 WM_PAINT,但我真的很想调用基类原始绘制处理程序。

对于上下文,父窗口有自己的 compatibledc(它使用半透明),我需要通过给它们这个 dc 来允许子控件在需要时绘制自己。

【问题讨论】:

  • 像这样修改 EDIT 控件是行不通的,它犯了严重的罪行并在不使用 WM_PAINT 的情况下进行绘画。
  • 这不是真正的修补。我只想让它在更新时绘制到我给它的 DC,就像我使用 WM_PRINT 或 WM_PRINTCLIENT 时一样。

标签: winapi atl wtl


【解决方案1】:

目标HDC不是在WM_PAINT消息本身中传递的,它是从BeginPaint()获取的。您无法控制返回哪个HDC

要求HWND 将自己绘制到特定HDC 的正确方法是使用PrintWindow() 函数,或直接向其发送WM_PRINT 消息。

【讨论】:

  • 是的,我正在使用 WM_PRINTCLIENT 来渲染分层窗口及其子窗口。问题是,例如,如果我尝试向分层窗口添加一个编辑框,它不是交互式的。我可以从中获取消息,但我认为它不会重新粉刷自己。如果任何孩子需要重绘,我需要以某种方式戳父分层窗口以刷新自身。
猜你喜欢
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多