OnDraw()函数问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OnDraw()函数问题相关的知识,希望对你有一定的参考价值。

在矢量图形系统中,各种图形元素画上去之后,呈黑色状态,本来应该调用OnDraw函数绘制图形,代码:
void CDrawView::OnDraw(CDC* pDC)

CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDoc->Draw(pDC,0,0,m_bColor);

void CDrawDoc::Draw(CDC* pDC,int m_DrawMode,int m_DrawModel,short BackColor)

for(int i=0;i<=8;i++)

int nn=GetGraphUpperBound(i)+1;
while(nn--)
GetGraph(i,nn)->Draw(pDC,m_DrawMode,m_DrawModel,BackColor);

,是相关的代码,看起来是没错的,高手们看下,也可以给我提个另外的建议。书上说当窗口的完整性被破坏是会发出窗口消息,由CView()调用OnDraw()函数。究竟什么动作会造成这种效果?绘制图形吗?

OnDraw是窗口重绘,也就是WM_PAINT消息产生时,由OnPaint()函数调用的,窗口重绘情况很多。在窗口尺寸发生变化会出现,也可以人为设置等等。绘制图形不会发生重绘,除非你认为设置。 参考技术A 在CView类调用InValidate()就可以破环窗口导致重绘

在 MFC SDI 应用程序中调用 OnDraw

【中文标题】在 MFC SDI 应用程序中调用 OnDraw【英文标题】:Calling OnDraw in MFC SDI application 【发布时间】:2015-02-23 06:03:53 【问题描述】:

我正在尝试在 VC++ 中制作一个 MFC SDI 应用程序,以便在单击相应按钮时绘制不同的形状。我们已经在 OnDraw() 函数中编写了代码。但是 Ondraw 会在运行应用程序时自动调用。我们希望它只在相应按钮的 onclick 上被调用。我们如何进行..?

【问题讨论】:

【参考方案1】:

您不能阻止仅在您按下按钮时调用 OnDraw。

当 WM_PAINT 到达并要求窗口重新绘制自身时,将调用视图中的 OnDraw。不执行 OnDraw 将导致根本无法绘制任何内容。

当您的应用程序再次最小化和最大化时,或者当窗口大小发生变化时,也会调用 OnDraw。

我也想不出一个场景,我只想在按下按钮时绘图。你需要更精确。在这里。

【讨论】:

我想根据鼠标点击显示不同的形状。例如,如果用户单击正方形,则应绘制一个正方形。所以要绘制的代码是用onDraw编写的。那么如何在点击时只绘制那个特定的形状呢? 您应该在绘图和创建之间有所区别。在您看来,您创建了一个形状。之后,您必须绘制它。在 doneon OnDraw 中绘图。创建通常在命令处理程序中完成。【参考方案2】:

正如xMRi所说,OnDraw是由框架调用的......但是如果你只想在单击按钮时绘制一些东西,为什么不创建一个成员变量,在单击按钮时设置,然后执行 OnDraw 时获取计数?

void CYourAppView::OnDraw(CDC* pDC)

    // MFC code
    if(m_bButtonWasClicked)
    
        // draw what ever you want
    

【讨论】:

【参考方案3】:
    单击形状按钮时,设置一个成员变量,该变量会记住您要绘制的内容。 呼叫无效。这将导致框架调用 OnDraw。 在 OnDraw 中检查成员变量并绘制形状。

您必须允许 OnDraw 每次被框架调用时进行绘制。这就是窗口图像在被覆盖、最小化、调整大小等之后恢复的方式。

【讨论】:

以上是关于OnDraw()函数问题的主要内容,如果未能解决你的问题,请参考以下文章

未调用 CScrollView OnDraw

如何在Android中调用CustomView的onDraw(Canvas canvas)函数?

VC对话框怎么添加ondraw函数

在vc++中 OnDraw()函数和 Invalidate()函数起啥作用

MFC中啥时候调用OnDraw()函数?

在 MFC SDI 应用程序中调用 OnDraw