如何在MFC中定义onDraw()

时间:2014-11-21 02:56:19

标签: c++ mfc ondraw onpaint

我理解onDraw()函数是虚空,它是通过OnPaint()自动调用的,void myDialog::OnDraw(CDC* dc) { CCustomMemDC pDC(dc); CExampleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); } 本身是由WM_PAINT消息触发的。

我的声明是这样的:

myDialog.cpp

afx_msg void OnDraw(CDC* dc);

myDialog.h

OnPaint()

并在我的CDialog::OnPaint();

{{1}}

但是我根本无法触发OnDraw ...如果这个方法正确,有人可以启发吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

对话框没有OnDraw。这是视图中的虚拟功能,允许打印和绘图到屏幕。

在对话框中使用OnPaint。没有重定向到对话框中的虚拟OnDraw函数。

答案 1 :(得分:0)

这是不正确的。正如其他人所指出的,OnDraw()是CView的虚方法而不是CDialog。因此,永远不会调用您的OnDraw()方法。

我不知道为什么你的对话框会出现一个你需要缓解的闪烁问题。如果对话框上有自定义控件导致闪烁,则可能需要修复其中的绘图代码,并可能将WS_CLIPCHILDREN作为窗口样式添加到对话框中。这将确保在对话框执行WM_ERASEBKGND消息时不会删除自定义控件的背景。

覆盖对话框的WM_PAINT是没有意义的,除非您真的打算在其上进行自定义绘图。除非你有充分的理由,否则不要这样做。

如果您选择忽略该建议,则将ON_WM_PAINT()添加到对话框的消息处理程序,然后自己绘制对话框:

void myDialog::OnPaint()
{
   CPaintDC dc(this);
   CCustomMemDC pDC(&dc);
   // do your specialized code knowing you are responsible for drawing the whole dialog
}

如果你真的想使用OnDraw()方法,那么你也可以像这样编写OnPaint():

void myDialog::OnPaint()
{
   CPaintDC dc(this);
   OnDraw(&dc);
}

但是,我要做的第一件事就是尝试将样式WS_CLIPCHILDREN添加到对话框样式中。