在GDI有一个特点: 就是所有的图片绘制,都是通过DC来完成的。DC之间是可以相互传递的。

两个DC之中的图形  通过DC--->DC  来相互传递信息。

无论

位图--->屏幕

位图--->位图

屏幕---->位图

屏幕----->屏幕

他们所使用的都是DC-->DC之间的传递。

其关键点便是:

如何获得各自的DC

对于屏幕:

直接使用GetDC()    ReleaseDC() 便可

::GetDC() 返回的是CDC*

对于图片:

CBitmap  不支持DC

CImage   获得DC

[cpp] view plaincopyprint?
  1. CImage img;
  2. img.Load(imageFilePath);
  3. CDC *pDC;
  4. pDC=CDC::FromHandle(img.GetDC());
  5. // use  pDC here
  6. img.ReleaseDC();

注意:

::GetDC() 返回的是CDC*

而CImage::GetDC() 返回的HDC

对图像进行操作

::GetDC() 所获得的是屏幕的DC, 使用此DC ,可以对屏幕进行绘图。

如果我们想在某一个位图的基础上,再次绘图的话,便不能简单的使用::GetDC()了,因为它只是负责在屏幕上绘图。

那怎么办呢?

既然所有的绘图都是在DC上进行绘图,所以我们必须把这个位图选择进DC,这样对DC操作,就相当直接对位图进行操作

pDC->SelectObject(&bmp):

// use pDC to draw orthers in the bmp

构造内存DC

一般我们为了避免闪烁等现象,需要构造内存DC ,然后再DC上进行绘制,绘制完毕后,通过DC之间的传递,将图像再绘制到屏幕中去。

CDC memDC; 只是创建了一个CDC对象,还没有创建DC资源

memDC.CreateCompatibleDC(pDC);   才是真正创建DC资源。

创建兼容DC是关键,其关键之处在于要创建的DC与哪个现有的DC兼容。

因为内存DC只是个中介,它必须要将其DC中的图像传递到其它DC中(目的DC),才会体现其价值。

而DC 与 DC之间可以传递信息的前提是:两DC是兼容的。

据此可知: 内存DC要兼容目的DC

如下例:

[cpp] view plaincopyprint?
  1. CBitmap bmp;
  2. bmp.LoadBitmap(IDI_BITMAP);
  3. CDC memDC;
  4. memDC.CreateCompatibleDC(pDC);
  5. memDC.SelectObject(&bmp);
  6. pDC->BitBlt(0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY);

DC--->DC的传递

下面针对各种情况一一给出示例:

1 位图--->屏幕

[cpp] view plaincopyprint?
  1. // 位图到屏幕
  2. CBitmap bmp;
  3. BITMAP bm;
  4. CDC memDC;
  5. CDC *pDC=GetDC();
  6. //加载图片 获得图片信息
  7. bmp.LoadBitmap(IDB_BITMAP);
  8. bmp.GetBitmap(&bm);
  9. // 创建与屏幕兼容的DC,并选入位图
  10. memDC.CreateCompatibleDC(pDC);
  11. CBitmap* pOldBmp=(CBitmap *)memDC.SelectObject(&bmp);
  12. // 将位图绘制在屏幕中  位图--->屏幕
  13. pDC->SetStretchBltMode(COLORONCOLOR);
  14. pDC->StretchBlt(0,0,100,100,&memDC,bm.bmWidth,bm.bmHeight,SRCCOPY);
  15. memDC.SelectObject(pOldBmp);
  16. //释放资源
  17. ReleaseDC(pDC);

2

位图到位图1-----二者都是CBitmap类对象

