[英]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_PAINT
( OnDraw()
)是低优先级消息(在清空消息队列之前进行处理)。 这也可能导致“闪烁”。 由于鼠标移动是在您移动鼠标时发送的多次消息,因此您不应该使窗口无效,并且最好不要在其中执行冗长的/占用CPU的操作。 相反,我会考虑绘画和绘画的结合。 以下链接中的详细信息(我过去回答过的相关问题):
Win32API)为什么我应该一次又一次GetDC和ReleaseDC?
至于崩溃,这无疑是实现错误的结果WM_PAINT
消息处理的“异步”性质在这里可能要做,例如,某些变量可能已更改(在OnMouseMove()
),以及何时发生最后在OnDraw()
访问某些数据可能不一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.