none
ちらつきについて RRS feed

  • 質問

  • フォーム上にマウスでクリックした二点を結んだ線を表示するプログラムを作りました。
    そして、一つ目の点を打ってから二つ目の点を打つまでカーソルを動かすと、普通のペイントソフトのように線が一つ目の点を始点にしてカーソルまで引かれるようにしました(Invalidateメソッドを用いて前回の線を毎回消しています)。
    そして二つ目の点を打つと
    List<MyDraw> md=new List<MyDraw>();
    で定義したmdにそのときの始点、終点の位置を格納し、OnPaintで今までの線を引くようにしました。
    しかし線の数が増えてくるとカーソルを動かしたときにどうしてもちらついてしまいます。
    どうすればいいのですか?
    2009年8月28日 14:00

回答

  • ダブルバッファリングで改善できると思います。

    @IT:.NET TIPS ダブル・バッファリングにより描画を行うには? - C# VB.NET Windowsフォーム

    引用:
    "これは、グラフィックを画面に直接描画せずに、あらかじめ用意したメモリ上のビットマップ(オフスクリーン・バッファ、裏画面などと呼ばれる)に対していったんすべての描画を行い、それを画面に転送する方法である。この方法では、描画が完了したビットマップを転送するだけなので、描画途中のちらつきは完全になくなる。"
    • 回答としてマーク 高橋 春樹 2009年9月8日 8:53
    • 回答としてマークされていない Pawopewo 2009年11月17日 10:51
    • 回答としてマーク Pawopewo 2009年11月17日 10:51
    2009年8月29日 3:49
  • 描写はパネルに行っているのですが、それに関係があるのでしょうか?
    だとすると、this.SetStyle といった操作は Panel の派生クラスを作って、それでやらないと効果がありません。
    (Form に this と書いたら、Form に効果があるだけで、Panel に対しては何の効果もありません)

    こちらのサンプルとか参考になるかもしれません。(内容は確認していません)
    http://blogs.wankuma.com/yo/archive/2008/05/27/139673.aspx

    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク Pawopewo 2009年11月29日 1:52
    2009年11月28日 15:10
    モデレータ
  • 描写はパネルに行っているのですが、それに関係があるのでしょうか?
    つまり Panel の Paint イベントでやってるってことですね?
    これらのスタイルは描画を行うコントロールで設定してやらないと意味がありません。
    そして SetStyle メソッドは protected で外部からは呼び出せないため、必然的になんらかのコントロールを派生させたカスタムコントロールを作成する必要があります。
    // 子要素を含まないのならそれが Panel クラスである必要性はまずないでしょう。
    それから、カスタムコントロールの OnPaintBackground をオーバーライドする(そして何もしない)のもいいかもしれません。
    • 回答としてマーク Pawopewo 2009年11月29日 2:00
    2009年11月28日 15:16
  • そうなります。
    ただ、カスタムコントロールも作って一度ビルドしてやればデザイナのツールボックスに表示されるようになるので、VS の操作上に大きな違いはないはずです。
    • 回答としてマーク Pawopewo 2009年11月29日 5:58
    2009年11月29日 3:07
  • プロジェクトを追加する必要はありません(してもいいけど)。
    プロジェクト>新しい項目の追加 からカスタムコントロールを選んで追加してください。
    • 回答としてマーク Pawopewo 2009年11月29日 13:00
    2009年11月29日 8:41
  • こんにちは、フォーラムオペレーターの高橋春樹です。

    J.Hashimotoさん、初めまして。アドバイス有難うございました。

    Pawopewoさん、初めまして。MSDNフォーラムのご利用有難うございます。
    描画速度の改善について、J.Hashimotoさんからアドバイスがあったと思うのですが、試して頂けましたでしょうか?
    もし、問題が解決しない場合は、詳しい状況をお伝えして頂ければと思います。
    今回、J.Hashimotoさんの投稿が有用な情報と思いましたので、勝手ながら、J.Hashimotoさんからの投稿に、
    回答マークを付けさせてもらいました。

    今後ともMSDNフォーラムをよろしくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    • 編集済み 高橋 春樹 2009年9月30日 0:51 敬称が抜けてました。ご指摘ありがとうございます。
    • 回答としてマーク Pawopewo 2009年11月17日 10:51
    2009年9月8日 8:53

