如何在 MFC 中定义 onDraw()

How to define onDraw() in MFC

本文关键字:onDraw 定义 MFC      更新时间:2023-10-16

我知道onDraw()函数是虚拟的,它通过OnPaint()自动调用,它本身是由WM_PAINT消息触发的。

我的声明是这样的:

我的对话框.cpp

void myDialog::OnDraw(CDC* dc)
{
    CCustomMemDC pDC(dc);
    CExampleDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
}

myDialog.h

afx_msg void OnDraw(CDC* dc);

在我的OnPaint()

CDialog::OnPaint();

但是我根本无法触发OnDraw...如果这种方法是正确的,谁能开导?

谢谢!

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

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

这是

不正确的。 正如其他人所指出的,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添加到对话框样式中。