窗体的Alpha通道透明色协助(风姿罗曼蒂克旦 Form 被定义为使用 LayeredWindow ,窗口的绘图不再响应沿用多年的 WM_Paint 音信)

圆满兑现无毛边异形窗体完毕效果与利益图1:完成效果与利益图2:达成效果与利益图3:异形窗体的兑现思路、采纳UpdateLayeredWindow这一个api函数基于Png图阿尔法通道绘制异形窗口优点:真正含义上的异形窗口劣势:用了WS_EX_LAYERED后当前窗体不管理paint事件,所以窗体上不能够绘制控件,但以此控件确存在,而且能够响应事件消弭不能绘制控件方法:1、思路:行使双层窗口:底层背景窗口层与顶层控件层,用控件层Show(卡塔尔(قطر‎背景层,同时管理窗体的窗口移动事件,让其余贰个窗体同步移动依然做别的业务。2、实现:底层背景层:采纳UpdateLayeredWindow这一个api函数基于带Alpha通道的Png图绘制顶层控件层:方法后生可畏:选择无边框窗口,把窗口背景颜色BackColor设置叁个临时用颜色比如:ff00ff颜色,且把窗口TransparencyKey颜色属性设跟背景象BackColor相符(意义:去除带背景象的区域进而展现前面背景层State of Qatar方法二:接收无边框窗口,把窗口背景设为背景层对应地点的位图,给人后生可畏种透明的法力,然而编辑会有所约束。(SkinWhetherTank属性能够切换那三种透明形式State of Qatar优点:能够消除展现控件的标题,不影响控件的采取劣点:方法一会让有个别控件有毛边,方法二会让窗体编辑受约束。(劣势有待解决,望高手辅导卡塔尔国属性:GradientTime:控件层渐变特效时间长度(越小越快卡塔尔。MainPosition:窗口在绘图层地点。SkinBack:设置或拿到绘图层窗口背景。SkinMobile:窗体是还是不是足以移动。SkinOpacity:设置或获得绘图层窗口发光度(0-255卡塔尔。SkinShowInTaskbar:绘图层是或不是出今后Windows职分栏中。SkinSize:设置或获得绘图层窗口大小。SkinTrankColor:绘图层需求透明的颜料。SkinWhetherTank:绘图层是不是展开位图仿透明注意(SkinOpacity255时,此属性为False可达到背景透明,控件不透明的功效。卡塔尔(قطر‎。源码分享:源码上传中

本条比较简单,可是其实依然用的方面包车型客车函数,察看Forms.pas单元就驾驭了。当然也足以选取图片来做效果:即设计一张刚好的图样,然后接受方面的措施就可以作出多个不法则的图形窗体出来,特别轻松!!

  有了上述的做事,剩下的为主专门的工作便是遵照背景位图和掩模位图来规定最后展现的位图区域,也即是说,"扣除"的区域将以透明效果显示。上面包车型客车代码达成了那后生可畏功用:

美高梅在线登录网址 1

不管设置什么样常量,首先与 SetLayeredWindowAttributes 函数同样,
内需对窗口设置一个新的增加风格标记:WS_EX_LAYERED 。
安装窗口的扩张标记,只对 Windows贰零零壹以上操作系统有效,设置方式与设置普
通窗口作风的措施相仿:
SetWindowLong(Handle, GWL_EXSTYLE,
GetWindowLong(Handle,GWL_EXSTYLE) or WS_EX_LAYERED // 增添那几个标识
);

  3、 向应用程序的门类中加多背景位图和掩模位图,其ID分别设置为IDB_SHOW、IDB_MASK;

procedure TForm1.FormCreate(Sender: TObject);
var
BMP: TBitmap;
GB: TGPBitmap;
www.4688.com,h: HBITMAP;
begin
Bmp := TBitmap.Create;
Bmp.LoadFromFile('F:\password.bmp');
// GB := TGPBitmap.Create('F:\水晶图标\1.png');
// GB.GetHBITMAP(0, h);
// Bmp.Handle := h;
// AlphaUpdateLayeredWindow(Handle, Bmp, 200);
ColorUpdateLayeredWindow(Handle, Bmp, Bmp.TransparentColor);
Bmp.Free;
美高梅在线登录网址,// GB.Free;
end;

  三、程序代码

procedure AlphaUpdateLayeredWindow(Wnd: HWND; Bmp: TBitmap; Alpha: Byte);
var
P: TPoint;
R: TRect;
S: TSize;
BF: _BLENDFUNCTION;
begin
GetWindowRect(Wnd, R);
P := Point(0, 0);
S.cx := Bmp.Width;
S.cY := Bmp.Height;
美高梅4858官方网站,bf.BlendOp := AC_SRC_OVER;
bf.BlendFlags := 0;
bf.SourceConstantAlpha := Alpha;
bf.AlphaFormat := AC_SRC_ALPHA;
SetWindowLong(wnd, GWL_EXSTYLE, GetWindowLong(wnd, GWL_EXSTYLE) or WS_EX_LAYERED);
UpdateLayeredWindow(wnd, 0, @R.TopLeft, @S, Bmp.Canvas.Handle, @P, 0, @BF, ULW_ALPHA);
end;

 

其意气风发函数不但可以安装 Alpha Blend ,还是能做到周边本例中的异形窗口体现。标记常量有以下几个:
ULW_COLOPAJEROKEY = $00000001; // 透明颜色设置是索要的
ULW_ALPHA = $00000002; // Alpha 混合是索要的
ULW_OPAQUE = $00000004; // 保持不透明

  1、 运行Visual C++6.0,生成五个Win32应用程序,将该程序命名称叫"transparent";

听他们说XDesk接纳五个窗体来促成的,三个晶莹剔透作为背景,另外叁个是见惯司空的窗体。

2007,二月10号又翻出来XDeskWeather看了一下,找到它的财富文件,于是又发誓钻探一下,发掘点击它的About对话框的背景的时候,其设置对话框中的控件会失去主题,那样很显眼是多个不等的窗体才会冒出的情事,因而调整按多少个窗口的艺术来得以完成一下,结果发掘原来那样轻巧~~:三个窗口,二个背景,贰个前台,调控同步移动就可以!
结论:
接收Layer窗口,能够接纳WM_P景逸SUVINTCLIENT新闻。最重点深深记住一点:全数的窗口的改革都必得以图片格局提必要UpdateLayeredWindow函数!举例,你能够在你的窗口Active的时候,Move的时候,也许鼠标移动到您的控件的时候,在后台绘制叁个图形,包涵你的分界面操作变化等,都急需匡正图片,最终接收UpdateLayeredWindow函数更新那些位图就可以!

  这种畸形窗口的开创方法适应于具备的基于CWnd类的派生窗口,接收这一艺术,可以创立出其余模样的"异形"窗体。

采纳方面得ColorLayeredWindow函数,就能够使BMP作为一个通透的窗口出来,上边的主意不帮衬Alpha混合,因而对PNG之类的支撑倒霉。使用AlphaLayeredWindow可以扶植Alpha通道。若是要扶助PNG图片,能够应用GDI+,也得以应用TPNGObject来读取PNG图片,上边代码应用GDI+,须要动用GDIPAPI和GDIPObj四个单元,那多个单元谷歌一把随处能够找到。
选择方面包车型大巴主意,窗体上面的控件都亟需本身绘制,否则不可以知道了,可是实际上是在的,能够响应事件等。

  利用位图创制异形窗体的原理是基于象素的颜料来拓宽"扣像"管理,对具有非钦点颜色象素区域举行区域整合。利用这一手艺,实际上就是贯彻对话框/窗口的位图背景,并且对点名的颜料区域开展透明管理。下边就以透明位图为背景的窗体为例来注明: