绘制半透明多边形
首先我们知道用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);