Short Version:Windows 7 styl dropshadow w postaci obramowania
Cel: głęboki, ciemny, Windows 7 dropshadow w obramowania WinForm w C#
Znane istniejące rozwiązania 1: Prosty cień w stylu XP z wykorzystaniem CreateParams.
Problem: Słaby, jasny, brzydki.
istniejące znane rozwiązania 2: Wymienić GDI formy z mapy bitowej.
Problem: Stracić możliwość korzystania z elementów sterujących, funkcjonalny tylko jako ekran powitalny.
Cel przez tego postu: Znajdź medianę rozwiązanie tego problemu lub wszystko razem lepszy.
. . .
Długa wersja:
(Edycja:. Mam na myśli listy rozwijanej cieniu będzie wzdłuż granicy jakiejkolwiek formie okien, jeśli nie było jasne) Rozumiem że istnieje sposób, aby XP dropshadows stylu w C# za pomocą:
C# Code 1 - Prosty XP-styl dropshadow (problem: na światło, słaby, aby brzydki)
// 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;
}
}
Jednak staram się dowiedzieć, jak sprawić, aby wyglądały jak w Windows 7 (głębsze i większe cienie) i nie mogą znaleźć najlepszego sposobu na zrobienie tego.
Mam metodę teraz utworzony, który pozwoli mi zastąpić całą formularz GDI i wyglądać ekran powitalny będzie (kredyt nie moje):
C# Code 2: Wymień formularz GDI z problemem Bitmap (: można „t używać formantów formularzy, trudne do utrzymania 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;
}
}
jednak to daje mi pełną 32-bitową tła (jak mogę wymagać, aby dodać dropshadow ręcznie), ale tracą zdolność do tworzenia form elementy, które są widoczne.
W zasadzie próbuję ustalić medianę między tymi dwoma metodami. Coś, co da mi głębokie i ciemne cienie bez utraty innej funkcjonalności/powodując nadmierne wymagania dotyczące ponownego malowania.
Czym dokładnie jest twoje pytanie? To naprawdę nie jest miejsce, w którym można napisać rozwiązanie dla ciebie. –
@Ramhound Pytanie jest proste. Szukam w tym kierunku właściwego wskazania. Moje pytanie jest dobrze zbadane i tak wyraźne, jak tylko mogłem. Chcę tylko wiedzieć, czy ktokolwiek wie o lepszym sposobie tworzenia cieni w stylu systemu Windows 7. – Corylulu
Czy możesz dodać zrzut ekranu lub makietę pożądanego rezultatu? –