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