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。
posted @ 2012-12-21 14:03  songtzu  阅读(623)  评论(0编辑  收藏  举报