MFC绘制双缓冲嵌套矩形

本文介绍了一个使用双缓冲区技术在客户区绘制20个嵌套正方形的应用案例,并通过碰撞检测实现了正方形随窗口边界反弹的效果。文章详细展示了如何创建内存设备上下文(DC),以及如何在内存DC上绘制图形并将其复制到屏幕上。

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

客户区中间绘制20个嵌套正方形,以步长dx,dy移动,进行碰撞检测,如果最大的正方形触到某个边界,就反方向运动,直接绘制和用双缓冲区实现,并观察不同。
定义变量
int x1=30;
int x2=400;
int y1=20;
int y2=400;
int flag=1;//0->左,1->右
int flag1=1;//0->上,1->下

void CMy001View::OnDraw(CDC* pDC)
{
CMy001Doc* 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 loop=0;
while(loop<20){ 
	CRect rect(x1+loop*10,y1+loop*10,x2-loop*10,y2-loop*10);
	dcMem.Rectangle(&rect);
	loop+=1;
}
pDC->BitBlt(0, 0, rect.Width(), rect.Height(),
       &dcMem, 0, 0, SRCCOPY);     // 将内存DC上的图像复制到前台pDC,即实际屏幕对象pDC

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

}
void CMy001View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default

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

	 x1+=5;
	 x2+=5;

 }else     //flag=0 向左移动
 {
   
	 x1-=5;
	 x2-=5;
 }
 if(flag1){//flag1=1向下移动
	y1+=5;
	y2+=5;
 }else{ ////flag1=0向上移动
	y1-=5;
	y2-=5;
 }

 if(x1<=0)
 {
     flag=1;
 }
 if(x2>=rt.Width())
 {
    flag=0;
 }
 if(y1<=0)
 {
     flag1=1;
 }
 if(y2>=rt.Height())
 {
    flag1=0;
 }
//刷新客户区
Invalidate();       
CView::OnTimer(nIDEvent);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值