|
|
发表于 2006-11-3 12:52:00
|
显示全部楼层
Re:跪求请问有没有写2D透明贴图的函数?
透明显示位图
这是一个有关位图的类中的一个函数,它能显示带有透明区域的位图。请注意其中的三
个显示函数的用法。(有些复杂的,不是用一个光珊掩码就能解决的:-)
/*************************************************************************
*
* DrawTransparentInRect()
*
* 参数说明:
*
* CDC& dc - 显示位图的设备描述表
* COLORREF crColour - 图像中要被滤掉的颜色(缺省值为白色)
* CRect* crDest - 目标矩形坐标数据(缺省值是NULL)
* CRect* crSou - 源图像待显示部分的矩形坐标(缺省值是NULL)
* int mode - 如果是0则将不显示指定的颜色,如果是1则保留指定
* 的颜色(缺省值为0)
*
* 返回值:
*
* BOOL - 如果成功返回TRUE,否则返回FALSE
*
* 描述:
*
* 将类中的图像透明的绘入目标设备描述表指定区域,如有必要可以产生拉伸或压缩
* 动作
*
* 如果类中没有图像,它什么也不作,直接返回
* 如果待绘制的图像不在当前剪贴区域内,则直接返回
* 如果入口参数crDest和crSou都是NULL,则函数将在设备描述表的0,0位置不变形的
* 绘制类中位图的整个内容
* 如果入口参数crDest和crSou的宽度或高度值不同,则绘制出来的图像会变形(被
* 拉伸或被压缩)
*
************************************************************************/
BOOL CBmpProc: rawTransparentInRect(CDC& dc,
COLORREF crColour,
CRect* crDest,
CRect* crSou,
int mode)
{
// 如果类中没有图像,直接返回
if (!IsValid())
return TRUE;
ASSERT(m_hObject);
// 缺省矩形等于图像尺寸
CRect DCRect(Rect()); // 目标位置
CRect SORect(Rect()); // 源位置
if (crDest)
DCRect = *crDest;
if (crSou)
SORect = *crSou;
// 如果待绘制的图像不在当前剪贴区域内,则直接返回
if (!dc.RectVisible(&DCRect))
return TRUE;
COLORREF crOldBack;
COLORREF crOldText;
if (mode==0)
{ // 去除指定的颜色
crOldBack = dc.SetBkColor(RGB(255,255,255));
crOldText = dc.SetTextColor(RGB(0,0,0));
}
else
{ // 保留指定的颜色
crOldBack = dc.SetBkColor(RGB(0,0,0));
crOldText = dc.SetTextColor(RGB(255,255,255));
}
CDC dcImage, dcTrans;
// 创建内存设备描述表
dcImage.CreateCompatibleDC(&dc);
dcTrans.CreateCompatibleDC(&dc);
// 选择原始图像到DC中
CBitmap* pOldBitmapImage = dcImage.SelectObject(this);
// 创建掩码位图
CBitmap bitmapTrans;
int nWidth = SORect.Width();
int nHeight = SORect.Height();
bitmapTrans.CreateBitmap(nWidth, nHeight, 1, 1, NULL);
// 选择掩码位图到DC中
CBitmap* pOldBitmapTrans = dcTrans.SelectObject(&bitmapTrans);
// 创建掩码图像(基于指定的颜色)
dcImage.SetBkColor(crColour);
dcTrans.BitBlt(0, 0, nWidth, nHeight, &dcImage, SORect.left, SORect.top,
SRCCOPY);
// 显示透明位图
/* 设置目标DC的拉伸模式为STRETCH_DELETESCANS,也就是不显示拉伸掉的图像 */
int srlold = dc.SetStretchBltMode(STRETCH_DELETESCANS);
// 显示位图
dc.StretchBlt(DCRect.left,DCRect.top,DCRect.Width(),DCRect.Height(),
&dcImage,SORect.left,SORect.top,SORect.Width(),SORect.Height(),SRCINVERT);
dc.StretchBlt(DCRect.left,DCRect.top,DCRect.Width(),DCRect.Height(),
&dcTrans,SORect.left,SORect.top,SORect.Width(),SORect.Height(),SRCAND);
dc.StretchBlt(DCRect.left,DCRect.top,DCRect.Width(),DCRect.Height(),
&dcImage,SORect.left,SORect.top,SORect.Width(),SORect.Height(),SRCINVERT);
// 恢复设备描述表原来的设置
dc.SetStretchBltMode(srlold);
// 恢复设置
dcImage.SelectObject(pOldBitmapImage);
dcTrans.SelectObject(pOldBitmapTrans);
dc.SetBkColor(crOldBack);
dc.SetTextColor(crOldText);
return TRUE;
}
|
|