我需要绘制一些依赖的简单图形。由于我只想显示一次用于设备调试目的,我使用了简单的基于MFC Dialog的App。在OnPaint()消息中,我绘制图形标签,矩形,文本。 但是当我在for循环中使用LineTo和MoveTo方法时,没有任何反应。如果我在外部循环中使用它们,则应该按原样绘制所有内容 我还尝试用3个点创建简单的POINT数组并在循环中绘制它。也没有运气。 这是代码:
CPaintDC dc(&mGraph);
int grXStart = 50;
int grYStart = 10;
int maxHeight = 600;
int zeroPos = 400;
int maxWidth = 580;
int numLines = 11;
int minLine = 50;
dc.Rectangle(grXStart,grYStart,grXStart+maxWidth,grYStart+maxHeight);
FOR(iY,numLines)
{
dc.MoveTo(grXStart - 5, grYStart + maxHeight-(numLines-iY)*minLine);
dc.LineTo(grXStart + 5, grYStart + maxHeight-(numLines-iY)*minLine);
CString xLabel;
xLabel.Format(_T("%d"),((numLines-iY)*minLine-(maxHeight-zeroPos)));
RECT rct;
rct.left = grXStart - 30;
rct.right = grXStart - 5;
rct.bottom = grYStart + maxHeight-(numLines-iY)*minLine + 8;
rct.top = grYStart + maxHeight-(numLines-iY)*minLine - 8;
dc.DrawText(xLabel,&rct,0);
}
int numLinesX = 12;
FOR(iX,numLinesX)
{
dc.MoveTo(grXStart + 50*iX, grYStart + maxHeight-5);
dc.LineTo(grXStart + 50*iX, grYStart + maxHeight+5);
CString xLabel;
xLabel.Format(_T("%d"),(50*iX+360));
RECT rct;
rct.left = grXStart + 50*iX - 17;
rct.right = grXStart + 50*iX + 17;
rct.bottom = grYStart + maxHeight + 8 + 18;
rct.top = grYStart + maxHeight - 8 + 18;
dc.DrawText(xLabel,&rct,0);
}
dc.MoveTo(grXStart + 10, grYStart+zeroPos - 50);
dc.LineTo(grXStart + 11, grYStart+zeroPos - 30);
dc.MoveTo(grXStart + 50, grYStart+zeroPos - 50);
dc.LineTo(grXStart + 49, grYStart+zeroPos - 30);
// everything to this point is drawn
if(mPointsLoaded)
{
// nothing from this is drawn and yes - mPointsLoaded == true
dc.MoveTo(grXStart, grYStart + zeroPos);
for(int iSm = 0; iSm < 581; iSm++)
{
int newPtY = grYStart + zeroPos - mPointsLarge[iSm].y;
if(newPtY > 500) newPtY = grYStart + zeroPos - 100;
if(newPtY <= 0) newPtY = grYStart;
dc.LineTo(grXStart + iSm, newPtY);
dc.MoveTo(grXStart + iSm, newPtY);
}
}
CDialog::OnPaint();
我在调试中检查了一些不正确的数字,但没有。
提前感谢您的帮助。
答案 0 :(得分:2)
好的,我和我的老同事聊了聊,他找到了解决方案。 我使用PostMessage来调用OnPaint消息处理程序,并且控制被认为是最新的,因此不会重绘。 我不得不在CDialog(而不是mGraph控件)上使用bErase = 0调用Invalidate来触发OnPaint并更新区域。 我的愚蠢错误。