2012-10-09 57 views
9

Hice una forma y extendí el vidrio como en la imagen de abajo. Pero cuando muevo la ventana para que no todo esté visible en la pantalla, la representación del vidrio es incorrecta después de moverla hacia atrás: enter image description hereEl vidrio no se representa correctamente

¿Cómo puedo manejar esto para que la ventana se represente correctamente?

Este es mi código:

[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

¿Cómo sabe qué se representa si no está visible? – Gabe

+1

No está seguro de lo que quiere decir ... ¿está diciendo que si mueve la ventana más allá del borde de la pantalla y la vuelve a hacer, el cristal ha desaparecido en la sección donde la ventana se cruzó con el borde de la pantalla? – series0ne

+1

P.S. He visto el uso del vidrio muchas veces en el pasado. Busca a Daniel Moth y Glass en Google ... ¡Parece ser un gurú con efectos de cristal! – series0ne

Respuesta

11

Creo que los CreateGraphics que está causando una cierta pena aquí.

Pruebe reemplazando el método OnPaint y utilizar el objeto gráfico del PaintEventArgs lugar:

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

Si cambiar el tamaño de la forma, ya sea agregar esto al constructor:

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

o anular el evento de cambio de tamaño :

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

Estaba haciendo lo mismo, pero todavía tenía algunos problemas con el cambio de tamaño. Pruébalo y verás? – Alan

4

La siguiente llamada debe estar en su OnPaint yo thod

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

El resto solo tiene que hacerse una vez. En lugar de llamar a CreateGraphics() use los argumentos para OnPaint (e.Graphics)

Cuestiones relacionadas