首页
论坛
专栏
课程

[分享]刚完成一个透明圆角矩形代码的编写,与大家分享一下

2009-12-7 08:09 8665

[分享]刚完成一个透明圆角矩形代码的编写,与大家分享一下

2009-12-7 08:09
8665
先看下网上的实现半透明矩形的代码

一个可绘制半透明矩形的代码 -nohacks 收集整理

                                 
CDC   memdc;   
  CBitmap   bmp,*pOldBitmap;   
  memdc.CreateCompatibleDC(pDC);   
  bmp.CreateCompatibleBitmap(pDC,300,200);   
  pOldBitmap   =   memdc.SelectObject(&bmp);   
  memdc.FillSolidRect(0,0,300,200,RGB(0,0,255));   //蓝色   
  BLENDFUNCTION   bf;   
  bf.BlendOp   =   AC_SRC_OVER;   
  bf.BlendFlags   =   0;   
  bf.SourceConstantAlpha   =   0x7f;   //半透明   
  bf.AlphaFormat   =   0;   
  AlphaBlend(pDC->GetSafeHdc() ,0,0,300,200,memdc.GetSafeHdc(),0,0,300,200,bf);   
   memdc.SelectObject(pOldBitmap);   
  
  

typedef struct _BLENDFUNCTION {
  BYTE  BlendOp;                              源混合操作,只支持AC_SRC_OVER
  BYTE  BlendFlags;                            保留,必须为0
  BYTE  SourceConstantAlpha;                    透明度 0-255
  BYTE  AlphaFormat;                            透明这里应为0,
}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;

AlphaBlend  函数功能:该函数用来显示具有指定透明度的图像。
  函数原型:AlphaBlend(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int hHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,BLENDFUNCTION blendFunction);
  参数:
  hdcDest:指向目标设备环境的句柄。
  nXoriginDest:指定目标矩形区域左上角的X轴坐标,按逻辑单位。
  nYOriginDest:指定目标矩形区域左上角的Y轴坐标,按逻辑单位。
  nWidthDest:指定目标矩形区域的宽度,按逻辑单位。
  hHeghtdest:指向目标矩形区域高度的句柄,按逻辑单位。
  hdcSrc:指向源设备环境的句柄。
  nXOriginSrc:指定源矩形区域左上角的X轴坐标,按逻辑单位。
  nYOriginSrc:指定源矩形区域左上角的Y轴坐标,按逻辑单位。
  nWidthSrc:指定源矩形区域的宽度,按逻辑单位。
  nHeightSrc:指定源矩形区域的高度,按逻辑单位。
  blendFunction:指定用于源位图和目标位图使用的alpha混合功能,用于整个源位图的全局alpha值和格式信息。源和目标混合功能当前只限为AC_SRC_OVER。

AlphaBlend的详细说明:http://baike.baidu.com/view/1080365.htm?fr=ala0

    我们要实现在桌面上画透明圆角矩形,用上面的代码肯定不行,CreateCompatibleBitmap不能创建圆角矩形的BMP图片,当然我们可以用RoundRect 画圆角矩形,但怎么进行透明叠加了,我们可以采用下面的方法:

创建2个与屏幕兼容的DC和BMP

在源BMP上用RoundRect画圆角矩形,用AlphaBlend进行透明叠加,结果保存在目标BMP

如下面的代码:

HDC = GetDC (0)  ' 取屏幕DC
CDC = CreateCompatibleDC (HDC)  ' 目标设备环境的句柄
dc = CreateCompatibleDC (HDC)  ' 源设备环境的句柄

BMP = CreateCompatibleBitmap (HDC, 1024, 768)  ' 目标BMP
fBitmap = CreateCompatibleBitmap (HDC, 1024, 768)  ' 源BMP

ReleaseDC (0, HDC)

SelectObject (CDC, BMP)  ' 关联到目标DC
oldBitmap = SelectObject (dc, fBitmap)  ' 关联到源DC

