zoukankan      html  css  js  c++  java
  • MFC显示位图 from http://blog.csdn.net/liuzhuomju/article/details/7299458

    这些例子都在vs2005测试通过
    一.最简单的一种
    1、将图像文件以资源形式加入工程中,IDB_BITMAP1
    2、用一个PICTURE控件,在其属性中,将其Type设置为Bitmap
    3、将Piture控件的属性中的Image设置为IDB_BITMAP1
    二.这个方法也比较简单(代码解释请看第三种方法)
    1、将图像文件以资源形式加入工程中,IDB_BITMAP1
    HDC MemDC;
    CBitmap bit;
    MemDC =CreateCompatibleDC(0);
    CString cc;
    bit.LoadBitmapW(IDB_BITMAP1);
    SelectObject(MemDC,bit);
    CClientDC dc(this);
    BitBlt(dc.m_hDC,0,0,400,300,MemDC,0,0,SRCCOPY);
    三. 这个方法比较好,从文件里面导入相片(代表人人看法)
    HDC  MemDC;//一个环境设备
    MemDC =CreateCompatibleDC(0);//得到一个兼容设备句柄
    HBITMAP bit;//一个位图
    CString cc;
    cc="test.bmp";//图片名称  要放到当前目录
    bit=(HBITMAP)LoadImage(AfxGetInstanceHandle(),cc,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);//导入图片
    SelectObject(MemDC,bit);//把图片选择设备
    CClientDC dc(this);//取得dc
    BitBlt(dc.m_hDC,0,0,400,300,MemDC,0,0,SRCCOPY);//把 MemDC到dc.m_hDC显示,也就是在屏幕显示
    补充:如果想要在一个按钮上添加位图可以这样子
    1.先设Bitmap 为ture
    CButton *pBtn = (CButton *)GetDlgItem(IDC_BUTTON1);
    pBtn->SetBitmap(::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1)));
    或是从文件夹里面导入图片也可以:
    HBITMAP bit;
    bit=(HBITMAP)LoadImage(AfxGetInstanceHandle(),TEXT("test.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);//导入图片
    CButton *pBtn = (CButton *)GetDlgItem(IDC_BUTTON1);
    pBtn->SetBitmap((HBITMAP)bit);

    bmp无闪烁显示技术HDC hdc;
    HDC  MemDC;
    HDC  BKDC;
    HDC  BuffDC;
    HDC hScrDC;
    HBITMAP bmp;
     hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); // 屏幕DC
     bmp = CreateCompatibleBitmap(hScrDC,WIDTH,HEIGHT); //一个兼容位图
     MemDC = CreateCompatibleDC(0); //得到一个兼容设备句柄 
     BKDC = CreateCompatibleDC(0);  //背景DC
     BuffDC = CreateCompatibleDC(0); //缓存DC
     SelectObject(BuffDC,bmp); //与兼容位图相关联
     bit=(HBITMAP)LoadImage(hInst,TEXT("bk.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);//导入图片
     SelectObject(BKDC,bit);  //把图片选择设备
     hdc = BeginPaint(hWnd, &ps);//客户窗口
     BitBlt(BuffDC,0,0,640,480,BKDC,0,0,SRCCOPY);//在缓存显示背景
     BitBlt(BuffDC,0,0,640,480,MemDC,0,0,SRCCOPY);//在缓存显示图片
     BitBlt(hdc,0,0,640,480,BuffDC,0,0,SRCCOPY);//把缓存到dc.m_hDC显示,也就是在屏幕显

    BitBlt方法说明:

    BitBlt - 函数功能

    函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境

    BitBlt - 函数原型

    BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);

    BitBlt - 主要参数



        hdcDest:指向目标设备环境的句柄。

        nXDest:指定目标矩形区域左上角的X轴逻辑坐标。    nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。

        nWidth:指定源和目标矩形区域的逻辑宽度。

        nHeight:指定源和目标矩形区域的逻辑高度。

        hdcSrc:指向源设备环境的句柄。

        nXSrc:指定源矩形区域左上角的X轴逻辑坐标

        nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。

        dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。

        下面列出了一些常见的光栅操作代码:

        BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。

        DSTINVERT:表示使目标矩形区域颜色取反。

        MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。

        MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。

        NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。

        NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。

        PATCOPY:将特定的模式拷贝到目标位图上。

        PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。

        PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。

        SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。

        SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。

        SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。

        SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。

        SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。

        WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。

        返回值:如果函数成功,那么返回值非零;如果函数失败,则返回值为零。

        Windows NT:若想获取更多错误信息,请调用GetLastError函数。

        备注:如果在源设备环境中可以实行旋转或剪切变换,那么函数BitBlt返回一个错误。如果存在其他变换(并且目标设备环境中匹配变换无效),那么目标设备环境中的矩形区域将在需要时进行拉伸、压缩或旋转。

        如果源和目标设备环境的颜色格式不匹配,那么BitBlt函数将源场景的颜色格式转换成能与目标格式匹配的格式。当正在记录一个增强型图元文件时,如果源设备环境标识为一个增强型图元文件设备环境,那么会出现错误。如果源和目标设备环境代表不同的设备,那么BitBlt函数返回错误。

        Windows CE:在Windows CE 1.0版中,参数dwRop只可以指定为下列值:SRCCOPY、SRCAND、SRCPAINT、SRCINVERT。在Windows CE 2.0版中,参数dwRop可以是任何光栅操作代码值。

        速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:wingdi.h;库文件:gdi32.lib。

    SelectObject 

    请用一段简单的话描述该词条,马上添加摘要

    SelectObject - 函数功能

    函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

        函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);

    SelectObject - 参数说明


        参数

        hdc:设备上下文环境的句柄。

        hgdiobj:被选择的对象的句型,该指定对象必须由如下的函数创建。

        位图:CreateBitmap, CreateBitmapIndirect, CreateCompatible Bitmap, CreateDIBitmap, CreateDIBsection(只有内存设备上下文环境可选择位图,并且在同一时刻只能一个设备上下文环境选择位图)。

        画笔:CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush。

        字体:CreateFont, CreateFontIndirect。

        笔:CreatePen, CreatePenIndirect。

        区域:CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect。

        返回值:如果选择对象不是区域并且函数执行成功,那么返回值是被取代的对象的句柄;如果选择对象是区域并且函数执行成功,返回如下一值;

        SIMPLEREGION:区域由单个矩形组成;COMPLEXREGION:区域由多个矩形组成。NULLREGION:区域为空。

        如果发生错误并且选择对象不是一个区域,那么返回值为NULL,否则返回GDI_ERROR。

        注释:该函数返回先前指定类型的选择对象,一个应用程序在它使用新对象进行绘制完成之后,应该用新对象替换原始的缺省的对象。

        应用程序不能同时选择一个位图到多个设备上下文环境中。

       ICM:如果被选择的对象是画笔或笔,那么就执行颜色管理。

        速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:wingdi.h;库文件:gdi32.lib。

    HBITMAP CreateCompatibleBitmap(HDC hdc,  int nWidth,  int nHeight);

    参数

    hdc: 设备环境句柄。

    nWidth, nHeight:指定位图的宽度和高度,单位为像素。

    返回值

       如果函数执行成功,那么返回值是位图的句柄;如果函数执行失败,那么返回值为NULL。若想获取更多错误信息,请调用GetLastError。

    备注

       由CreateCompatibleBitmap函数创建的位图的颜色格式与由参数hdc标识的设备的颜色格式匹配。该位图可以选入任意一个与原设备兼容的内存设备环境中。

       由于内存设备环境允许彩色和单色两种位图。因此当指定的设备环境是内存设备环境时,由CreateCompatibleBitmap函数返回的位图格式不一定相同。然而为非内存设备环境创建的兼容位图通常拥有相同的颜色格式,并且使用与指定的设备环境一样的色彩调色板。

       如果程序设置 nWidth 或 nHeight 为 0,CreateCompatibleBitmap 返回 1*1像素,单色位图(a 1- by 1-pixel, monochrome bitmap)的句柄。

       如果一个DIB,即由CreateDIBSection创建的位图,被选入由hdc标识的设备环境,CreateCompatibleBitmap 创建一个DIB对象。

       当不使用位图后,调用DeleteObject 删除对象。

    下面是MSDN上的例子:

    HDC hDC,                // Handle to the display device context 
        hDCMem;             // Handle to the memory device context
    HBITMAP hBitmap;        // Handle to the new bitmap
    int iWidthiHeight;    // Width and height of the bitmap

    // Retrieve the handle to a display device context for the client 
    // area of the window. 
    hDC = GetDC (hwnd);

    // Create a memory device context compatible with the device. 
    hDCMem = CreateCompatibleDC (hDC);

    // Retrieve the width and height of window display elements.
    iWidth  GetSystemMetrics (SM_CXSCREEN) / 10;
    iHeight = GetSystemMetrics (SM_CYSCREEN) / 10;

    // Create a bitmap compatible with the device associated with the 
    // device context.
    hBitmap = CreateCompatibleBitmap (hDCiWidthiHeight);

    // Insert code to use the bitmap.

    // Delete the bitmap object and free all resources associated with it. 
    DeleteObject (hBitmap);

    // Delete the memory device context and the display device context.
    DeleteDC (hDCMem);
    DeleteDC (hDC);
     
     
     
     
     

    SetDIBits

    编辑本段函数功能

      该函数使用指定的DIB位图中发现的颜色数据来设置位图中的像素。
     

    编辑本段函数原型

      int SetDIBits(HDC hdc, HBITMAP hbmp, UINT uStartScan, UINT cScanLines, CONST VOID *lpvBits,CONST BITMAPINFO *lpbmi, UINT fuColorUse);

    参数

      hdc:指向设备环境中的句柄。
     
      hbmp:指向位图的句柄。函数要使用指定DIB中的颜色数据对该位图进行更改。
     
      uStartScan:为参数lpvBits指向的数组中的、与设备无关的颜色数据指定起始扫描线
     
      cScanLines:为包含与设备无关的颜色数据的数组指定扫描线数目。
     
      lpvBits:指向DIB颜色数据的指针,这些数据存储在字节类型的数组中,位图值的格式取决于参数lpbmi指向的BITMAPINFO结构中的成员biBitCount。
     
      lpbmi:指向BITMAPINFO数据结构的指针,该结构包含有关DIB的信息。
     
      fuColorUse:指定是否提供了BITMAPINFO结构中的bmiColors成员,如果提供了,那么bmiColors是否包含了明确的RGB值或调色板索引。参数fuColorUse必须取下列值,各值的含义为:
     
      DIB_PAL_COLORS:颜色表由16bit的索引值数组组成。这些值可以对由hdc参数标识的设备环境中的逻辑调色板进行索引。
     
      DIB_RGB_COLORS:提供了颜色表,并且表中包含了原义的RGB值。

    返回值

      如果函数成功,那么返回值就是复制的扫描线数;如果函数失败,那么返回值是0。
     
      Windows NT:若想获得更多错误信息,请调用GetLastError函数。
     

    编辑本段备注

      当位图的位要索引到系统调色板时,可获取最佳的位图绘制速度。
     
      应用程序可能通过调用GetSystemPaletteEntries函数来检索系统调色板颜色和索引。在检索到颜色和索引值之后,应用程序可以创建DIB,有关更多的信息,请参考系统调色板(System Paletle)。
     
      只有在参数fuColorUse设置为DIB_PAL_COLORS常量时才使用参数hdc标识的设备环境,否则会忽略hdc参数中的值。
     
      在应用程序调用该函数时,必须把由参数hbmp标识的位图选入到设备环境中。
     
      自底向上的DIB位图的起始点是该位图的左下角处,自顶向下的DIB位图的起源点在该位图的左上角处。
     
      ICM:颜色管理照样进行。如果指定的BITMAPINFO结构不是BITMAPV4HEADER或BITMAPV5HEADER,那么当前设备环境的颜色配置(profile)就用作源颜色配置。如果BITMAPINFO结构不是BITMAPV4HEADER或BITMAPV5HEADER,那么使用RGB颜色。如果指定的BITMAPINFO结构是BITMAPV4HEADER或BITMAPV5HEADER,那么与该位图有关的颜色配置(profile)被用作源颜色。
     
      速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:wingdi.h:库文件:gdi32.lib。
  • 相关阅读:
    剑指 Offer——13. 调整数组顺序使奇数位于偶数前面
    剑指 Offer——3. 从尾到头打印链表
    剑指 Offer——2. 替换空格
    剑指 Offer——1. 二维数组中的查找
    LeetCode 905. Sort Array By Parity 按奇偶校验排列数组
    LeetCode 448. Find All Numbers Disappeared in an Array找到所有数组中消失的元素
    SSH 代码笔记
    anaconda3安装caffe
    opencv多版本安装
    人脸文章与数据库
  • 原文地址:https://www.cnblogs.com/songtzu/p/2827872.html
Copyright © 2011-2022 走看看