【问题标题】:MFC GetDC() Assertion failure - "Not a window"MFC GetDC() 断言失败 - “不是窗口”
【发布时间】:2018-06-14 00:55:47
【问题描述】:

目标:在静态控件 plotScreen 上的子窗口中绘制绘图。该图有时会从实时传入数据中绘制,因此我将绘制到兼容的 DC 以减少闪烁。

问题:代码可以正确地使用GetActiveWindow() 然后GetDC() 将绘图绘制到主框架,但我无法让程序将子窗口或静态控件识别为窗口。

导致断言失败的行:

CDC *pDC = plotScreen.GetDC();

plotScreen的创建:

plotScreen.Create("Gamma Playback", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON | DT_CENTER, plotRect, thisParent, NULL);

断言失败:

ASSERT(::IsWindow(m_hWnd)); return CDC::FromHandle(::GetDC(m_hWnd)); }

静态是在调用 GetDC 之前创建的。

编辑:静态已成功创建但已销毁。我尝试使用 new 在堆上分配,但它仍然被销毁,然后我可以在以后的函数中使用它。

【问题讨论】:

  • 该断言意味着 (a) 窗口尚未创建,或 (b) 窗口已被销毁。如果您在触发断言的行上放置一个断点,并且您声称在该行上的另一个断点创建了子窗口,您可以断定哪种情况发生得相当快。当然,假设子窗口已成功创建(您永远不会验证,因为您忽略了 Create 调用的结果)。
  • 谢谢 Whoz Craig。创建是成功的,因为我可以看到 CStatic - 它仍然存在,因为它是创建托管它的子窗口的类的成员。但是,按照您的建议,我发现“plotScreen”在创建期间和 Get DC() 期间都是空句柄。对于如何获取子窗口或 Cstatic 的设备上下文,或者如何正确获取句柄,您有什么建议吗?
  • 您的父窗口的OnCreate 是调用子创建的地方,并且只有在调用基础(我假设是CFrameWnd)之后(通常是@ 中的第一件事987654330@ 覆盖)。而你从来没有提到过:子控件的Create 是否返回 TRUE?
  • 并且仅供参考,DT_CENTER 不属于您的子控件的窗口样式。那是一个DrawText 格式指示器;不是窗口样式。
  • 是的,创建返回 TRUE(非零)。我手动创建了这个 CStatic,因为它是一个矩形,用于将绘图保存在子窗口中,而不是对话框中。它是在子窗口 Plot 的 OnCreate 覆盖中创建的,它是主框架上的一个子窗口。 Plot 在主框架的 OnCreate 中创建。

标签: c++ mfc


【解决方案1】:

解决方案 = 在该窗口的 OnCreate 期间获取包含 CStatic 的窗口的指针。存储在全局变量中。使用此指针获取 DC。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多