2012-10-09 8 views
9

Ich machte eine Form und erweiterte das Glas darin wie im Bild unten. Aber wenn ich das Fenster verschiebe, damit nicht alles auf dem Bildschirm sichtbar ist, ist das Glas-Rendering falsch, nachdem ich es zurückbewege: Glas ist nicht richtig gerendert

Wie kann ich damit umgehen, damit das Fenster richtig gerendert wird?

Dies ist mein Code:

[DllImport("dwmapi.dll")] 
private static extern void DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Margins mg); 

[DllImport("dwmapi.dll")] 
private static extern void DwmIsCompositionEnabled(out bool enabled); 

public struct Margins{ 
    public int Left; 
    public int Right; 
    public int Top; 
    public int Bottom; 
} 

private void Form1_Shown(object sender, EventArgs e) { 
    this.CreateGraphics().FillRectangle(new SolidBrush(Color.Black), new Rectangle(0, this.ClientSize.Height - 32, this.ClientSize.Width, 32)); 
    bool isGlassEnabled = false; 
    Margins margin; 
    margin.Top = 0; 
    margin.Left = 0; 
    margin.Bottom = 32; 
    margin.Right = 0; 
     DwmIsCompositionEnabled(out isGlassEnabled); 

    if (isGlassEnabled) { 

      DwmExtendFrameIntoClientArea(this.Handle, ref margin); 
     } 
} 
+0

Woher wissen Sie, was gerendert wird, wenn es nicht sichtbar ist? – Gabe

+1

Unsicher, was Sie meinen ... sagen Sie, dass, wenn Sie das Fenster über den Bildschirmrand hinaus und wieder zurück bewegen, das Glas in dem Bereich verschwunden ist, in dem sich das Fenster mit der Bildschirmkante kreuzte? – series0ne

+1

P.S. Ich habe in der Vergangenheit viele Male Glas benutzt. Suche nach Daniel Moth und Glass in Google ... Er scheint ein Guru mit Glaseffekten zu sein !! – series0ne

Antwort

11

Ich denke, die Create Sie hier einige Trauer verursacht.

Versuchen Sie, die OnPaint-Methode überschreiben und das Grafik-Objekt aus den PaintEventArgs anstatt:

protected override void OnShown(EventArgs e) { 
    base.OnShown(e); 

    bool isGlassEnabled = false; 
    Margins margin; 
    margin.Top = 0; 
    margin.Left = 0; 
    margin.Bottom = 32; 
    margin.Right = 0; 
    DwmIsCompositionEnabled(out isGlassEnabled); 

    if (isGlassEnabled) { 
    DwmExtendFrameIntoClientArea(this.Handle, ref margin); 
    } 
} 

protected override void OnPaint(PaintEventArgs e) { 
    base.OnPaint(e); 

    e.Graphics.FillRectangle(Pens.Black, 
     new Rectangle(0, this.ClientSize.Height - 32, this.ClientSize.Width, 32)); 
} 

Wenn das Formular Ändern der Größe, entweder fügen Sie diese an den Konstruktor:

public Form1() { 
    InitializeComponent(); 
    this.ResizeRedraw = true; 
} 

oder das Resize-Ereignis überschreiben :

protected override void OnResize(EventArgs e) { 
    base.OnResize(e); 
    this.Invalidate(); 
} 
+0

Ich machte das gleiche, aber ich hatte immer noch Probleme mit der Größenanpassung. Probieren Sie es aus und sehen Sie? – Alan

4

Der folgende Anruf muss in Ihrem OnPaint mich sein thod

FillRectangle(new SolidBrush(Color.Black), new Rectangle(0, this.ClientSize.Height - 32, this.ClientSize.Width, 32)); 

Der Rest muss nur einmal gemacht werden. Anstatt CreateGraphics() aufzurufen, verwenden Sie die Argumente für den OnPaint (e.Graphics)