在另一个 CWnd 上绘制 CWnd

Posted

技术标签:

【中文标题】在另一个 CWnd 上绘制 CWnd【英文标题】:Painting CWnd on another CWnd 【发布时间】:2012-11-12 16:14:31 【问题描述】:

我有一个 CWnd(父级),它拥有一个允许在其上绘制一些项目的网格控件。 问题是我想在它上面绘制一些复杂的 CWnd,但网格控件只允许绘制派生自与 CWnd 无关的“ItemBase”类的项目。

这个 ItemBase 类允许覆盖一个虚函数 void drawItem(CDC *, CRect) 允许在提供的 CDC 和裁剪区域 CRect 中绘制自己的绘图。

我的想法是将复杂的 CWnd 创建为父窗口的不可见子窗口,然后在 ItemBase 的 drawItem 中使用提供的 CDC 上的 CWnd::Paint。

所以我要做的是:

    我有一个网格控件。 我创建了一组复杂的窗口 我(为每个复杂的窗口)创建一个派生自 ItemBase 的类对象 我将一组基本类型为 ItemBase 的对象添加到网格控件中

    在 drawItem(CDC *dc, CRect area) 我调用:

    m_sophisticatedWindow->MoveWindow(area); //将窗口移动到合适的位置 m_sophisticatedWindow->Print(dc, PRF_CLIENT); //渲染它

所以我希望在适当的研磨控制位置上绘制适当的复杂窗户,但是什么也没有发生。 我尝试使用 PrintClient/PrintWindow 而不是 Print。 我也在用 MoveWindow 做实验——比如将位置更改为一些固定位置,但它没有帮助。

如果我在 drawItem 中直接在 CDC 上绘制任何东西(如线、点等) - 一切都很好,只是 Print 函数似乎并没有达到我的预期。

有什么线索吗?

【问题讨论】:

【参考方案1】:

我遇到的问题是我得到了设置为 CDC 的剪辑区域。 所以只要我在“错误”的地方画画,什么都不会出现。

【讨论】:

以上是关于在另一个 CWnd 上绘制 CWnd的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++ 中的缩放/缩放 CWnd 控件

创建单独的 MFC GUI 线程,不能移动/调整大小/最大化 CWnd

CWnd::Create 会产生一个新线程吗?

是CWnd :: GetSafeHwnd()和CWnd :: m_hWnd ThreadSafe?

C++ 错误:未定义标识符“CWnd”

CWnd类