什么是DC,以及CreateCompatibleDC,CreateCompatibleBitmap,SelectObject的作用

1、DC是设备上下文的意思,那么什么是设备上下文呢?
举个例子:比如画家画画,那么他需要准备画笔,画纸等一些工具,而画笔又有许多属性,比如,粗细,颜色,那么我们在画画之前,需要确定我们画画所用的画笔的粗细,颜色,以及画纸的背景色,材质,等一些必要的信息,而在电脑中,我们想要将画面绘制出来,那么我们也要需要确定绘制这些画面的一些工具信息,比如使用画笔还是用画刷,比如用何种字体,何种文字颜色,何种背景色,以及当前屏幕的一些属性信息等,而DC就是记录这些属性的一个结构体。
MFC中,通常在OnDraw()函数中,MFC会为我们传入一个DC环境,这个DC貌似是物理DC,因此如果用这个DC来绘图的话,可能会出现闪烁,因此Windows为我们提供了一个兼容DC。我们可以直接把我们想要绘画的内容加入兼容DC中,然后利用物理DC来实现一次性绘图,这样可以避免闪烁,这其实就是使用兼容DC来进行双缓冲绘图。
物理DC会拥有显存资源,也就是可见区域,物理DC就是在这个可见区域进行绘图,但是兼容DC并没有给图像像素提供内存空间,因此我们可以将其与Bitmap一起使用,将Bitmap作为它的可见区域,那么在绘画过程中,我们只需要将我们想要的内容绘制到Bitmap中就可以了。
2、CreateCompatibleDC
CreateCompatibleDC就是用来创建兼容DC的函数。如果传入值为空,那么就创建应用程序窗口的兼容DC,如果传入DC参数,那么就创建与该DC的兼容DC。但是兼容DC在创建的时候,只有1*1像素的尺寸,这明显太小了,因此我们可以通过SelectObject来选择一个位图,作为兼容DC的可见区域。然后使用BitBlt将兼容DC中的可见区域(其实也就是BitMap)渲染到物理DC中,从而将其显示出来。比如:
void OnDraw(CDC* pDC)
{
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap bitMap;
bitMap.LoadBitmap(IDB_BITMAP2);
RECT rect;
GetClientRect(&rect);
CBitmap* oldbit = dc.SelectObject(&bitMap);
pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&dc,0,0,SRCCOPY);
dc.SelectObject(oldbit);
dc.DeleteDC();
}
3、CreateCompatibleBitmap建立一个与屏幕兼容的位图。
创建一个自定义大小位图,在2中,我们是直接载入一个BMP,然后再将其加入兼容DC中。
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap bitMap;
RECT rect;
GetClientRect(&rect);
bitMap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
CBitmap* oldbit = dc.SelectObject(&bitMap);
dc.FillSolidRect(0,0,rect.right,rect.bottom,RGB(255,230,120));
dc.MoveTo(20,100);
dc.LineTo(50,600);
pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&dc,0,0,SRCCOPY);
dc.SelectObject(oldbit);
bitMap.DeleteObject();
dc.DeleteDC();
4、SelectObject
将Bitmap加载到DC中,并返回原先的位图。不用的时候需要删除。
CDC dc;
bitMap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
Bitmap* oldbit = dc.SelectObject(&bitMap);
dc.SelectObject(oldbit);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值