b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

bitblt_bitblt中源设备的像素_bitblt 透明

电脑杂谈  发布时间:2017-01-20 00:03:24  来源:网络整理

bitblt 透明_bitblt中源设备的像素_bitblt

用双缓存作图搞得我头都大了,麻烦高手来看一下。

目标:

现在用一个timer在一个static空间上动态绘制一个sin曲线,希望在大约一秒钟内画完一个sin周期图形

思路:

用timer触发Polyline函数依次连接sin数组内的点,然后动态画出sin曲线

问题:

在timer内用双缓存实现绘图,由于sin数组内有正有负,为了直观化,引入坐标变化,把(X=0,Y=rect.bottom/2)设为原点,结果画出来的图如附件所示,感觉内存里的DC坐标并没有变化正确,虽然内存DC中的Y轴方向是朝上了,但是Y轴起始点好像还是在Y=0的位置,想请教高手问题出在哪里,应该如何改善。多谢多谢!

执行结果:

CPoint m_ArySin[1000];//存放sin曲线点坐标的数组,X:0~2PI,Y:-1~+1
void CPage1::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: Add your message handler code here and/or call default

	switch (nIDEvent)
	{
	case 1:	
		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);//设置逻辑坐标原点
		
		//创建内存绘图设备
		m_memDC.CreateCompatibleDC(m_pDC);
		memBitmap.CreateCompatibleBitmap(m_pDC,rect.right,rect.bottom);
		pOldBmp = m_memDC.SelectObject(&memBitmap);

/*
		//坐标转换
		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);//设置逻辑坐标原点
*/

		//绘图
		CPen Pen;
		CPen* pOldPen;
		Pen.CreatePen(PS_SOLID, 1, RGB(255,255,0));
		pOldPen = m_memDC.SelectObject(&Pen);

		//画线
		m_memDC.Polyline(m_ArySin, m_nTime1Cnt);

		m_memDC.SelectObject(pOldPen);
		Pen.DeleteObject();

		//内存拷贝到屏幕
		m_pDC->BitBlt(0,0,rect.right,rect.bottom,&m_memDC,0,0,SRCCOPY);
		
		//析构
		m_memDC.SelectObject(pOldBmp);
		m_memDC.DeleteDC();
		memBitmap.DeleteObject();

		m_nTime1Cnt += 1;
		if(m_nTime1Cnt==165)
		{
			KillTimer(1);
		}


		break;
	}

	CDialogEx::OnTimer(nIDEvent);
}


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-27469-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...