【发布时间】:2012-02-06 06:49:37
【问题描述】:
短版:
目标:在 C# 中的无边框 WinForm 中创建一个深而暗的 Windows 7 阴影
已知的现有解决方案 1: 使用 CreateParams 的简单 XP 样式阴影。
问题:太弱,太轻,太丑。
已知的现有解决方案2:将表单的GDI替换为位图。
问题:失去使用控件的能力,只能用作启动画面。
这篇文章的目标:找到这个问题的中位解决方案或一个更好的解决方案。
。 . .
加长版:
(编辑:如果不清楚的话,我指的是沿着任何窗口窗体的边框的投影。) 我知道有一种方法可以使用 C# 制作 XP 样式的阴影:
C# 代码 1 - 简单的 XP 样式阴影(问题:变亮、变弱、变丑)
// Define the CS_DROPSHADOW constant
private const int CS_DROPSHADOW = 0x00020000;
// Override the CreateParams property
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ClassStyle |= CS_DROPSHADOW;
return cp;
}
}
但是,我试图弄清楚如何使它们看起来像 Windows 7 中的那样(更深和更大的阴影),但无法找出最好的方法。
我现在创建了一个方法,它可以让我覆盖整个 GDI 表单并看起来像一个启动屏幕(信用不是我的):
C#代码2:用位图替换表单GDI(问题:不能使用表单控件,GUI难维护)
public void SetBitmap(Bitmap bitmap, byte opacity)
{
if (bitmap.PixelFormat != PixelFormat.Format32bppArgb)
throw new ApplicationException("The bitmap must be 32ppp with alpha-channel.");
// 1. Create a compatible DC with screen;
// 2. Select the bitmap with 32bpp with alpha-channel in the compatible DC;
// 3. Call the UpdateLayeredWindow.
IntPtr screenDc = Win32.GetDC(IntPtr.Zero);
IntPtr memDc = Win32.CreateCompatibleDC(screenDc);
IntPtr hBitmap = IntPtr.Zero;
IntPtr oldBitmap = IntPtr.Zero;
try
{
hBitmap = bitmap.GetHbitmap(Color.FromArgb(0)); // grab a GDI handle from this GDI+ bitmap
oldBitmap = Win32.SelectObject(memDc, hBitmap);
Win32.Size size = new Win32.Size(bitmap.Width, bitmap.Height);
Win32.Point pointSource = new Win32.Point(0, 0);
Win32.Point topPos = new Win32.Point(Left, Top);
Win32.BLENDFUNCTION blend = new Win32.BLENDFUNCTION();
blend.BlendOp = Win32.AC_SRC_OVER;
blend.BlendFlags = 0;
blend.SourceConstantAlpha = opacity;
blend.AlphaFormat = Win32.AC_SRC_ALPHA;
Win32.UpdateLayeredWindow(this.Handle, screenDc, ref topPos, ref size, memDc, ref pointSource, 0, ref blend, Win32.ULW_ALPHA);
}
finally
{
Win32.ReleaseDC(IntPtr.Zero, screenDc);
if (hBitmap != IntPtr.Zero)
{
Win32.SelectObject(memDc, oldBitmap);
Win32.DeleteObject(hBitmap);
}
Win32.DeleteDC(memDc);
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x00080000; // This form has to have the WS_EX_LAYERED extended style
return cp;
}
}
但是,这确实为我提供了完整的 32 位背景(因为我需要手动添加阴影),但我无法创建可见的表单元素。
所以基本上,我试图找出这两种方法之间的中位数。在不丢失其他功能/导致过度重绘要求的情况下,可以给我提供深而暗的阴影。
【问题讨论】:
-
您的问题到底是什么?这真的不是为您编写解决方案的地方。
-
@Ramhound 问题很简单。我希望在这方面指出正确的方向。我的问题经过充分研究,并且尽可能清楚。我只是想知道是否有人知道创建 Windows 7 样式阴影的更好方法。
-
您可以添加所需结果的屏幕截图或模型吗?
-
@KevinMcCormick dl.dropbox.com/u/18919663/Dropshadow.png 这是我想要的最终结果,但我发布了我最终是如何做到的。如果您有任何建议,欢迎。
标签: c# .net winforms user-interface windows-7