关于SetMapMode坐标变换以后的BitBlt使用

目标:现在用一个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的位置

关于SetMapMode坐标变换以后的BitBlt使用_第1张图片

做了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

你可能感兴趣的:(MFC,绘图,双缓存,BitBlt)