繁体   English   中英

MFC重绘窗口在画图应用程序中的问题

[英]MFC Redraw window in paint application problem

我正在尝试在MFC上编写Paint,但是在绘制新图形,移动现有图形或调整现有图形大小时,重新绘制窗口存在问题。 当我在每次移动鼠标后使用Invalidate()InvalidateRect(NULL) ,效果很好,但是在添加3-4位数字后,应用程序崩溃,因为它无法及时重绘所有窗口。 我已经尝试过InvalidateRect(FigureRect)RedrawWindow(FigureRect)但无法正常工作(出现涂片)。

效果很好,但应用崩溃了:

void CGraphicsEditorView::OnMouseMove(UINT nFlags, CPoint point)
{
    ...
    if (m_mouseDrugging && m_cursorInside)
    {
        m_figureSelected->Move(point);
        Invalidate();
    }
    ...
    CView::OnMouseMove(nFlags, point);
}

这是我的OnDraw函数:

void CGraphicsEditorView::OnDraw(CDC* pDC)
{
    for (Figure* figure : figures)
        figure->Draw(pDC);
}

Figure是一个抽象类,从该类继承了Rectangle,Ellipse和Triangle类。

例如,矩形的Draw函数:

void CRectangle::Draw(CDC* pDC) {
    pDC->SelectStockObject(NULL_BRUSH);

    CPen penBorder(penType, penWidth, borderColor);
    CBrush* br = (brushType == HS_TRANSPARENT) ? nullptr : new CBrush(brushType, fillColor);
    pDC->SelectObject(&penBorder);
    pDC->SelectObject(br);

    pDC->Rectangle(bound);
}

我可以正确重画窗口吗? 预先感谢您的帮助。

无效导致发送WM_PAINT ,并以某种方式“异步”处理它们,因为WM_PAINTOnDraw() )是低优先级消息(在清空消息队列之前进行处理)。 这也可能导致“闪烁”。 由于鼠标移动是在您移动鼠标时发送的多次消息,因此您不应该使窗口无效,并且最好不要在其中执行冗长的/占用CPU的操作。 相反,我会考虑绘画和绘画的结合。 以下链接中的详细信息(我过去回答过的相关问题):

有些控件似乎没有随机绘制

最小化/最大化后,MFC窗口图形消失了

使用Win32 API和GDI绘制窗口的无效区域

Win32API)为什么我应该一次又一次GetDC和ReleaseDC?

至于崩溃,这无疑是实现错误的结果WM_PAINT消息处理的“异步”性质在这里可能要做,例如,某些变量可能已更改(在OnMouseMove() ),以及何时发生最后在OnDraw()访问某些数据可能不一致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM