您的位置:首页 > 其它

MFC 如何实现对话框添加位图作为背景图

2018-02-01 21:17 513 查看
     实现对话框里添加位图作为背景图:

    效果图看 相册里 那张彩票软件截图 

    首先 resources文件夹里增加BMP格式位图资源,

    然后在OnPaint()里的else之后括号里添加如下代码:

    // CDialog::OnPaint();  设置对话框位图时要禁止调用此对话框  * 

 //  以下设置对话框的背景位图  
CPaintDC   dc(this);    

       CRect rect;    

         GetClientRect(&rect);    

      CDC   dcMem;    

      dcMem.CreateCompatibleDC(&dc);    

      CBitmap   bmpBackground;    

      bmpBackground.LoadBitmap(IDB_BITMAP1);  //对话框的背景图片  

                        

      BITMAP   bitmap;    

      bmpBackground.GetBitmap(&bitmap);    

      CBitmap   *pbmpOld=dcMem.SelectObject(&bmpBackground);    

      dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);  



效果如下



其他的参考方法:

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

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 LoadImage(HINSTANCE
hinst,LPCTSTR
lpszName,UINT
uType,int
cxDesired,int
CyDesired,UINT
fuLoad);

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

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

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

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

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

 

延伸理解 HBITMAP/CBitmap/BITMAP:

HBITMAP是bitmap的指针,

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

CBitmap是mfc中封装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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc