none
ダブルバッファリングについて。 RRS feed

  • 質問

  • カスタムコントロールを作成しました。

    ダブルバッファを使おうとおもい、このカスタムコントロールのコンストラクタで

    SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

    としたのですが、これですとWindowsFormに描画されません。

    で、WindowsFormのコンストラクタで

    SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

    としたら描画されました。

    ダブルバッファとはこういう使い方でいいのでしょうか?

    以上宜しくお願いします

    2006年11月4日 5:13

すべての返信

  • OptimizedDoubleBuffer の説明を見ると
    AllPaintingInWmPaint も True にする必要があると記載されています。
    さらに AllPaintingInWmPaint  の説明をみると
    UserPaint も True にする必要があると記載されています。

    上記の必要な設定を全て True にしてみてください。
    でも私の場合
    OptimizedDoubleBuffer  だけ True にしても表示されなくなるといった現象は発生しなかったんですけど。
    なにを継承したのでしょうか。

    また、.NET 2.0 から Control.DoubleBuffered プロパティが追加されました。
    これを True にするだけでダブルバッファが実現されるようです。

    2006年11月4日 8:01
  • 継承したのはPanelです。

    Controlにもしてみたのですが、

    SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    SetStyle(ControlStyles.UserPaint, true);

    をすべてカスタムコントロールのコンストラクタに入れると、OnPaintで書いてある

    線などが表示されません。

     DoubleBuffered = true;

    でも状況は同じです。


                Graphics g = this.CreateGraphics();
                Pen pen = new Pen(Color.Black, 1);
                pen.DashStyle = DashStyle.Solid;
                PointF vStartPoint = new PointF(0,0);
                PointF vEndPoint = new PointF(0,Height);
         g.DrawLine(pen, vStartPoint, vEndPoint);

    OnPaintのなかでのコードはこれだけです
    なにか抜けているのでしょうか?

     

    2006年11月4日 12:46
  • すいません、なにかとらぶっていたようで新規に作ったところ
    意図した動きになりました。ありがとうございました
    2006年11月4日 13:25
  •  igoigo さんからの引用

                Graphics g = this.CreateGraphics();
                Pen pen = new Pen(Color.Black, 1);
                pen.DashStyle = DashStyle.Solid;
                PointF vStartPoint = new PointF(0,0);
                PointF vEndPoint = new PointF(0,Height);
         g.DrawLine(pen, vStartPoint, vEndPoint);

    OnPaintのなかでのコードはこれだけです

    Graphics は OnPaint の引数の pevent.Graphics を使用してできませんか。
    OnPaint で使用するために作成されたものだからです。

    それと OnPaint 内では不要ですが、
    Graphics を生成して使用済みになったら Dispose した方がいいでしょう。
    使用済みのリソースを破棄するためです。

    2006年11月4日 13:57
  •  ダッチ さんからの引用

     igoigo さんからの引用

                Graphics g = this.CreateGraphics();
                Pen pen = new Pen(Color.Black, 1);
                pen.DashStyle = DashStyle.Solid;
                PointF vStartPoint = new PointF(0,0);
                PointF vEndPoint = new PointF(0,Height);
         g.DrawLine(pen, vStartPoint, vEndPoint);

    OnPaintのなかでのコードはこれだけです

    Graphics は OnPaint の引数の pevent.Graphics を使用してできませんか。
    OnPaint で使用するために作成されたものだからです。

    それと OnPaint 内では不要ですが、
    Graphics を生成して使用済みになったら Dispose した方がいいでしょう。
    使用済みのリソースを破棄するためです。

    なるほど、了解しました。いろいろとご助言ありがとうございました。

    2006年11月5日 0:44