(轉)教你實現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);
     }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM