在MFC中,打开文件或创建文件时,是否生成了WM_PAINT?

时间:2013-12-04 21:16:44

标签: mfc

我正在学习使用“使用MFC编程Windows(第2版)”一书中的MFC编程。我对第9章中的书籍例子有一些疑问。

当我打开文件或单击新文件时,会调用函数CSquaresView::OnDraw()。我检查了堆栈,原因是CView::OnPaint()调用了这个函数。

但我不明白如何调用CView::OnPaint()。如果默认设置调用了WM_PAINT,是否会生成消息CSingleDocTemplate::OpenDocumentFile()?是

是否可以改变行为?

谢谢, 布赖恩

3 个答案:

答案 0 :(得分:1)

为刚刚创建并可见的每个窗口触发WM_PAINT。

但内部执行以下代码(取决于MDI / SDI),强制窗口更新:

  1. CSingle / MultiDocTemplate :: OpenDocumentFile。
  2. 因此,要么创建一个新的CDocument,要么重新准备一个新的CDocument。
  3. 创建或重复使用新的框架窗口。
  4. 创建新视图或重新使用旧视图。
  5. 最后调用InitialUpdateFrame!
  6. InitialUpdateFrame向所有创建的帧发送消息,最终导致调用CView :: OnInitialUpdate。
  7. OnInitialUpdate再次调用CView :: OnUpdate,默认实现调用CWnd :: Invalidate
  8. 现在,在消息循环的下一个回合中,窗口会收到WM_PAINT消息。
  9. 防止执行OnDraw并不明智,因为在这种情况下,文档的内容无法显示给用户。这必须要做,总是在窗口是新的,或者文档的内容刚刚改变时(这里在加载新文档后改变了)。

答案 1 :(得分:0)

虽然我没有这本书或者知道样本是关于什么的(并且我认为很多读者都没有...),但我猜想你得到WM_PAINT的原因是因为一个文件打开对话框,在某个时刻覆盖您的绘图区域,当它关闭时,该区域无效。这可能吗?

答案 2 :(得分:0)

我错过了什么吗?这是标准的Windows行为。调用CView::OnPaint()是因为Windows生成了WM_PAINT消息。如果您正在调试并在OnDraw()中设置断点,它将始终在那里中断,因为调试器和应用程序轮流运行(但除非您的应用程序在单独的监视器上运行)并且生成WM_PAINT。如果您确实想要停止重绘,请尝试SetRedraw