Version viết tắt:của Windows DropShadow 7 phong cách trong hình thức không biên giới
Mục tiêu: Một sâu, tối, Windows 7 DropShadow trong WinForm không biên giới trong C#
Các giải pháp hiện có đã biết 1: Kiểu đổ bóng kiểu XP đơn giản bằng cách sử dụng CreateParams.
Sự cố: Để yếu, nhẹ, xấu.
Được biết đến các giải pháp hiện có 2: Thay GDI của mẫu với bitmap.
Sự cố: Mất khả năng sử dụng điều khiển, chỉ hoạt động như màn hình giật gân.
Objective qua đường bưu điện này: Tìm một giải pháp trung bình cho vấn đề này hoặc tất cả cùng nhau tốt hơn một.
. . .
dài Version:
(Edit:. Tôi đề cập đến trình đơn thả bóng đi dọc theo biên giới của bất kỳ hình thức cửa sổ, nếu đó không phải là rõ ràng) Tôi hiểu rằng có một cách để làm cho dropshadows phong cách XP trong C# sử dụng:
C# Code 1 - Simple XP kiểu DropShadow (vấn đề: với ánh sáng, yếu, để xấu xí)
// 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;
}
}
Tuy nhiên, tôi đang cố gắng tìm ra cách làm cho chúng xuất hiện như trong Windows 7 (bóng tối hơn và lớn hơn) và không thể tìm ra cách tốt nhất để làm điều này.
Tôi có một phương pháp hiện nay được tạo ra sẽ cho phép tôi ghi đè lên toàn bộ hình thức GDI và xuất hiện như một màn hình splash sẽ (tín dụng không phải của tôi):
C# Mã 2: Thay thế hình thức GDI với Bitmap (Vấn đề: có thể 't sử dụng hình thức kiểm soát, khó có thể duy trì 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;
}
}
Tuy nhiên, điều này không cho tôi một nền tảng đầy đủ 32-bit (như tôi yêu cầu để thêm DropShadow bằng tay), nhưng tôi đã làm mất khả năng tạo ra hình thức các thành phần hiển thị.
Vì vậy, về cơ bản, tôi đang cố gắng tìm ra trung bình giữa hai phương pháp này. Một cái gì đó mà sẽ cho tôi bóng tối sâu và tối mà không làm mất chức năng khác/gây ra yêu cầu sơn lại quá mức.
Câu hỏi của bạn chính xác là gì? Đây thực sự không phải là nơi để viết giải pháp cho bạn. –
@Ramhound Câu hỏi rất đơn giản. Tôi đang tìm cách để chỉ đúng hướng về điều này. Câu hỏi của tôi được nghiên cứu kỹ và rõ ràng như tôi có thể làm được. Tôi chỉ muốn biết nếu có ai biết cách tốt hơn để tạo ra một dropshadow kiểu Windows 7. – Corylulu
Bạn có thể thêm ảnh chụp màn hình hoặc mô hình kết quả mong muốn không? –