' 开始在源BMP上画圆角矩形
hPen = CreatePen (PS_INSIDEFRAME|PS_SOLID), 500, RGB (255, 255, 10))
SelectObject (dc, hPen)
RoundRect (dc, 1024, 1024- 275, 124, 20, 20)

  ' 画随机壁纸,要在透明处理前

  .......

' 进行透明叠加,结果在目标DC

  bf.BlendOp   =   AC_SRC_OVER
  bf.BlendFlags   =   0
  bf.SourceConstantAlpha   =  50
  bf.AlphaFormat   =   0
AlphaBlend (CDC, 0, 0, 1024, 768, dc, 0, 0, 1024, 768, bf)

这样BMP 里就是含有透明矩形的BMP图片了,在进行桌面美化时这段代码非常有用,效果见下图


[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:
最新回复 (8)
非安全 17 2009-12-7 08:13
2
0
我发的代码有点不伦不类了,是易代码改的,在易语言中是没有操作符 | 的 ,可以用位或()代替。

这样是为了大家看的方便
kagayaki 2010-1-17 23:31
3
0
我帮顶一下,这方面只有像我这样的网管才有用。

可惜我不会易语言, 对图形处理方面也不在行, 转不成 DELPHI 的(所有代码都转换了, 但不会如何真正输出到位图里)
leivn 2010-1-18 21:39
4
0
也可以先做一个圆角的矩形图片,然后CombineRgn设置窗体区域,在Setwindowlayerattribute 设置透明度
非安全 17 2010-1-19 02:26
5
0
写到文件 (“c:\liangfei.bmp”, GetBitsFromBitmapHandle (BMP))

.子程序 GetBitsFromBitmapHandle, 字节集, , 根据位图句柄取回位图数据。
.参数 hBitmap, 整数型
.局部变量 Bitmap, BITMAP
.局部变量 Resource, 字节集
.局部变量 BitmapFileHeader, BITMAPFILEHEADER
.局部变量 bfh, 字节集
.局部变量 hMemDC, 整数型
.局部变量 BitmapInfo, BITMAPINFO
.局部变量 bi, 字节集

GetObjectA (hBitmap, 5 × 4 + 2 + 2, Bitmap)

hMemDC = CreateCompatibleDC (0)

BitmapInfo.BITMAPINFOHEADER.biSize = 4 × 11
GetDIBits_BimapInfo (hMemDC, hBitmap, 0, 0, 0, BitmapInfo, 0)

Resource = 取空白字节集 (BitmapInfo.BITMAPINFOHEADER.biSizeImage)
BitmapInfo.BITMAPINFOHEADER.biCompression = 0
GetDIBits (hMemDC, hBitmap, 0, Bitmap.bmHeight, Resource, BitmapInfo, 0)

' 构造位图信息
bi = 取空白字节集 (BitmapInfo.BITMAPINFOHEADER.biSize)

CopyMemory_BITMAPINFO (bi, BitmapInfo, BitmapInfo.BITMAPINFOHEADER.biSize)

' 构造位图文件头
BitmapFileHeader.bfType = 19778
BitmapFileHeader.bfOffBits = 2 × 4 + 3 × 2 + BitmapInfo.BITMAPINFOHEADER.biSize
BitmapFileHeader.bfSize = BitmapFileHeader.bfOffBits + BitmapInfo.BITMAPINFOHEADER.biSizeImage
BitmapFileHeader.bfReserved1 = 0
BitmapFileHeader.bfReserved2 = 0
bfh = 取空白字节集 (14)
CopyMemory_BITMAPFILEHEADER (bfh, BitmapFileHeader, 14)
DeleteDC (hMemDC)
返回 (bfh + bi + Resource)
非安全 17 2010-1-19 02:30
6
0
额,这个可能更简单,改天研究下

这个是我的成品:小贼壁纸美化 V1.0 免费版
appben 2010-4-17 02:13
8
0
呵呵,老贼和小贼啊,不是一般的人来的!
hopy 8 2010-4-17 20:33
9
0
good!!!!!!
过分耀眼 2010-4-17 21:03
10
0
看不懂 ·哈哈·还太菜一点。·
游客
登录 | 注册 方可回帖
返回