2012-10-09 26 views
9

Zrobiłem formularz i wyciągnąłem w nim szklankę jak na poniższym obrazku. Ale kiedy przesuwanie okna nie jest widoczne na ekranie, renderowanie szkła jest nieprawidłowe po jego przeniesieniu: enter image description hereSzkło nie jest renderowane

Jak mogę to zrobić, aby okno było poprawnie renderowane?

To jest mój kod:

[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

Skąd wiesz, co jest renderowane, jeśli nie jest widoczne? – Gabe

+1

Nie wiesz, co masz na myśli ... czy mówisz, że jeśli przesuniesz okno poza krawędź ekranu iz powrotem, szkło zniknęło w sekcji, w której okno przecinało się z krawędzią ekranu? – series0ne

+1

P.S. W przeszłości wiele razy używałam szkła. Szukaj Daniela Motha i Glassa w Google ... On wydaje się być guru z efektami szkła !! – series0ne

Odpowiedz

11

myślę, że CreateGraphics powoduje ci żal tutaj.

Spróbuj przesłanianie metody OnPaint i korzystać z obiektu graficznego od PaintEventArgs zamiast:

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

Jeśli zmiana rozmiaru formularza, albo dodać do konstruktora:

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

lub nadpisać zdarzenie Resize :

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

Robiłem to samo, ale wciąż miałem problemy z rozmiarem. Spróbuj i zobacz? – Alan

4

Następujące połączenie musi znajdować się w urządzeniu OnPaint me thod

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

Resztę należy wykonać tylko raz. Zamiast wywoływania CreateGraphics() użyj argumentów OnPaint (e.Graphics)