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)转换,以传送到目标设备环境。
BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);
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
函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);
参数:
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上的例子:
hDCMem; // Handle to the memory device context
HBITMAP hBitmap; // Handle to the new bitmap
int iWidth, iHeight; // 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 (hDC, iWidth, iHeight);
// 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);