2012-10-09 36 views
9

Tôi đã tạo biểu mẫu và mở rộng kính trong hình ảnh như trong hình bên dưới. Nhưng khi tôi di chuyển cửa sổ sao cho không phải tất cả hiển thị trên màn hình, hiển thị kính là sai sau khi tôi di chuyển trở lại: enter image description hereKính không được hiển thị đúng

Làm cách nào để hiển thị cửa sổ?

Đây là mã của tôi:

[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

Làm thế nào để bạn biết những gì được hiển thị nếu nó không hiển thị? – Gabe

+1

Không chắc chắn ý của bạn là gì ... bạn có nói rằng nếu bạn di chuyển cửa sổ qua cạnh của màn hình và ngược lại, kính đã biến mất trong phần mà cửa sổ giao nhau với cạnh màn hình? – series0ne

+1

P.S. Tôi đã xem xét sử dụng kính nhiều lần trong quá khứ. Tìm kiếm Daniel Moth và Glass trong Google ... Anh ấy có vẻ là một guru với hiệu ứng kính !! – series0ne

Trả lời

11

Tôi nghĩ rằng CreateGraphics đang gây ra cho bạn một số đau buồn ở đây.

Hãy thử trọng phương pháp OnPaint và sử dụng các đối tượng đồ họa từ PaintEventArgs thay vì:

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

Nếu thay đổi kích thước hình thức, hoặc thêm video này vào các nhà xây dựng:

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

hoặc ghi đè lên các sự kiện Resize :

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

Tôi đã làm tương tự, nhưng tôi vẫn có một số vấn đề với thay đổi kích thước. Hãy thử nó, và xem? – Alan

4

Cuộc gọi sau phải nằm trong OnPaint của bạn thod

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

Phần còn lại chỉ được thực hiện một lần. Thay vì gọi hàm CreateGraphics(), hãy sử dụng các đối số cho OnPaint (e.Graphics)

Các vấn đề liên quan