すべての返信

  • ダブルバッファリングで改善できると思います。

    @IT:.NET TIPS ダブル・バッファリングにより描画を行うには? - C# VB.NET Windowsフォーム

    引用:
    "これは、グラフィックを画面に直接描画せずに、あらかじめ用意したメモリ上のビットマップ(オフスクリーン・バッファ、裏画面などと呼ばれる)に対していったんすべての描画を行い、それを画面に転送する方法である。この方法では、描画が完了したビットマップを転送するだけなので、描画途中のちらつきは完全になくなる。"
    • 回答としてマーク 高橋 春樹 2009年9月8日 8:53
    • 回答としてマークされていない Pawopewo 2009年11月17日 10:51
    • 回答としてマーク Pawopewo 2009年11月17日 10:51
    2009年8月29日 3:49
  • こんにちは、フォーラムオペレーターの高橋春樹です。

    J.Hashimotoさん、初めまして。アドバイス有難うございました。

    Pawopewoさん、初めまして。MSDNフォーラムのご利用有難うございます。
    描画速度の改善について、J.Hashimotoさんからアドバイスがあったと思うのですが、試して頂けましたでしょうか?
    もし、問題が解決しない場合は、詳しい状況をお伝えして頂ければと思います。
    今回、J.Hashimotoさんの投稿が有用な情報と思いましたので、勝手ながら、J.Hashimotoさんからの投稿に、
    回答マークを付けさせてもらいました。

    今後ともMSDNフォーラムをよろしくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    • 編集済み 高橋 春樹 2009年9月30日 0:51 敬称が抜けてました。ご指摘ありがとうございます。
    • 回答としてマーク Pawopewo 2009年11月17日 10:51
    2009年9月8日 8:53
  • ご紹介いただいたページの
    this.SetStyle(ControlStyles.DoubleBuffer, true);
    this.SetStyle(ControlStyles.UserPaint, true);
    this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    の三つの処理をInitializeComponent();の前に実行したのですが解決しません。
    描写はパネルに行っているのですが、それに関係があるのでしょうか?

    2009年11月28日 14:46
  • 描写はパネルに行っているのですが、それに関係があるのでしょうか?
    だとすると、this.SetStyle といった操作は Panel の派生クラスを作って、それでやらないと効果がありません。
    (Form に this と書いたら、Form に効果があるだけで、Panel に対しては何の効果もありません)

    こちらのサンプルとか参考になるかもしれません。(内容は確認していません)
    http://blogs.wankuma.com/yo/archive/2008/05/27/139673.aspx

    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク Pawopewo 2009年11月29日 1:52
    2009年11月28日 15:10
    モデレータ
  • 描写はパネルに行っているのですが、それに関係があるのでしょうか?
    つまり Panel の Paint イベントでやってるってことですね?
    これらのスタイルは描画を行うコントロールで設定してやらないと意味がありません。
    そして SetStyle メソッドは protected で外部からは呼び出せないため、必然的になんらかのコントロールを派生させたカスタムコントロールを作成する必要があります。
    // 子要素を含まないのならそれが Panel クラスである必要性はまずないでしょう。
    それから、カスタムコントロールの OnPaintBackground をオーバーライドする(そして何もしない)のもいいかもしれません。
    • 回答としてマーク Pawopewo 2009年11月29日 2:00
    2009年11月28日 15:16
  • Panelの派生クラスでないとできないということは、フォームデザイナで追加したパネルにダブルバッファリングを行うことはできないのでしょうか?
    2009年11月29日 1:56
  • そうなります。
    ただ、カスタムコントロールも作って一度ビルドしてやればデザイナのツールボックスに表示されるようになるので、VS の操作上に大きな違いはないはずです。
    • 回答としてマーク Pawopewo 2009年11月29日 5:58
    2009年11月29日 3:07
  • ありがとうございました 理解できました(^^)
    2009年11月29日 5:59
  • もう一つお聞きしたいのですが、Panelの派生クラスのカスタムコントロールはどのようにして作ればよいのですか?
    http://msdn.microsoft.com/ja-jp/events/dd279486.aspxでみてみたのですが、ExpressEditionでは新しいプロジェクトのところに「Windows コントロール ライブラリ」の選択肢がないのですが・・・

    2009年11月29日 8:23
  • プロジェクトを追加する必要はありません(してもいいけど)。
    プロジェクト>新しい項目の追加 からカスタムコントロールを選んで追加してください。
    • 回答としてマーク Pawopewo 2009年11月29日 13:00
    2009年11月29日 8:41
  • ありがとうございました 解決いたしました
    2009年11月29日 13:00