现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

BitBlt函数和StretchBlt函数的使用

2013-03-12 21:14 工业·编程 ⁄ 共 1702字 ⁄ 字号 暂无评论

自己写了一个DrawImg函数

/*****************************************************************
** 函数名: DrawImg
** 输入:   ***
** 输出: 无
** 功能描述:   将结构体中的bmp图像贴到**对话框的picture control控件中
** 全局变量:无
** 调用模块:********
** 作  者: ***
** 日  期: 01/12/2012
** 修  改: ***
** 日  期: ***
** 版本:***
****************************************************************/

贴出其中的贴图步骤:

//和控件相关的DC
CWnd* pWnd = this->GetDlgItem(IDC_STATIC);// 其中IDC_STATIC是控件的ID
CDC* pDCWnd = pWnd->GetDC();

//和内存相关的DC(显示图像的DC)
CDC dcDraw;
dcDraw.CreateCompatibleDC(pDCWnd);

CBitmap* pMyBitmap = CBitmap().FromHandle(Para->m_hBitmap);//Para为传入的结构体
CBitmap* pOldBKBitmap = dcDraw.SelectObject(pMyBitmap);

//取得picture control控件的矩形区域
CRect rc;
pWnd->GetClientRect(&rc);

//取得Para图像的矩形区域
int clientwidth,clientheight;
clientwidth = Para->m_ClientRect.Width();
clientheight = Para->m_ClientRect.Height();

pDCWnd->BitBlt(0, 0, rc.Width(), rc.Height(), &dcDraw,100, 100, SRCCOPY);

//pDCWnd->StretchBlt(0,0,rc.Width(),rc.Height(),&dcDraw,0,0,clientwidth,clientheight,SRCCOPY);

dcDraw.SelectObject(pOldBKBitmap);
dcDraw.DeleteDC();

代码大致如上所示,但是本文主旨诣在讲述对BitBlt和StretchBlt函数的理解

BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);

其中的参数大家可以在百度上找到说明,我主要说下我的理解:

(1)其中涉及两个部分,分别是目标区域和源区域,仔细观察发现对于宽高的描述上只有一组定义

nWidth:指定源和目标矩形区域的逻辑宽度。

nHeight:指定源和目标矩形区域的逻辑高度。

(2)针对上面一条区别开始说此函数的功能,这个函数将源区域中的位图贴到目的区域,从两个区域指定的坐标开始,截图的大小取决于(1)中的nWidth和nHeight,这           个函数在贴的时候对图像没有任何的拉伸或者压缩

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

同样,参数可以在百度上找到,一下还是个人的理解:

(1)相比较BitBlt函数可以发现,此函数的参数多了两个,目标区域和源区域都可以自定义自己想要贴图和截图的位置

(2)StretchBlt函数还有一个不同于BitBlt函数的部分就是此函数对图像进行拉伸或压缩之后可以将图像自适应显示在目标区域中(前提是源区域的大小是整个位图的大小)

以上是本人的一些理解,共勉!!!

给我留言

留言无头像?