首页编程transparentblt 请教函数TransparentBlt的用法

transparentblt 请教函数TransparentBlt的用法

编程之家2023-11-0299次浏览

大家好,transparentblt相信很多的网友都不是很明白,包括请教函数TransparentBlt的用法也是一样,不过没有关系,接下来就来为大家分享关于transparentblt和请教函数TransparentBlt的用法的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

transparentblt 请教函数TransparentBlt的用法

请教函数TransparentBlt的用法

函数功能:该函数对指定的源设备环境中的矩形区域像素的颜色数据进行位块(bit_block)转换,并将结果置于目标设备环境。

函数原型:BOOL TransparentBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);

参数:

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

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

transparentblt 请教函数TransparentBlt的用法

nHeightDest:指定目标矩形的高度。

nXOriginSrc:指定源矩形(左上角)的X轴坐标,坐标以逻辑单位表示。

nYOriginsrc:指定源矩形(左上角)的Y轴坐标,坐标以逻辑单位表示。

nWidthSrc:指定源矩形的宽度。

transparentblt 请教函数TransparentBlt的用法

nHeightSrc:指定源矩形的高度。

crTransparent:源位图中的RGB值当作透明颜色。(用RGB(0,0,0)也就是黑色不行)返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FALSE。

Windows NT:若想获取更多错误信息,请调用GetLastError函数。

备注:函数TransparentBlt支持4位/像素和8位/像素格式的源位图,使用AlphaBlend可以指定带有透明度的32位/像素格式的位图。如果源和目标矩形的大小不一致,那么将对源位图进行拉伸以与目标矩形匹配,当使用SetStretchBltMode函数时,BLACKONWHITE和WHITEONBLACK两种iStretchMode模式将被转换成TransparentBlt函数的COLORONCOLOR模式。目标设备环境指定了用于目标坐标的变换类型,而源设备环境指定了源坐标使用的变换类型。如果源位图或目标位图的宽度或高度是负数,那么TransparentBlt函数也不对位图进行镜像。

速查:Windows NT:5.0及以上版本;Windows:98及以上版本;Windows CE:Windows CE.NET 4.0 and later;头文件:wingdi.h:库文件:作为一个资源包含在msimg32.dll中。

对于TransparentBlt()函数的疑惑

SetBkColor()和SetTextColor()在这里是设置前景色和背景色的函数(昨天我说错了,这两个函数不光是在字符输出时才有作用的)

下面是我对这段代码的分析:

//C、生成掩码位图。

SetBkColor(hDC, Tcol);//设置透明色

BitBlt(mDC,0,0,nW0,nH0,hDC,0,0,SRCCOPY);//生成白色透明区,其它区域为黑色的掩码位图

//执行完这一步后,位图变成有效部分是黑色,透明部分是白色

//mDC里创建的是单色掩码位图,所以只有黑白两种颜色,由于用SetBkColor(hDC, Tcol);将透明色设置为背景,背景色SRCCOPY到目标掩码位图后即为白色,有效部分为黑色

SetBkColor(hDC, RGB(0,0,0));//生成黑色透明区,其它区域保持不变的位图

SetTextColor(hDC, RGB(255,255,255));//白色

BitBlt(hDC,0,0,nW0,nH0,mDC,0,0,SRCAND);

//执行完这一步后,位图变成有效部分是原来的颜色,透明部分是黑色

//mDC与hDC进行SRCAND(与操作),当hDC的背景色设置为黑色前景色为白色时,mDC(掩码位图)与hDC(原图)进行与操作时,mDC(掩码位图)中背景色(黑色)区域在hDC(原图)中保留下来,而前景色(白色)部分变成了黑色。

////D、透明显示

SetBkColor(hdc0,RGB(255,255,255));//透明部分保持屏幕不变,其它部分变成黑色

SetTextColor(hdc0,RGB(0,0,0));//黑色

BitBlt(hdc0,nX0,nY0,nW0,nH0,mDC,0,0,SRCAND);//"与"运算,在hdc0生成掩模

