MFC如何画矩形

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC如何画矩形相关的知识,希望对你有一定的参考价值。

参考技术A pDC->Rectangle(x1,y1,x2,y2);这条语句的执行结果是在屏幕画面上显示一个左上点在(x1,y1),右下点在(x2,y2)的矩形及其边线。
查看原帖>>
记得采纳啊

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

【中文标题】MFC - 如何在矩形内绘制像素波【英文标题】:MFC - How to draw pixel waves inside a rectangle 【发布时间】:2015-08-05 11:50:33 【问题描述】:

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

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

在对话框窗口上,我已经绘制了一个矩形(在 OnPaint 事件中),如下所示。

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);

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

到目前为止,我所做的是,

bool top = false;
    for(i=10,j=92;i<200 && j>10;)
    
        pDC->SetPixel(i,j,NewColor);
        Sleep(10);

        if(!top)
            j-=1;
        else
            j+=1;
        if(j%4==0)
        
            i+=1;

        
        if(j==12)
            top=true;
        if(j==90)
            top = false;

    

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

我想在矩形内连续绘制波浪,就像当它到达右端时它应该向左移动并且应该是连续的。

在 MFC 中是否有任何适当的方法可以在矩形内(技术上在另一个对象内)绘制一些东西?

请帮帮我。

【问题讨论】:

很高兴看到你继续 ;-)。关于您的问题,我想指出 MFC(以及 MFC 所依赖的 Win32 API)的绘图功能相当有限。如果你想要更高级的东西,那么你最好看看像 Cairo (www.cairographics.org) 这样的库,它们有你需要的东西并且可以在 Win32 API 的“顶部”使用(即你从像 CDC 这样的对象获得的句柄等) 卡里奥?他可以轻松地使用 GDI+ 来满足他的大部分需求。 @Ribinson.. 我在 GDI 函数上搜索了很多以限制某些限制的绘图,但我没有找到。您能否分享一个示例或提及执行此工作的任何 GDI 功能? 【参考方案1】:

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

【讨论】:

感谢您的回复。我想这可能是我想要的。但是在 for 循环中使用滚动窗口功能只会闪烁特定的矩形部分。当我们滚动该部分时,该区域中已经绘制的像素也应该向左移动正确吗? 知道了。现在它的工作。我将窗口左侧滚动了 10 个单位,并将我的 x 值减少了 10。现在它是连续的和连续的。感谢您的帮助。【参考方案2】:

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

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;
    

我得到类似这样的输出

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

【讨论】:

非常感谢您的帮助。这将在某种程度上起作用。但我真正想要的是类似于心跳波形或波形中的外汇交易读数,即使在到达右端后也会绘制波浪,因为左端像素甚至会向左移动(将其进一步向左移动会使这些像素出现的矩形),因此绘制的整个像素将具有向左移动的效果,但像素将被写入右侧。但它不会移出矩形(右侧),因为整个东西移动到左侧)。 抱歉,我无法正确解释。我只是想找到一种方法来无限地在矩形右侧内打印像素(直到某些停止事件)。使用当前逻辑,我们可以更改 x 轴上的限制,但它会继续打印超出矩形。(这不合逻辑)。所以我想知道 MFC 或 GDI 中是否有内置的东西可以在矩形内(严格地)绘制一些东西,这样超出矩形尺寸的任何东西都不会可见(因为我们在矩形内绘制)。【参考方案3】:

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

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

【讨论】:

感谢您的建议。我将在绘图期间遵循此模型。

以上是关于MFC如何画矩形的主要内容,如果未能解决你的问题,请参考以下文章

MFC绘制矩形

MFC怎么绘制一个圆角矩形

MFC里面画矩形 ,怎么改变矩形边框颜色?

如何将已经设置好的VC MFC 矩形按钮改成圆形 工程的基类是CView

使用MFC编制基于对话框的Windows应用程序,实现画图功能

MFC中,对话框的背景如何更换?