当前位置:首页 > Windows程序 > 正文

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

2021-03-16 Windows程序

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);

    }

}

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

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/61875.html