MFC - 如何在矩形内绘制像素波
MFC - How to draw pixel waves inside a rectangle
我是 MFC 的新手,正在尝试从头开始学习。
我正在尝试在 VS2012 - MFC 中创建一个基于对话框的小应用程序。
在对话框中 window 我已经像这样绘制了一个矩形(在 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;
}
我只是直接在 window 上绘制像素,但在矩形所在的尺寸范围内。波浪在到达矩形的正确维度时停止。但我觉得那不是正确的做法。
我想在矩形内部绘制波浪,而且是连续的,比如当它到达右端时它应该向左移动并且应该是连续的。
在 MFC 中有什么正确的方法可以在矩形内(技术上是在另一个对象内)绘制东西吗?
请帮帮我。
我试过你的代码,只是添加了一些条件,所以如果它到达右侧,它应该开始向左移动。
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;
}
}
我得到这样的输出
NOTE: this will cause infinite loop, you need to check condition where you have to stop printing pixels.
您没有在 WM_PAINT 处理程序中使用 Sleep(10) 循环,是吗?
无论是否使用 MFC,您都应该将数据处理与表示分开。
看来您正在尝试制作动画;最简单的方法是拥有一个屏幕外(内存)DC 并在其上绘制像素。在某些时候(帧速率?),您会调用父级的 InvalidateRect()/UpdateWindow() 对。然后在 ON_PAINT 中,您可以将准备好的 DC BitBlt() 放到对话框中您喜欢的位置。
ScrollWindow 函数可用于将现有图形向左滚动。然后将新数据绘制到滚动区域的右侧。如果使用 Polyline 函数而不是 DrawPixel,绘图会更快:Polyline 绘制一个像素数组。
我是 MFC 的新手,正在尝试从头开始学习。
我正在尝试在 VS2012 - MFC 中创建一个基于对话框的小应用程序。
在对话框中 window 我已经像这样绘制了一个矩形(在 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;
}
我只是直接在 window 上绘制像素,但在矩形所在的尺寸范围内。波浪在到达矩形的正确维度时停止。但我觉得那不是正确的做法。
我想在矩形内部绘制波浪,而且是连续的,比如当它到达右端时它应该向左移动并且应该是连续的。
在 MFC 中有什么正确的方法可以在矩形内(技术上是在另一个对象内)绘制东西吗?
请帮帮我。
我试过你的代码,只是添加了一些条件,所以如果它到达右侧,它应该开始向左移动。
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;
}
}
我得到这样的输出
NOTE: this will cause infinite loop, you need to check condition where you have to stop printing pixels.
您没有在 WM_PAINT 处理程序中使用 Sleep(10) 循环,是吗?
无论是否使用 MFC,您都应该将数据处理与表示分开。 看来您正在尝试制作动画;最简单的方法是拥有一个屏幕外(内存)DC 并在其上绘制像素。在某些时候(帧速率?),您会调用父级的 InvalidateRect()/UpdateWindow() 对。然后在 ON_PAINT 中,您可以将准备好的 DC BitBlt() 放到对话框中您喜欢的位置。
ScrollWindow 函数可用于将现有图形向左滚动。然后将新数据绘制到滚动区域的右侧。如果使用 Polyline 函数而不是 DrawPixel,绘图会更快:Polyline 绘制一个像素数组。