我是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中是否有任何正确的方法可以在矩形内部绘制内容(技术上在另一个对象内)?
请帮帮我。
答案 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;
}
}
注意:这将导致无限循环,您需要检查必须停止打印像素的条件。
答案 1 :(得分:0)
你没有在你的WM_PAINT处理程序中使用Sleep(10)循环,是吗?
MFC与否,您应该将数据处理与演示分开。 看来你正在尝试做动画;最简单的方法是使用屏幕外(内存)DC并在其上绘制像素。在某些时候(帧速率?),您将调用父的InvalidateRect()/ UpdateWindow()对。然后在ON_PAINT中,您可以将准备好的DC BitBlt()放到对话框中的首选位置。
答案 2 :(得分:0)
ScrollWindow函数可用于向左滚动现有图形。然后,您将新数据绘制到滚动区域的右侧。如果使用折线功能而不是DrawPixel,绘图会快得多:Polyline绘制像素数组。