设备上下文绘图有很多种方法。例如通过创建位图画刷,利用其填充一个区域来实现图像的绘制。此外,还可以使用CDC类的位图函数来输出位图到设备上下文中。

BitBlt 用于从原设备中复制位图到目标设备,语法格式如下:

BOOLBitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORDdwRop);

x:目标矩形区域的左上角x轴坐标点。

y:目标矩形区域的左上角y轴坐标点。

nWidth:在目标设备中绘制位图的宽度。

nHight:在目标设备中绘制位图的高度。

pSrcDC:源设备上下文对象指针。

xSrc:源设备上下文的起点x轴坐标,函数从该起点复制位图到目标设备。

ySrc:源设备上下文的起点y轴坐标,函数从该起点复制位图到目标设备。

dwRop:光栅操作代码

 

dwRop有如下选择:

BLACKNESS           使用黑色填充目标区域

DSTINVERT              目标矩阵区域颜色取反

MERGECOPY            使用与运算组合原设备矩形区域的颜色和目标设备的画刷

MERGEPAINT           使用或运算将反向的源矩形区域的颜色和目标矩形区域的颜色合并

NOTSRCCOPY          复制源设备区域的反色到目标设备中

NOTSRCERASE        使用或运算组合源设备区域与目标设备区域的颜色,然后对结果颜色取反

PATCOPY                  复制源设备当前选中的画刷到目标设备

PATINVERT               使用异或运算组合目标设备选中的画刷和目标设备区域的颜色

PATPAINT                 通过或运算组合目标区域当前选中的画刷和源设备区域反转的颜色

SRCAND                   使用与运算组合源设备和目标设备区域的颜色

SRCCOPY                 直接复制源设备区域到目标设备中

SRCERASE               使用与运算组合目标设备区域的反色与源设备区域的颜色

SRCINVERT              使用异或运算组合源设备区域颜色和目标设备区域颜色

SRCPAINT                 使用或运算组合源设备区域颜色和目标设备区域颜色

WHITENESS             使用白色填充目标区域

StretchBlt与BitBlt不同在于StretchBlt方法能够延伸或收缩位图以适应目标区域的大小。格式如下:

BOOLStrevhBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,intnSrcWidth,int nSrcHeight,DWORD dwRop);

 

x:目标矩形区域的左上角x轴坐标点。

y:目标矩形区域的左上角y轴坐标点。

nWidth:在目标设备中绘制位图的宽度。

nHight:在目标设备中绘制位图的高度。

pSrcDC:源设备上下文对象指针。

xSrc:源设备上下文的起点x轴坐标,函数从该起点复制位图到目标设备。

ySrc:源设备上下文的起点y轴坐标,函数从该起点复制位图到目标设备。

nSrcWidth;需要复制的位图宽度。

nSrcHeight;需要复制的位图高度。

dwRop:光栅操作代码。

下面是两种方法对比程序,程序代码如下:

void CoutoutBmpView::OnDraw(CDC* pDC)

{

COutputBmpDoc* pDoc =GetDocument();//获取文档对象

ASSERT_VALID(pDoc);//验证文档对象

CDC memDC;//定义一个设备上下文

memDC.CreateCompatibleDC(pDC);//创建兼容的设备上下文

CBitmap bmp;//定义位图对象

bmp.LoadBitmap(IDB_BKBITMAP);//加载位图

memDC.SelectObject(&bmp);//选中位图对象

pDC->BitBlt(30,20,180,180,&memDC,1,1,SRCCOPY);//绘制位图

//以上是利用BitBlt来绘制位图

CRect rc(30,20,210,200);//定义一个区域

CBrush brush(RGB(0,0,0));//定义一个黑色的画刷

pDC->FrameRect(rc,&brush);//绘制矩形边框

//只是用来观察两者区别的,绘制一个矩形框

rc.OffsetRect(220,0);//移动区域

//下边是利用StretchBlt绘制的位图

BITMAP BitInfo;//定义位图结构

bmp.GetBitmap(&BitInfo);//获取位图信息

int x = BitInfo.bmWidth;//获取位图宽度

int y = BitInfo.bmHeight;获取位图高度

pDC->StretchBlt(rc.left,rc.top,rc.Width(),rc.Height(),&memDC,0,0,x,y,SRCCOPY);//绘制位图

pDC->FrameRect(rc,&brush);//绘制边框

brush.DeleteObject();//释放画刷

memDC.DeleteDC();//释放设备上下文

bmp.DeleteObject();//释放位图对象

}

