最终--VC中MFC如何显示位图(拉伸以及非拉伸)

简单的记一下如何显示位图:

1、声明一个CBitmap对象,并从资源中加位图。

2、创建一个兼容的DC,用CDC的成员函数CreateCompatibleDC

3、用CDC的成员函数SelectObject将位图选入到兼容DC中。

4、用CDC的成员函数BitBlt来输出位图。

就这样了,一个完整的位图说显示了!

========================== 显示位图=====================================

void CBitmapView::wtj_paint()
{
  CDC *pDC;                            //1
 指定设备环境,并获得指针
  pDC=GetDC();
 ------------------------------------------------------------------------------------
CBitmap wtj_bitmap;                    //2
 创建位图对象
  BITMAP bmInfo;                       // 3
定义位图变量  wtj_bitmap.LoadBitmap(IDB_BITMAP1);  //4加载位图到对象
------------------------------------------------------------------------------------------

 CDC dcMemory;                        //5
定义并创建内存环境
 dcMemory.CreateCompatibleDC(pDC);//
----------------------------------------------------------------------------//
关联位图对象和位图变量
 wtj_bitmap.GetObject(sizeof(bmInfo),&bmInfo);//6
将位图对象的图片放入到位图变量中
dcMemory.SelectObject(&wtj_bitmap);//7将位图变量选入到内存环境

---------------------------------------------------------------------------------------------
 pDC->BitBlt(100,100, bmInfo.bmWidth,bmInfo.bmHeight,  &dcMemory,0,0,SRCCOPY);
                                 //9
图片由内存环境传送至设备环境
ReleaseDC(pDC);                 //10 记得释放设备环境     
}

  

=======================显示位图,自如拉伸===================================

void CBitmapView::wtj_paint()
{
  CDC *pDC;
  pDC=GetDC();

-----------------------------

CRect rect;    //创建一个CRect对象rect,矩形结构类,此对象用来指定要拉伸变为的大小
---------------------------

  CBitmap wtj_bitmap;
  CDC dcMemory;
  wtj_bitmap.LoadBitmap(IDB_BITMAP1);
  BITMAP bmInfo;
  wtj_bitmap.GetObject(sizeof(bmInfo),&bmInfo);
  dcMemory.CreateCompatibleDC(pDC);
  dcMemory.SelectObject(&wtj_bitmap);
----------------------------------------

 pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMemory, 0,0, bmInfo.bmWidth,bmInfo.bmHei  ght, SRCCOPY);//利用StretchBlt()贴图实现自动拉伸
------------------------------------------- 

ReleaseDC(pDC);
}

//函数使用说明 ==其中指定矩形 表示要从源矩形大小变为指定矩形大小

目的设备环境 –>StretchBlt(目标矩左上x ,目标矩左上y , 指定矩形宽度 ,指定矩形高度, 源设备环境句柄, 源矩左上x, 源矩左上y, 源矩宽度,源矩高度 , SRCCOPY)

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

StretchBlt

函数功能

函数从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩。

编辑本段函数原型

BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop)

编辑本段参数

BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop)

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

nXOriginDest:指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。

nYOriginDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。

nWidthDest:指定目标矩形的宽度,按逻辑单位表示宽度。

nHeightDest:指定目标矩形的高度,按逻辑单位表示高度。

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

nXOriginSrc:指向源矩形区域左上角的X轴坐标,按逻辑单位表示坐标。

nYOriginSrc:指向源矩形区域左上角的Y轴坐标,按逻辑单位表示坐标。

nWidthSrc:指定源矩形的宽度,按逻辑单位表示宽度。

nHeightSrc:指定源矩形的高度,按逻辑单位表示高度。

dwRop:指定要进行的光栅操作。光栅操作码定义了系统如何在输出操作中组合颜色,这些操作包括刷子、源位图和目标位图等对象。参考BitBlt可了解常用的光栅操作码列表。

 

 

 

 

 

 

CBitmap

目录

CBitmap

构造函数

初始化函数

属性

操作

编辑本段CBitmap

  继承图表[1]

