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。
  • 相关阅读:
    尽量采用as操作符而不是旧式C风格做强制类型转换
    尽量使用条件属性(Conditional Attribute)而不是#if/#endif预处理
    C#跟踪和调试程序-Debug类使用
    C#使用ConditionalAttribute特性来实现代码调试
    微软认知服务:QnA Maker使用示例
    PHP使用微软认知服务Face API
    微软认知服务识别名人和地标
    基于apache httpclient 调用Face++ API
    认知服务调用如何使用图片的DataURL
    Microsoft Azure Storage Exployer使用指南
  • 原文地址:https://www.cnblogs.com/songtzu/p/2827872.html
Copyright © 2011-2022 走看看