大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
CreateCompatibleDC
函数原型:HDC CreateCompatibleDC(HDC hdc);
参数:
hdc:现有设备上下文环境的句柄,如果该句柄为NULL,该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境。
返回值:如果成功,则返回内存设备上下文环境的句柄;如果失败,则返回值为NULL。
CreateCompatibleDc函数只适用于支持光栅操作的设备,应用程序可以通过调用GetDeviceCaps函数来确定一个设备是否支持这些操作。
当不再需要内存设备上下文环境时,可调用DeleteDc函数删除它。
有效位图
<span style="white-space:pre"> </span>CDC cDC; HDC hdc = ::GetDC(NULL);//获取屏幕DC cDC.Attach(hdc);<span style="white-space:pre"> </span>//创建兼容屏幕DC的内存DC CDC memDCLine; memDCLine.CreateCompatibleDC(&cDC); //加载位图 CBitmap bmpLine; bmpLine.LoadBitmapW(IDB_BMP_TEST);//经过这一步,位图的大小就不为0了 memDCLine.SelectObject(&bmpLine);//经过这一步,内存DC的画布大小更新为位图大小 BITMAP bpLine; bmpLine.GetBitmap(&bpLine);<span style="white-space:pre"> </span>//绘图操作 memDCLine.MoveTo(0, 0); memDCLine.LineTo(bpLine.bmWidth , bpLine.bmHeight); //将内存DC内容绘制到屏幕DC上 cDC.BitBlt(0, 0, bpLine.bmWidth , bpLine.bmHeight, &memDCLine,0,0,SRCCOPY);
CreateCompatibleBitmap
函数功能:该函数创建与指定的设备环境相关的设备兼容的位图。
函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);
参数:
hdc: 设备环境句柄。
nWidth:指定位图的宽度,单位为像素。
nHeight:指定位图的高度,单位为像素。
返回值:如果函数执行成功,那么返回值是位图的句柄;如果函数执行失败,那么返回值为NULL。若想获取更多错误信息,请调用GetLastError。
备注:由CreateCompatibleBitmap函数创建的位图的颜色格式与由参数hdc标识的设备的颜色格式匹配。该位图可以选入任意一个与原设备兼容的内存设备环境中。由于内存设备环境允许彩色和单色两种位图。因此当指定的设备环境是内存设备环境时,由CreateCompatibleBitmap函数返回的位图格式不一定相同。然而为非内存设备环境创建的兼容位图通常拥有相同的颜色格式,并且使用与指定的设备环境一样的色彩调色板。
<span style="white-space:pre"> </span>CDC cDC;
HDC hdc = ::GetDC(NULL);
cDC.Attach(hdc);<pre name="code" class="cpp"><span style="white-space:pre"> </span>//创建内存DC1,兼容屏幕
CDC memDC;
memDC.CreateCompatibleDC(&cDC);CDC memDC2;
<span style="white-space:pre"> </span>//创建内存DC2,兼容屏幕
memDC2.CreateCompatibleDC(&cDC);
<span style="white-space:pre"> </span>//创建内存DC3,兼容屏幕,第二次缓冲用
CDC memBufDC;memBufDC.CreateCompatibleDC(&cDC);
//为内存DC1和2加载位图,用于绘制内容CBitmap bmp;bmp.LoadBitmapW(IDB_BMP_TEST);CBitmap bmp2;bmp2.LoadBitmapW(IDB_BMP_TEST2);
//为内存DC3加载位图,用于缓冲绘制,内存DC1和
内存DC2绘制的是实际的图片,而内存DC3的作用是将内存DC1和内存DC2的内容绘制在内存DC3上防止屏幕闪烁
//所以内存DC3不用加载实际的位图,但是它必须加载位图,否则它的画布不会被更新,所以用到了
CreateCompatibleBitmap创建一个兼容屏幕DC的位图
CBitmap bmp3;bmp3.CreateCompatibleBitmap(&cDC, 1024, 768);BITMAP bp;bmp.GetBitmap(&bp);memDC.SelectObject(&bmp);memBufDC.SelectObject(&bmp3);
//内存DC1的内容绘制到内存DC3上memBufDC.BitBlt(0, 0,bp.bmWidth, bp.bmHeight,&memDC,0,0,SRCCOPY);
<span> </span>//内存DC2的内容绘制到内存DC3上<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
memDC2.SelectObject(&bmp2);memBufDC.BitBlt(0, 0,bp.bmWidth, bp.bmHeight,&memDC2,100,100,SRCCOPY);//直接将内存DC3绘制到屏幕上,一次性绘制,防止屏幕闪烁cDC.BitBlt(0, 0,bp.bmWidth, bp.bmHeight,&memBufDC,0,0,SRCCOPY);
//清理cDC.Detach();memDC.DeleteDC();memDC2.DeleteDC();ReleaseDC(&cDC);
上面为什么要用CreateCompatibleBitmap?
使用CreateCompatibleBitmap是为了更新位图的大小,从而使内存DC3初始化一张画布出来。使用HBITMAP直接载入(SelectObject )内存DC时,
而对于没有经过LoadBitmap的HBITMAP直接载入内存DC,虽然使用BITBLT把其他HDC中的内容放入其中不会报错,但是由于HBITMAP没有载入过图片,
所以需要使用CreateCompatibleBitmap来先模拟初始化一个位图用于更新内存DC3的画布。
CreateCompatibleBitmap创建的位图是空的,一般初始化为黑色(和操作系统有关),关键是复制了参数中dc的位图格式(上面用到了位图大小)。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/209529.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...