9

下の画像のようにフォームを作成し、その中にガラスを伸ばしました。しかし、ウィンドウを移動してすべてが画面に表示されないようにすると、ウィンドウを元に戻した後のガラスのレンダリングが正しくなくなります。 ここに画像の説明を入力してください

ウィンドウが正しくレンダリングされるように、これをどのように処理できますか?

これは私のコードです:

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

2 に答える 2

11

ここで CreateGraphics があなたを苦しめていると思います。

OnPaint メソッドをオーバーライドして、代わりに PaintEventArgs の Graphic オブジェクトを使用してみてください。

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

フォームのサイズを変更する場合は、これをコンストラクターに追加します。

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

または Resize イベントをオーバーライドします。

protected override void OnResize(EventArgs e) {
  base.OnResize(e);
  this.Invalidate();
}
于 2012-10-16T19:01:10.077 に答える
4

次の呼び出しは OnPaint メソッドに含まれている必要があります

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

残りは一度だけ実行する必要があります。CreateGraphics() を呼び出す代わりに、引数を OnPaint (e.Graphics) に使用します。

于 2012-10-16T19:03:22.263 に答える