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 中,您将 BitBlt() 准备好的 DC 放到对话框中的首选位置。
【讨论】:
感谢您的建议。我将在绘图期间遵循此模型。以上是关于MFC如何画矩形的主要内容,如果未能解决你的问题,请参考以下文章
如何将已经设置好的VC MFC 矩形按钮改成圆形 工程的基类是CView