zoukankan      html  css  js  c++  java
  • (转)教你实现Winform窗体的四边阴影效果

    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);
        }
    }
  • 相关阅读:
    hugeng007_SupportVectorMachine_demo
    hugeng007_RandomForestClassifier_demo
    hugeng007_pca_vs_Ida_demo
    hugeng007_Muti-Layer Perceptron_demo
    hugeng007_LogisticRegression_demo
    hugeng007_adaboost_demo
    渗透测试第三章web安全基础--web系统框架
    渗透测试第二章---网络协议安全
    渗透测试第一章 信息收集--- 扫描技术与抓包分析
    爬虫公开课学习的一天
  • 原文地址:https://www.cnblogs.com/candyzhmm/p/5692874.html
Copyright © 2011-2022 走看看