2012-10-09 17 views
9

Ho creato una forma e ho esteso il vetro come nell'immagine qui sotto. Ma quando mi muovo la finestra in modo non tutto è visibile sullo schermo, il rendering di vetro è sbagliato dopo mi muovo indietro: enter image description hereIl vetro non viene visualizzato a destra

Come posso gestire questo modo la finestra è resa correttamente?

Questo è il mio codice:

[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

Come fai a sapere cosa viene visualizzato se non è visibile? – Gabe

+1

Non sei sicuro di cosa intendi ... stai dicendo che se muovi la finestra oltre il bordo dello schermo e di nuovo indietro, il vetro è scomparso nella sezione in cui la finestra si interseca con il bordo dello schermo? – series0ne

+1

P.S. Ho cercato di usare il vetro molte volte in passato. Cerca Daniel Moth and Glass in Google ... Sembra un guru con effetti di vetro !! – series0ne

risposta

11

Penso che i CreateGraphics sta causando qualche dolore qui.

Prova override del metodo OnPaint e utilizzare l'oggetto di grafica dalle PaintEventArgs invece:

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)); 
} 

Se il ridimensionamento del modulo, aggiungere questo al costruttore:

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

o ignorare l'evento Resize :

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

Stavo facendo lo stesso, ma avevo ancora qualche problema con il ridimensionamento. Provalo e vedi? – Alan

4

La seguente chiamata deve essere nel tuo OnPaint me THOD

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

Il resto deve solo essere fatto una volta. Invece di chiamare CreateGraphics() usa gli argomenti su OnPaint (e.Graphics)