本文介绍了如何在Windows Forms应用程序中实现圆角窗口和边缘阴影效果的技术细节与步骤,旨在提升界面美观度。
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 + 20, _BacklightLTRB.Height),
1, 1); // 注意这里的宽度调整为原始值加20
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();
blendFunc.BlendOp = Win32.AC_SRC_OVER;
blendFunc.SourceConstantAlpha = Byte.Parse(255);
blendFunc.AlphaFormat = Win32.AC_SRC_ALPHA;
blendFunc.BlendFlags = 0;
hBitmap = bitmap.GetHbitmap(Color.FromArgb(0));
oldBits = Win32.SelectObject(memDc, hBitmap);
// 更新窗口图层
Win32.UpdateLayeredWindow(Handle, screenDC, ref topLoc, ref bitMapSize,
memDc, new Win32.Point(), 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);
}
}