mfc双缓冲画图-矩形移动

本文介绍了一种使用双缓冲区技术在客户区内绘制20个嵌套正方形的方法,并通过移动这些正方形来实现碰撞检测及反弹效果。具体包括变量定义、绘图函数和定时器设置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

客户区中间绘制20个嵌套正方形,以步长dx,dy移动,进行碰撞检测,如果最大的正方形触到某个边界,就反方向运动,直接绘制和用双缓冲区实现,并观察不同

解决:

###1.定义变量 ##

		int dis=5;//移动速度
	int x0=100,x1=400;
	int y0=100,y1=400;
	int x2=100,x3=400;
	int y2=500,y3=800;
	int x1Max=0;  //最大矩形x坐标

    int flag=1;//0->左,1->右
### 2.ondraw函数画矩形

void CToxingxue01View::OnDraw(CDC* pDC)
{
CToxingxue01Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//双缓冲区绘图
CPoint ptCenter;
CRect rect, ellipseRect;
GetClientRect(&rect); //获得窗口客户区的大小
ptCenter = rect.CenterPoint(); //获得矩形的中心点,目的是为了确定后面同心圆图像的圆心

CDC dcMem;                // 创建用于缓冲作图的内存DC对象dcMem
CBitmap bmp;                  // 创建内存中存放临时图像的位图对象bmp
dcMem.CreateCompatibleDC(pDC);     // 依附窗口DC(窗口对象为pDC),创建兼容内存DC(就是创建一个内存DC,所有图形先画在这上面)
bmp.CreateCompatibleBitmap(&dcMem, rect.Width(), rect.Height());// 在兼容内存DC上,创建兼容位图
dcMem.SelectObject(&bmp);                 // 将位图选入内存DC
dcMem.FillSolidRect(rect, pDC->GetBkColor());// 按照原有背景色填充客户区,否则会成为黑色,同时也使内存DC的背景色保持一致
 // 绘图操作
int i;
for(i=0;i<20;i++)
{
	CRect rect(x0+i*dis,y0+i*dis,x1-i*dis,y1-i*dis);
    dcMem.Rectangle(&rect);
    CRect rect1(x2+i*dis,y2+i*dis,x3-i*dis,y3-i*dis);
    dcMem.Rectangle(&rect1);
	if(i==19)
	{
		x1Max=x1-i*dis;
	}
}
pDC->BitBlt(0, 0, rect.Width(), rect.Height(),
	   &dcMem, 0, 0, SRCCOPY);     // 将内存DC上的图像复制到前台pDC,即实际屏幕对象pDC

dcMem.DeleteDC();      // 删除内存DC
bmp.DeleteObject();      // 删除内存位图
SetTimer(1, 10, NULL);

}

### 3.设置定时器函数

void CToxingxue01View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
//获取客户区窗口大小
CRect rt;
GetClientRect(&rt);
//判断移动方向
if(flag) //flag=1 向右移动
{
x0+=5;
x1+=5;

	 x2+=5;
	 x3+=5;

 }else     //flag=0 向左移动
 {
	x0-=5;
	x1-=5;

 	x2-=5;
	x3-=5;
 }
 if(x0<=0)
 {
	 flag=1;
 }
 if(x1Max>=rt.Width()-100)
 {
	flag=0;
 }
 
 
//刷新客户区
Invalidate();		
CView::OnTimer(nIDEvent);

}

运行结果:
此处为动态效果,上下两个矩形块左右移动,遇到边界反弹;

![这里写图片描述](https://img-blog.youkuaiyun.com/20180917180942909?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDk0ODIy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值