[cpp] view plaincopyprint?
  1. // 位图到位图
  2. // 因为目的地是位图,所以先创建一个空白位图
  3. // 因为是位图与位图之间的传递,所以可以使用两个内存DC来完成
  4. // 两个DC如何兼容? 只要每一个DC都与屏幕DC兼容,则这两个DC也就互相兼容了
  5. CBitmap destBmp;
  6. CBitmap sourceBmp;
  7. BITMAP bm;
  8. // 定义源DC  与目的DC对象
  9. CDC  sourceDC;
  10. CDC  destDC;
  11. // 获得兼容的屏幕DC
  12. CDC *pDC=GetDC();
  13. //加载源图片
  14. sourceBmp.LoadBitmap(IDB_BITMAP);
  15. sourceBmp.GetBitmap(&bm);
  16. // 创建源DC资源
  17. sourceDC.CreateCompatibleDC(pDC);
  18. sourceDC.SelectObject(&sourceBmp);
  19. // 创建Dest位图资源
  20. destBmp.CreateCompatibleBitmap(pDC,bm.bmWidth,bm.bmHeight);
  21. // 创建DestDC资源
  22. destDC.CreateCompatibleDC(pDC);
  23. destDC.SelectObject(&destBmp);
  24. //位图到位图传递
  25. destDC.SetStretchBltMode(HALFTONE);
  26. destDC.StretchBlt(0,0,bm.bmWidth,bm.bmHeight,&sourceDC,0,0,100,100,SRCCOPY);
  27. ReleaseDC(pDC);

位图到位图2---源位图为CImage类

[cpp] view plaincopyprint?
  1. // 位图到位图 2
  2. // 源位图为CImage对象,直接使用CImage对象的成员函数进行传递
  3. CImage sourceImage;
  4. CBitmap destBmp;
  5. CDC destDC;
  6. sourceImage.Load(imageFile);
  7. // 获得CImage对象的DC
  8. CDC *pDC=CDC::FromHandle(sourceImage.GetDC());
  9. // 创建Dest位图资源  DestDC
  10. destDC.CreateCompatibleDC(pDC);
  11. destDC.SelectObject(&destBmp);
  12. ::SetStretchBltMode(destDC.m_hDC,HALFTONE);
  13. ::SetBrushOrgEx(destDC.m_hDC,0,0,NULL);
  14. //  直接使用CImage成员函数进行传递  其实是:CImage封装了DC之间的传递工作
  15. sourceImage.StretchBlt(&destDC,CRect(0,0,100,100),CRect(0,0,100,100),SRCCOPY);
  16. // 释放DC资源
  17. sourceImage.ReleaseDC();

3 屏幕到位图

[cpp] view plaincopyprint?
  1. //屏幕到位图
  2. CBitmap destBmp;
  3. CDC  destDC;
  4. // 获得兼容的屏幕DC
  5. CDC *pDC=GetDC();
  6. // 创建Dest位图资源
  7. destBmp.CreateCompatibleBitmap(pDC,100,100);
  8. // 创建DestDC资源
  9. destDC.CreateCompatibleDC(pDC);
  10. destDC.SelectObject(&destBmp);
  11. //屏幕到位图传递
  12. destDC.SetStretchBltMode(HALFTONE);
  13. destDC.StretchBlt(0,0,100,100,pDC,0,0,100,100,SRCCOPY);
  14. ReleaseDC(pDC);

