MFC 在 for 循环中绘图

Posted

技术标签:

【中文标题】MFC 在 for 循环中绘图【英文标题】:MFC drawing in for loop 【发布时间】:2014-02-03 16:31:23 【问题描述】:

我需要绘制一些依赖关系的简单图表。由于我只想显示一次以进行设备调试,因此我使用了简单的基于 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();

我在调试中检查了数组是否有一些不正确的数字,但没有。

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

好的,我和我的老同事聊天,他想出了解决方案。 我使用 PostMessage 调用 OnPaint 消息处理程序,并且控件被认为是最新的,因此没有发生重绘。 我必须使用 bErase=0 在 CDialog(不是 mGraph 控件)上调用 Invalidate 来触发 OnPaint 并更新区域。 我愚蠢的错。

【讨论】:

以上是关于MFC 在 for 循环中绘图的主要内容,如果未能解决你的问题,请参考以下文章

使用 for 循环绘图时,如何跳过图例中的重复标签?

使用for循环中的ggplot绘图不能编译为PDF

jupyter 按顺序打印绘图和数据框,for循环

在 for 循环中以 pdf 格式保存 2-plot 图形

来自单元格的 Matlab 图例,用于使用 for 循环创建的绘图

QT 与MFC绘图技术比较