【MFC】BitBlt详解的更多相关文章

  1. MFC消息详解 (WindowProc|OnCommand|OnNotify)

    1. 怎样使用MFC发送一个消息用MFC发送一个消息的方法是, 首先,应获取接收消息的CWnd类对象的指针: 然后,调用CWnd的成员函数SendMessage( ). LRESULT Res=pWn ...

  2. VS2010/MFC编程入门之三十八(状态栏的使用详解)

    上一节中鸡啄米讲了工具栏的创建.停靠与使用,本节来讲解状态栏的知识. 状态栏简介 状态栏相信大家在很多窗口中都能见到,它总是用来显示各种状态.状态栏实际上也是一个窗口,一般分为几个窗格,每个窗格分别用 ...

  3. VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)

    上一节讲了标签控件Tab Control以后,常用控件的内容就全部讲完了,当然并没有包括所有控件,主要是一些很常用很重要的控件.本节开始鸡啄米将为大家讲解菜单的概念及使用. 菜单简介 菜单在界面设计中 ...

  4. 【MFC】MoveWindow();函数使用详解

    摘自:http://blog.csdn.net/yjkwf/article/details/5281207 CWnd::MoveWindow 详解 2010-02-02 16:08 3432人阅读 评 ...

  5. MFC下CSocket编程详解(转)

    原文转自 http://blog.csdn.net/yejiansnake/article/details/2175778 MFC下CSocket编程详解: 1. 常用的函数和注意事项(详细的函数接口 ...

  6. VC/MFC的HDC,CDC,CWindowDC,CClientDC,CPaintDC详解:

    VC/MFC的HDC,CDC,CWindowDC,CClientDC,CPaintDC详解: 首先说一下什么是DC(设备描述表) 解:Windows应用程序通过为指定设备(屏幕,打印机等)创建一个设备 ...

  7. MFC中文件对话框类CFileDialog详解及文件过滤器说明

    当前位置 : 首页 » 文章分类 :  开发  »  MFC中文件对话框类CFileDialog详解及文件过滤器说明 上一篇 利用OpenCV从摄像头获得图像的坐标原点是在左下角 下一篇 Word中为 ...

  8. MFC详解

    MFC的消息响应机制详解: 1.MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,接下来详细讲解. 2.在讲解MFC的消息响应之 ...

  9. VC/MFC中的CComboBox控件使用详解

    CComboBox控件详解 CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down l ...

随机推荐

  1. 不能使用 float 和 double 来表示金额等精确的值

    不能使用 float 和 double 来表示金额等精确的值 关于面试,金额用什么数据类型? 不是 doube,更不是 float ,而是用 BigDecimal.对于金融项目,对于金额,误差是不能容 ...

  2. linux weblogic的sh文件

      setDomainEnv.sh   JAVA_HOME和各种jvm参数,CLASSPATH都在这里配置 #!/bin/sh   # WARNING: This file is created by ...

  3. TCP_Wrappers应用层防火墙

    TCP_Wrappers是一个工作在应用层的安全工具,它只能针对某些具体的应用或者服务起到一定的防护作用.比如说ssh.telnet.FTP等服务的请求,都会先受到TCP_Wrappers的拦截. T ...

  4. 使用gpg来加密数据

    一.数据的加密方式 数据加密有三种方式: 1.对称加密(算法有:DES.AES.3DES.)加密和解密使用同一个密钥 2.非对称加密(RSA.DSA.ELGamal等等)一共四把钥匙,用公钥加密数据, ...

  5. shell的正则表达式

    正则表达式处理文件的内容,shell处理文件本身 grep *匹配0到n个 .(点儿)能匹配任意字符----8.8.8.8用于测试外网是否通畅 egrep

  6. java两个实体公共属性赋值方法

    model1 info=new model1();info.setAge("123");info.setCode("1234");info.setName(&q ...

  7. k8s知识1

    kubernetes到底有多难?看下面的白话: service 网络通信原理service 由k8s外面的服务作为访问端 内部里面其实是pod————————————————————————————— ...

  8. maven项目启动找不到org.springframework.web.context.ContextLoaderListener

    解决方法: 1. 右键单击工程项目 ->点击 properties2. 选择 Deployment Assembly3. 点击 Add -> Java Build Path Entries ...

  9. fileReader对象读取txt文件乱码问题 以及如何获取文件的url路径(绝对路径)

    <input type="file" @change="aaa($event)"> <div id="hi">< ...

  10. 【一起学源码-微服务】Nexflix Eureka 源码二:EurekaServer启动之配置文件加载以及面向接口的配置项读取

    前言 上篇文章已经介绍了 为何要读netflix eureka源码了,这里就不再概述,下面开始正式源码解读的内容. 如若转载 请标明来源:一枝花算不算浪漫 代码总览 还记得上文中,我们通过web.xm ...