我想知道MFC中OnDraw()
和OnPaint()
之间的区别。
在网上搜索了一段时间后,我找到了一篇有用的文章。综上所述,
-
WM_PAINT
将触发OnPaint()
,它调用OnDraw()
并传递CDC*
:void CView::OnPaint() { // standard paint routine CPaintDC dc(this); OnPrepareDC(&dc); OnDraw(&dc); }
-
另一篇文章提到,在打印文档时,
OnPrint()
还通过传递打印机 DC 来调用OnDraw()
。 因此,通过覆盖OnDraw()
,您可以在一个功能中获得丝网绘画和印刷,这很方便。
我试图把我的陈述放在OnDraw()
和OnPaint()
中。两者都可以很好地工作。OnDraw()
更容易一些,因为它已经得到了一个指针pDC
.
设备上下文是一个古老的抽象概念。早在1982年,《计算机图形学:原理与实践》(Computer Graphics: Principles and Practice)第一版(可能更早)就已经描述了它们,直到今天似乎还让人们感到困惑。
设备上下文的主要用途是抽象呈现设备(如显示器、打印机、内存中位图等)的特性,并提供一致的接口。呈现到设备上下文中的代码通常不需要知道哪个设备最终使用呈现命令。
标题为"视图中绘图"的文档条目继续解释系统的工作原理: 简而言之,所有绘制都应在接收设备上下文的OnDraw
覆盖中执行。然后,系统提供的OnPaint
实现构造一个CPaintDC
并调用OnDraw
。
到目前为止,这似乎只是呈现窗口内容的一种过于复杂的方式。当您实现打印支持时,事情开始变得有意义。现在,您所要做的就是设置打印设备上下文并调用OnDraw
。OnDraw
实现中的任何内容都不需要更改。