GDI C++ 位图的绘制相关推荐

  1. WPF中GDI+图形图像的绘制:(五)绘制图像——蒙板效果

    这里要实现的效果指的是对图片像素点区域进行颜色叠加,首先要做的是得到图片非透明部分的区域,效果如图: 实现步骤:1.在主窗体添加控制控件: <Label Grid.Row="4&quo ...

  2. UWP 手绘视频创作工具技术分享系列 - 位图的绘制

    UWP 手绘视频创作工具技术分享系列 - 位图的绘制 原文:UWP 手绘视频创作工具技术分享系列 - 位图的绘制 前面我们针对 SVG 的解析和绘制做了介绍,SVG 是图片的一种形式,而另一种很重要的 ...

  3. WPF中GDI+图形图像的绘制:(一)绘制文本——动态设置字体、大小、颜色

    GDI+(Graphics Device Interface Plus图形设备接口加)是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息.GDI+不但在功能上比GDI 要强大很多 ...

  4. 使用AlphaBlend函数实现位图半透明绘制

    背景 自己使用VC和VS写过很多小游戏,而且不是用现成的游戏引擎,纯粹是使用GDI函数来进行绘图.所以,积累了一些绘图的经验. 那么,对于位图半透明的绘制,在小游戏中使用也比较多.例如烟雾.光等之类的 ...

  5. GDI基础函数使用绘制线条和图形

    1. 绘制一个像素点:SetPixel(). 绘制直线:MoveTo(),LineTo(). 绘制多个首尾相连的线:Polyline(). 绘制矩形:FrameRect(),Rectangle(),F ...

  6. Delphi下的GDI+编程[2] DrawLine - 绘制直线

    例一效果图: 在GDI+中,绘制直线是通过TGPGraphics类的DrawLine方法实现的,此类的一些方法如下: DrawLine(线条) DrawRectangle(矩形) DrawEllips ...

  7. GDI+ 中图片的绘制

    背景 GDI+ 中使用 Graphics 类的成员函数 DrawImage 来绘制图片. 原样绘制 使用 Graphics 类的 成员函数 DrawImage 来绘制图片,当仅指定绘制起始位置时按照图 ...

  8. GDI+绘图基础,绘制表格

    GDI+绘图基础 编写图形程序时需要使用GDI(图形设备接口Graphics Device Interface),从程序设计的角度看,GDI包括两个部分:GDI对象和GDI函数. GDI对象定义了GD ...

  9. GDI+——使用Graphics类绘制基本图形

    目录 绘制基本图形 绘制直线 绘制矩形 绘制椭圆 绘制圆弧 绘制扇形 绘制多边形 绘制文本 综合案例 绘制波形曲线 使用双缓冲技术绘图 绘制基本图形 绘制直线 绘制直线用到了Graphics类的Dra ...

最新文章

  1. 状态估计问题学习记录(1)
  2. python读取文件某一行-python和shell读取文件某一行
  3. NYOJ 35 表达式求值
  4. MatConvnet工具箱文档翻译理解(4)
  5. 2015-11-16 入职坑
  6. 2016.07.24
  7. 备忘:VC++ 中的异常处理
  8. Python数据类型转换详解(内附详细案例)
  9. 10年老分析师:数据分析不只是一个岗位,更是一种职场必备能力
  10. c3p0存在严重bug “APPARENT DEADLOCK“的问题
  11. 7.11计划,做个没心没肺的人
  12. yolo-v5连接手机摄像头实时检测的步骤
  13. matlab 生成自回归,Matlab时间序列-AR-自回归.pdf
  14. 微信支付提示:支付失败,如果已经扣款,资金会在0~3个工作日内原路退回
  15. 别做正常的傻瓜-读后感
  16. <video>标签及属性说明
  17. Java毕业设计_基于BootStrap的晴雅花艺交流论坛的开发
  18. 毕业设计 嵌入式 智能火灾报警器设计与实现
  19. 判断字符串是不是回文
  20. 远程桌面协议(RDP)工具 FreeRDP

热门文章

  1. UE4学习-程序崩溃,如何恢复工程
  2. c语言行列倒置算法,循环行列的元素倒置。求指点
  3. 白盒测试和黑盒测试_黑盒测试与白盒测试的比较
  4. php怎么样sphinx,php使用sphinx
  5. python半年能达到什么程度_花半年的时间能把Python自学到什么程度?
  6. 这种制作PCB板的方法,只需要一分钟!
  7. 100块钱买100只鸡php,使用JS计算买100只鸡问题
  8. html 的c标签库,jstl C标准标签库Ⅰ
  9. 2016php技术面试题,一个php的面试题,大家看看
  10. php面向对象引用文件,PHP面向对象之对象和引用