MFC - 如何在矩形内绘制像素波

时间:2015-08-05 11:50:33

标签: c++ visual-c++ mfc drawing

我是MFC的新手,试图从头开始学习。

我正在尝试在VS2012中创建一个基于对话框的小应用程序 - MFC。

在对话框窗口中,我画了一个矩形(在OnPaint事件中),就像这样。

exists()

然后我用一些颜色填充了bacground。像这样。

CPaintDC dc(this);
CRect background1(10,10,208,92);
dc.Rectangle(10,10,208,92);

现在我想在矩形内连续绘制像素形式的波形。

截至目前,我所做的是,

   CBrush brush1;
   brush1.CreateSolidBrush(RGB(2,3,4));
   dc.FillRect(background1,&brush1);

我只是在窗口上直接绘制像素,但是在矩形所在的尺寸范围内。波浪在到达矩形的正确尺寸时停止。但我觉得这不是正确的做法。

我想在矩形内部绘制波浪并且也是连续的,就像它重新触及右端时它应该向左移动它应该是连续的。

MFC中是否有任何正确的方法可以在矩形内部绘制内容(技术上在另一个对象内)?

请帮帮我。

3 个答案:

答案 0 :(得分:0)

我尝试了你的代码并添加了一些条件,所以如果它到达右侧,它应该开始向左移动。

void CMyDlg::OnBnClickedOk()
{
    CWnd *cWnd = FromHandle(m_hWnd);
    CDC *pDC = cWnd->GetDC();
    bool top = false;
    bool right = false;
    int i,j;
    for(i=10,j=92;i<=200 && j>10;)
    {
        pDC->SetPixel(i,j,RGB(255,255,255));
        Sleep(10);

        if(!top)
            j-=1;
        else
            j+=1;
        if(j%4==0)
        {
            if(!right)
                i++;  // if reaches right side i--;
            else{
                i--;
            }
        }
        if(j==12)
            top=true;
        else if(j==90)
            top = false;
        if(i == 200)// make right = true if reaches right side
            right = true;
        else if(i == 10)// make false it reaches left side
            right = false;
    }
}

我得到这样的输出 enter image description here

  

注意:这将导致无限循环,您需要检查必须停止打印像素的条件。

答案 1 :(得分:0)

你没有在你的WM_PAINT处理程序中使用Sleep(10)循环,是吗?

MFC与否,您应该将数据处理与演示分开。 看来你正在尝试做动画;最简单的方法是使用屏幕外(内存)DC并在其上绘制像素。在某些时候(帧速率?),您将调用父的InvalidateRect()/ UpdateWindow()对。然后在ON_PAINT中,您可以将准备好的DC BitBlt()放到对话框中的首选位置。

答案 2 :(得分:0)

ScrollWindow函数可用于向左滚动现有图形。然后,您将新数据绘制到滚动区域的右侧。如果使用折线功能而不是DrawPixel,绘图会快得多:Polyline绘制像素数组。