【发布时间】:2020-01-16 05:35:36
【问题描述】:
我正在尝试在 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);
}
我是否正确地重绘了窗口? 提前感谢您的帮助。
【问题讨论】:
-
只要“数字”的所有元素都是有效的,我不会立即看到会导致崩溃的东西,但是您显示的内容不足以完全确定这一点。例如,在调试器中运行它并查看崩溃实际发生的位置(您可能需要向上堆栈以找到调用库的代码部分,但这几乎可以肯定是您的代码而不是库的问题有问题)。
-
感谢您的回答。图形只是矩形、椭圆和三角形。我向您展示了几乎所有的代码,除了 move 和 draw 函数。图形由表示为矩形的边界框的坐标绘制。移动是图形边界框坐标的简单更改。
-
如上所说:在调试器中运行,看看究竟发生崩溃的地方。从您的代码来看,这绝对不是很明显。或者,至少,在这里发布完整的
figure->Draw(pDC);方法。 -
我展示了矩形的完整绘图功能。对于其他图形,仅在椭圆中是相同的,调用椭圆函数,在三角形中调用多边形函数。
-
new CBrush既是内存泄漏又是资源泄漏。当您遇到 10,000 个 GDI 资源泄漏时,您的程序将崩溃。
标签: c++ mfc paint invalidation redraw