您的位置:首页 > 其它

一种比较简单的绘制半透明多边形的方法

2011-01-05 16:28 621 查看

绘制半透明多边形

首先我们知道用AlphaBlend()函数可以实现绘制透明矩形而要绘制透明多边形则会更复杂一点.
首先工程中要使用该函数必须包含msimg32.lib文件
#pragma comment(lib, “msimg32.lib”)
然后在OnDraw或者OnPaint消息函数添加代码
思路:由于用AlphaBlend函数必须从一个源DC中复制其中的内容到目标DC中,所以要创建一个内存DC在其中绘制我们所需要的多边形,但这边就会存在一个问题,便是创建的源DC默认会以黑色填充背景,如果直接将整个DC贴过去,那原先的背景将会被覆盖,就达不到我们需要的效果,因此我们在贴图前设置一下用SetClipRgn设置一下要更新的区域,然后再进行贴图操作就能达到效果。详细代码如下:
CRect
rc;
CDC
*pDC = GetDC();
CDC memdc;
CBitmap
bmp, *pOldBitmap;

memdc.CreateCompatibleDC(pDC);

GetClientRect(&rc);
bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());

pOldBitmap
= memdc.SelectObject(&bmp);

rgn.CreatePolygonRgn(pt,
6, ALTERNATE);
CBrush
brush(RGB(0, 0, 255));
memdc.FillRgn(&rgn,
&brush);

// 关键在这,设置裁剪区域,也就是只有这个区域需要更新
pDC->SelectClipRgn(&rgn);

BLENDFUNCTION bf;
bf.BlendOp =
AC_SRC_OVER;
bf.BlendFlags = 0;

bf.SourceConstantAlpha =
0x70; //设置透明值
bf.AlphaFormat = 0;
pDC->TextOut(10,
10, "透明测试");
AlphaBlend(pDC->m_hDC,
0,0,rc.Width(),rc.Height(),memdc.m_hDC,0,0,rc.Width(),rc.Height(),bf);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: