目标:现在用一个timer在一个static空间上动态绘制一个sin曲线,希望在大约一秒钟内画完一个sin周期图形
思路:
思路:
用timer触发Polyline函数依次连接sin数组内的点,然后动态画出sin曲线
第一次进入OnTimer画点1和点2
第二次进入OnTimer画点1,点2,点3
第三次进入OnTimer画点1,点2,点3,点4
以此类推
m_ArySin是一个Sin数组,X:0~2PI,Y=sin(X)
在timer内用双缓存实现绘图,由于sin数组内有正有负,为了直观化,引入坐标变化,把(X=0,Y=rect.bottom/2)设为原点,结果画出来的图如附件所示,感觉内存里的DC坐标并没有变化正确,虽然内存DC中的Y轴方向是朝上了,但是Y轴起始点好像还是在Y=0的位置
做了N次实验,发现如下代码能够达到预期目的,但是具体理由不详
CBitmap memBitmap;//内存绘图
CBitmap* pOldBmp = NULL;//内存绘图
CRect rect; //控件区域
//获取空间区域DC
CWnd* pWnd = GetDlgItem(IDC_STATIC1);//控件窗口
pWnd->GetClientRect(&rect);//控件客户区
m_pDC = pWnd->GetDC();//获取控件DC
//坐标转换
m_pDC->SetMapMode(MM_ANISOTROPIC);//设置map模式
m_pDC->SetWindowExt(rect.right, -rect.bottom);//设置窗口尺寸,逻辑单位
m_pDC->SetViewportExt(rect.right, rect.bottom);//设置视口尺寸,物理单位
m_pDC->SetViewportOrg(0, rect.bottom/2);//设置设备坐标原点
//m_pDC->SetWindowOrg(0, rect.bottom/2);//设置逻辑坐标原点
// CPoint PtTest;
// PtTest = m_pDC->GetWindowOrg();
// PtTest = m_pDC->GetViewportOrg();
//m_pDC->MoveTo(0,0);
//m_pDC->LineTo(10,-10);
//pWnd->Invalidate();
//pWnd->UpdateWindow();
//创建内存绘图设备
m_memDC.CreateCompatibleDC(m_pDC);
memBitmap.CreateCompatibleBitmap(m_pDC,rect.right,rect.bottom);
pOldBmp = m_memDC.SelectObject(&memBitmap);
//m_memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,m_pDC,0,0,SRCCOPY);
//m_memDC.BitBlt(0,-rect.bottom/2,rect.right,rect.bottom,m_pDC,0,-rect.bottom/2,SRCCOPY);
//坐标转换
m_memDC.SetMapMode(MM_ANISOTROPIC);//设置map模式
m_memDC.SetWindowExt(rect.right, rect.bottom);//设置窗口尺寸,逻辑单位
m_memDC.SetViewportExt(rect.right, -rect.bottom);//设置视口尺寸,物理单位
m_memDC.SetViewportOrg(0, rect.bottom/2);//设置设备坐标原点
//m_memDC.SetWindowOrg(0, rect.bottom/2);//设置逻辑坐标原点
//先把图拷贝到内存获取底色
m_memDC.BitBlt(0,-rect.bottom/2,rect.right,rect.bottom,m_pDC,0,-rect.bottom/2,SRCCOPY);
//绘图
CPen Pen;
CPen* pOldPen;
Pen.CreatePen(PS_SOLID, 1, RG