Versione corta:di Windows Dropshadow 7 stile in forma senza bordi
Obiettivo: Un profondo, scuro, Windows 7 dropshadow in WinForm senza bordi in C#
Soluzioni esistenti note 1: Semplice ombretto in stile XP con CreateParams.
Problema: Da debole, da leggero a brutto.
noti soluzioni esistenti 2: Riposizionare GDI della forma con bitmap.
Problema: Perdi la possibilità di utilizzare i controlli, solo funzionali come una schermata iniziale.
Obiettivo per questo post: trovare una soluzione mediana a questo problema o un insieme migliore.
. . .
Long Version:
(Edit:. Mi riferisco al drop-ombra in corso lungo il confine di ogni forma finestre, se non fosse chiaro) ho capito che ci sia un modo per rendere XP dropshadows stile in C# utilizzando:
codice C# 1 - semplice XP-style dropshadow (Problema: alla luce, ai deboli, a brutto)
// 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;
}
}
Tuttavia, sto cercando di capire come farle apparire come fanno in Windows 7 (ombre più profonde e più grandi) e non riesco a capire il modo migliore per farlo.
Ho un metodo ormai creato che mi permetta a ignorare tutto il GDI forma e apparire come una schermata iniziale sarebbe (credito non mia):
C# Codice 2: Sostituire modulo GDI con Bitmap (Problema: è possibile 't utilizzare i controlli dei moduli, difficile da mantenere 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;
}
}
Tuttavia, questo mi dà uno sfondo pieno a 32-bit (come ho bisogno di aggiungere il dropshadow manualmente), ma perde la capacità di creare la forma elementi che sono visibili.
Quindi, in sostanza, sto cercando di capire una mediana tra questi due metodi. Qualcosa che mi darà ombre scure profonde e scure senza perdere altre funzionalità/causando eccessivi requisiti di riverniciatura.
Che cosa è esattamente la tua domanda? Questo non è il posto giusto per ottenere la soluzione scritta per te. –
@Ramhound La domanda è semplice. Sto cercando di essere indicato nella giusta direzione su questo. La mia domanda è ben studiata e chiara come potrei farcela. Voglio solo sapere se qualcuno conosce un modo migliore per creare un ombretto in stile Windows 7. – Corylulu
Puoi aggiungere uno screenshot o un mockup del risultato desiderato? –