我理解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 ...如果这个方法正确,有人可以启发吗?
谢谢!
答案 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
添加到对话框样式中。