//设置hdc0(目标位图)背景色为白色,前景色为黑色,将mDC(掩码位图)与hdc0(目标位图)进行与操作时,hdc0(目标位图)中源位图需要透明的部分被保留住了,而源位图不透明的部分被与成了黑色

BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT);//"或"运算,生成最终透明效果

//至此,两位图进行或运行,合成的图就出来了

关于GDI的Bitblt

/***************************************************

步骤三:将内存DC图拷贝到屏幕DC上进行显示。

1.BitBlt会将内存里的图片块拷贝到一个指定大小位置的屏幕(也可以说是窗口)矩形区域。

2.BitBlt前4个参数nXDest,nYDest,nWidth,nHeight.确定屏幕矩形区域的大小。

3.BitBlt后面2个坐标参数x,y确定从内存图片块的哪个位置开始拷贝到屏幕DC上

**************************************************/

BitBlt(hScrDC,0,0,ClientWidth,ClientHeight,hMemDC,0,0,SRCCOPY);

/****************************************************************************

CDrawBitmap封装了一些画图片的函数。

调用如下:

CDrawBitmap g_bmp1("D:\\My Documents\\My Pictures\\风景图片\\4244123431.bmp");

g_bmp1.Draw(m_hWnd);

CDrawBitmap g_bmp2("D:\\My Documents\\My Pictures\\风景图片\\plane.bmp");

g_bmp2.DrawTransparent(m_hWnd);

CDrawBitmap g_bmp3("D:\\My Documents\\My Pictures\\风景图片\\jzg2.bmp");

g_bmp3.DrawTransparent(m_hWnd);

****************************************************************************/

//使用TransparentBlt需要添加#pragma comment(lib,"msimg32.lib")

#pragma comment(lib,"msimg32.lib")

class CDrawBitmap

{

private:

HBITMAP m_bitmap;

int m_bitmap_cx;

int m_bitmap_cy;

public:

CDrawBitmap(){}

CDrawBitmap(TCHAR* PicturePath){ LoadPicture(PicturePath);}

CDrawBitmap(WORD ResourceID){ LoadResource(ResourceID);}

~CDrawBitmap(){::DeleteObject(m_bitmap);}

bool LoadPicture(TCHAR* PicturePath)

{

m_bitmap=(HBITMAP)LoadImage(NULL,//应用程序实例

PicturePath,//路径

IMAGE_BITMAP,

0,//如果不置0,则此参数指定m_bitmap的宽(位图被拉伸)

0,//如果不置0,则此参数指定m_bitmap的高(位图被拉伸)

LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_DEFAULTSIZE);

if(!m_bitmap)

return false;

BITMAP bmp;

GetObject(m_bitmap,sizeof(BITMAP),(LPSTR)&bmp);

m_bitmap_cx=bmp.bmWidth;

m_bitmap_cy=bmp.bmHeight;

return true;

}

bool LoadResource(WORD ResourceID)

{

m_bitmap=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(ResourceID));

if(!m_bitmap)

return false;

BITMAP bmp;

GetObject(m_bitmap,sizeof(BITMAP),(LPSTR)&bmp);

m_bitmap_cx=bmp.bmWidth;

m_bitmap_cy=bmp.bmHeight;

return true;

}

void Draw(HWND hWnd=NULL,int x=0,int y=0,int width=100,int height=100)

{

HDC hScrDC=GetDC(hWnd);//创建屏幕DC

Draw(hScrDC,x,y,width,height);

::ReleaseDC(hWnd,hScrDC);//释放屏幕DC

}

void Draw(HDC hScrDC,int x=0,int y=0,int width=100,int height=100)

{

HDC hMemDC=CreateCompatibleDC(hScrDC);//创建内存DC

::SelectObject(hMemDC,m_bitmap);//把位图选进内存DC

BitBlt(hScrDC,x,y,width,height,hMemDC,0,0,SRCCOPY);//内存DC映射到屏幕DC

::DeleteDC(hMemDC);//删除内存DC

}

