教你实现Winform窗体的四边阴影效果

来源:互联网 发布:公务员部门排名知乎 编辑:程序博客网 时间:2024/05/04 09:24

本文转载于CSKIN论坛,地址:http://bbs.cskin.net/thread-61-1-1.html

1.首先我们得有这样一张阴影图片。


2.然后分别有两个窗体去实现这个阴影效果。

  • SkinForm - 用于实现阴影的绘制,特性:鼠标可穿透,无法点击,跟随窗体。
  • SkinMain - 主窗体,也是承载控件的容器窗体, 特性:与普通窗体无一区别,移动和拉伸,阴影窗体都会跟随。

3.SkinMain主窗体的OnVisibleChanged事件中new出阴影窗体

  • //绘制层
  • private SkinForm skin;
  • skin = new SkinForm(this);
  • skin.Show(this);
4.阴影窗体中绘制不规则透明图片的代码:
public void SetBits() {    //绘制绘图层背景    Bitmap bitmap = new Bitmap(Main.Width + 10, Main.Height + 10);    Rectangle _BacklightLTRB = new Rectangle(20, 20, 20, 20);//窗体光泽重绘边界    Graphics g = Graphics.FromImage(bitmap);    g.SmoothingMode = SmoothingMode.HighQuality; //高质量    g.PixelOffsetMode = PixelOffsetMode.HighQuality; //高像素偏移质量    ImageDrawRect.DrawRect(g, Properties.Resources.main_light_bkg_top123, ClientRectangle, Rectangle.FromLTRB(_BacklightLTRB.X, _BacklightLTRB.Y, _BacklightLTRB.Width, _BacklightLTRB.Height), 1, 1);     if (!Bitmap.IsCanonicalPixelFormat(bitmap.PixelFormat) || !Bitmap.IsAlphaPixelFormat(bitmap.PixelFormat))        throw new ApplicationException("图片必须是32位带Alhpa通道的图片。");    IntPtr oldBits = IntPtr.Zero;    IntPtr screenDC = Win32.GetDC(IntPtr.Zero);    IntPtr hBitmap = IntPtr.Zero;    IntPtr memDc = Win32.CreateCompatibleDC(screenDC);     try {        Win32.Point topLoc = new Win32.Point(Left, Top);        Win32.Size bitMapSize = new Win32.Size(Width, Height);        Win32.BLENDFUNCTION blendFunc = new Win32.BLENDFUNCTION();        Win32.Point srcLoc = new Win32.Point(0, 0);         hBitmap = bitmap.GetHbitmap(Color.FromArgb(0));        oldBits = Win32.SelectObject(memDc, hBitmap);         blendFunc.BlendOp = Win32.AC_SRC_OVER;        blendFunc.SourceConstantAlpha = Byte.Parse("255");        blendFunc.AlphaFormat = Win32.AC_SRC_ALPHA;        blendFunc.BlendFlags = 0;         Win32.UpdateLayeredWindow(Handle, screenDC, ref topLoc, ref bitMapSize, memDc, ref srcLoc, 0, ref blendFunc, Win32.ULW_ALPHA);    } finally {        if (hBitmap != IntPtr.Zero) {            Win32.SelectObject(memDc, oldBits);            Win32.DeleteObject(hBitmap);        }        Win32.ReleaseDC(IntPtr.Zero, screenDC);        Win32.DeleteDC(memDc);    }}
效果图:
 


0 0
原创粉丝点击