CBitmap封装了Windows图形设备接口GDI)中的位图,并且提供了操纵位图的成员函数。使用CBitmap对象之前要先构造CBitmap对象,调用其中的一个初始化成员函数设置位图对象的句柄。此后就可以调用其它成员函数了。要了解有关使用像CBitmap这样的图形对象的详细信息,请参阅联机文档“Visual C++ 程序员指南中的图形对象

#include

CBitmap类的成员

编辑本段构造函数

CBitmap 构造一个CBitmap对象

编辑本段初始化函数

LoadBitmap 从应用的可执行文件中加载一个命名的位图资源来初始化位图对象。

LoadOEMBitmap 加载一个预定义的Windows位图来初始化位图对象。

LoadMappedBitmap 加载一个位图并把它的颜色映射为系统颜色。

CreateBitmap 用一个指定宽度、高度和位图模式的依赖于设备的内存位图初始化位图对象。CreateBitmapIndirect BITMAP结构中给出的宽度、高度和模式(可以不指定)的位图初始化位图对象。CreateCompatibleBitmap 用一个位图初始化对象使之与指定设备兼容。

CreateDiscardableBitmap 用一个可丢弃的、与指定设备兼容的位图初始化对象。

编辑本段属性

LoadBitmap 从应用的可执行文件中加载一个命名的位图资源来初始化位图对象LoadOEMBitmap 加载一个预定义的Windows位图来初始化位图对象LoadMappedBitmap 加载一个位图并把它的颜色映射为系统颜色。

编辑本段操作

FromHandle 给出Windows HBITMAP结构的指针时,返回指向CBitmap对象的指针。

SetBitmapBits 位图的位设为指定的值。

GetBitmapBits 拷贝指定位图的位值到指定的缓冲。

SetBitmapDimension 设置位图的宽度和高度(以0.1毫米为单位)。

GetBitmapDimension 返回位图的宽度和高度。要求已经调用SetBitmapDimension设置位图的宽度和高度。[2]

参考资料

Bitmap

目录

定义

位图图像

分辨率

索引颜色

算法

展开

编辑本段定义

typedef struct tagBITMAP{

LONG bmType; //位图类型,必须为0

LONG bmWidth; //位图宽度

LONG bmHeight; //位图高度

LONG bmWidthBytes; //每一行像素所在的byte

WORD bmPlanes; //颜色平面数

WORD bmBitsPixel; //像素的位数

LPVOID bmBits; //位图内存指针

}BITMAP;

 

 

-----------------------------------------------------------------------------------------------------

加载一位图,可以使用LoadImage

HANDLE LoadImageHINSTANCE hinstLPCTSTR lpszNameUINT uTypeint cxDesiredint CyDesiredUINT fuLoad);

LoadImage可以用来加载位图,图标和光标

加载时可以规定加载图的映射到内存的大小:

    cxDesired:指定图标或光标的宽度,以像素为单位。如果此参数为零并且参数fuLoad值中LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源宽度。

 cyDesired:指定图标或光标的高度,以像素为单位。如果此参数为零并且参数fuLoad值中LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源高度。

LoadImage的返回值是相关资源的句柄。因为加载的是位图所以返回的句柄是HBITMAP型的(需要强制转换)。

 

延伸理解 HBITMAP/CBitmap/BITMAP

HBITMAPbitmap的指针,

msdn中如是:Handle to a bitmap.typedef HANDLE HBITMAP;

CBitmapmfc中封装bitmap的类;

msdn中:

Encapsulates(囊括) a Windows graphics device interface (GDI) bitmap and provides member functions to manipulate(操作) the bitmap.

BITMAP是一个结构体,封装着bitmap的一些信息。定义了逻辑位图的高,宽,颜色格式和位值。

MSDN中如是:This structure defines the type, width, height, color format, and bit values of a bitmap.

 

三者之间的关系转换:

HBITMAP hBitmap;

CBitmap bitmap;

BITMAP bm;

//下面是三者之间的联系:

bitmap.Attach(hBitmap);//HBITMAP 得到关联的CBitmap

bitmap.GetBitmap(&bm); // CBitmap 得到关联的BITMAP 
hBitmap=(HBITMAP)bitmap.GetSafeHandle();//CBitmap得到相关的HBITMAP

 