void DrawTransparent(HWND hWnd=NULL,int x=0,int y=0)

{

HDC hScrDC=GetDC(hWnd);//创建屏幕DC

DrawTransparent(hScrDC,x,y);

::ReleaseDC(hWnd,hScrDC);//释放屏幕DC

}

//不进行拉伸处理,如需要,请自行修改代码TransparentBlt中的参数

//使用TransparentBlt需要添加#pragma comment(lib,"msimg32.lib")

void DrawTransparent(HDC hScrDC,int x=0,int y=0,UINT crTransparent=RGB(255,255,255))

{

HDC hMemDC=CreateCompatibleDC(hScrDC);//创建内存DC

::SelectObject(hMemDC,m_bitmap);//把位图选进内存DC

::TransparentBlt(hScrDC,x,y,m_bitmap_cx,m_bitmap_cy,hMemDC,0,0,m_bitmap_cx,m_bitmap_cy,crTransparent);

::DeleteDC(hMemDC);//删除内存DC

}

void DrawStretch(HWND hWnd=NULL,int x=0,int y=0,int width=100,int height=100)

{

HDC hScrDC=GetDC(hWnd);//创建屏幕DC

DrawStretch(hScrDC,x,y,width,height);

::ReleaseDC(hWnd,hScrDC);//释放屏幕DC

}

void DrawStretch(HDC hScrDC=NULL,int x=0,int y=0,int width=100,int height=100)

{

HDC hMemDC=CreateCompatibleDC(hScrDC);//创建内存DC

::SelectObject(hMemDC,m_bitmap);//把位图选进内存DC

SetStretchBltMode(hScrDC,COLORONCOLOR);//一定要先调用这个

StretchBlt(hScrDC,x,y,width,height,hMemDC,0,0,m_bitmap_cx,m_bitmap_cy,SRCCOPY);//内存DC映射到屏幕DC

::DeleteDC(hMemDC);//删除内存DC

}

};

void DrawBitmap(HBITMAP m_bitmap,HDC hScrDC,int x=0,int y=0,int width=100,int height=100)

{

HDC hMemDC=CreateCompatibleDC(hScrDC);//创建内存DC

::SelectObject(hMemDC,m_bitmap);//把位图选进内存DC

BitBlt(hScrDC,x,y,width,height,hMemDC,0,0,SRCCOPY);//内存DC映射到屏幕DC

::DeleteDC(hMemDC);//删除内存DC

}

void DrawBitmap(HBITMAP m_bitmap,HWND hWnd=NULL,int x=0,int y=0,int width=100,int height=100)

{

HDC hScrDC=GetDC(hWnd);//创建屏幕DC

DrawBitmap(m_bitmap,hScrDC,x,y,width,height);

::ReleaseDC(hWnd,hScrDC);//释放屏幕DC

}

c++ 使用TransparentBlt后为什么图片被放大了要怎么修改

TransparentBlt(cacheHdc, 0, 0, m_bgBitmap.bmWidth,m_bgBitmap.bmHeight,

hookHdc, 0, 0, m_hookCRt.Width(),m_hookCRt.Height(), RGB(255,255,255));

TransparentBlt函数参数的作用:

第1个参数,是资源的位图句柄;

第2、3个参数,资源图片的起始坐标的x,y值;

第4、5个参数,资源图片的宽、高值;

第6个参数,你要画到哪里的目的位图句柄;

第7、8个参数,画到目的位图句柄的起始坐标x,y值;

第9、10个参数,画到目的位图句柄的宽、高值;

第11个参数,应该是要过滤掉的颜色(太久没用这函数,不太确定)。

所以如果你画的图被放大了,那就是第4、5与第9、10参数的值不相等所导致的。4与9要相等,5与10要相等。

如果你还想了解更多这方面的信息,记得收藏关注本站。

ant命令 ant是用来干什么的百度在线客服(百度客服24小时人工服务在线咨询)