BITMAP结构具有如下形式:
typedef struct tagBITMAP

     int      bmType;
     int      bmWidth;//

     int      bmHeight;//

     int      bmWidthBytes;
     BYTE     bmPlanes;
     BYTE     bmBitsPixel;
     LPVOID bmBits;
 BITMAP;

 

延伸理解下Attach/Detach

  attach是把一个C++对象与一个WINDOWS对象关联,直到用detach则把关联去掉。  
  
如果attach了以后没有detach,则C++对象销毁的时候WINDOWS对象跟着一起完蛋。  
  attach
了以后,C++对象的指针和WINDOWS对象的HWND会有一个映射关系,其作用相当于你直接用一个C++对象去Create一个WINDOWS对象,例如   CEdit  edit;   edit.create(...)  
  
并且此映射是永久的,知道此对象完蛋为止。  
  
如果用类似GetDlgItem函数也可以返回一个指针,并可以强制转换。GetDlgItem会到映射表里找。  
  
2种映射表,一中是永久的,一种是临时的。  
  
直接用C++对象创建的WINDOWS对象或者是通过attach的对象的映射关系都被放到永久表中,否则就在临时表中创建映射。  
  
所以GetDlgItem不推荐你保存返回的指针,因为你很难保证你的WINDOWS对象跟C++对象的关联是否放在永久表中。  
  
如果映射是放在临时表中,那么在空闲时间会被自动删除。  
  
attcah完全是为了方便用MFC类的成员函数去操纵WINDOWS对象。 


http://blog.sina.com.cn/s/blog_af68a2c201019iuc.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在MFC显示读取的参数图像可以通过以下步骤实现: 1. 首先,你需要在MFC应用程序的资源文件夹添加一个静态图片控件。你可以在资源视图选择对应的对话框,然后右键点击添加控件,在控件列表选择“Picture Control”并添加到对话框。 2. 接下来,在你的对话框类,找到OnInitDialog函数并添加以下代码: ``` CStatic* pImageControl = (CStatic*)GetDlgItem(IDC_STATIC_IMAGE); // 将IDC_STATIC_IMAGE替换为你在资源文件添加的图片控件的ID CImage image; image.Load(_T("path_to_your_image")); // 替换为你的图像路径 pImageControl->SetBitmap(image.Detach()); // 将图像显示到控件 ``` 3. 最后,你需要在你要显示图像的地方调用UpdateData()函数来更新对话框的控件。你可以在你的程序的任何地方调用它,例如在按钮点击事件或者在图像读取成功后。 ``` UpdateData(FALSE); // 显示最新的图像 ``` 这样,在MFC应用程序,你就可以显示读取的参数图像了。请确保替换代码的路径和控件ID为你自己的实际值,并且图像文件格式与Load函数支持的一致。 ### 回答2: 首先,在MFC应用程序,我们可以使用CImage类来加载和显示图像。下面是一个简单的步骤,用于在VC显示读取的参数图像: 1. 首先,确保已将图像文件添加到项目,并将其包含在您的源代码文件,以便可以访问图像的路径。 2. 在您的对话框类,声明一个CImage成员变量,例如: CImage m_Image; 3. 在OnInitDialog()方法,加载图像文件到CImage对象,例如: m_Image.Load(_T("图像文件路径")); 4. 然后,获取图像的宽度和高度,并将其用作绘图区域的大小,例如: int nWidth = m_Image.GetWidth(); int nHeight = m_Image.GetHeight(); CRect rect; GetDlgItem(IDC_STATIC_PICTURE)->GetClientRect(rect); // 假设您在对话框上有一个静态文本控件ID为IDC_STATIC_PICTURE rect.right = rect.left + nWidth; rect.bottom = rect.top + nHeight; 5. 创建一个DC并选择绘图区域,然后在绘图区域上绘制图像,例如: CDC* pDC = GetDlgItem(IDC_STATIC_PICTURE)->GetDC(); m_Image.Draw(pDC->m_hDC, rect); 6. 最后,释放DC并刷新静态文本控件,使图像显示在对话框上,例如: GetDlgItem(IDC_STATIC_PICTURE)->ReleaseDC(pDC); GetDlgItem(IDC_STATIC_PICTURE)->Invalidate(); 这样,您就可以在VCMFC应用程序显示读取的参数图像了。请注意替换实际的图像文件路径和静态文本控件ID以适应您的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值