トップ回答者
ちらつきについて

質問
-
フォーム上にマウスでクリックした二点を結んだ線を表示するプログラムを作りました。
そして、一つ目の点を打ってから二つ目の点を打つまでカーソルを動かすと、普通のペイントソフトのように線が一つ目の点を始点にしてカーソルまで引かれるようにしました(Invalidateメソッドを用いて前回の線を毎回消しています)。
そして二つ目の点を打つと
List<MyDraw> md=new List<MyDraw>();
で定義したmdにそのときの始点、終点の位置を格納し、OnPaintで今までの線を引くようにしました。
しかし線の数が増えてくるとカーソルを動かしたときにどうしてもちらついてしまいます。
どうすればいいのですか?
回答
-
ダブルバッファリングで改善できると思います。
@IT:.NET TIPS ダブル・バッファリングにより描画を行うには? - C# VB.NET Windowsフォーム
引用:
"これは、グラフィックを画面に直接描画せずに、あらかじめ用意したメモリ上のビットマップ(オフスクリーン・バッファ、裏画面などと呼ばれる)に対していったんすべての描画を行い、それを画面に転送する方法である。この方法では、描画が完了したビットマップを転送するだけなので、描画途中のちらつきは完全になくなる。" -
描写はパネルに行っているのですが、それに関係があるのでしょうか?
だとすると、this.SetStyle といった操作は Panel の派生クラスを作って、それでやらないと効果がありません。
(Form に this と書いたら、Form に効果があるだけで、Panel に対しては何の効果もありません)
こちらのサンプルとか参考になるかもしれません。(内容は確認していません)
http://blogs.wankuma.com/yo/archive/2008/05/27/139673.aspx
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク Pawopewo 2009年11月29日 1:52
-
描写はパネルに行っているのですが、それに関係があるのでしょうか?
つまり Panel の Paint イベントでやってるってことですね?
これらのスタイルは描画を行うコントロールで設定してやらないと意味がありません。
そして SetStyle メソッドは protected で外部からは呼び出せないため、必然的になんらかのコントロールを派生させたカスタムコントロールを作成する必要があります。
// 子要素を含まないのならそれが Panel クラスである必要性はまずないでしょう。
それから、カスタムコントロールの OnPaintBackground をオーバーライドする(そして何もしない)のもいいかもしれません。- 回答としてマーク Pawopewo 2009年11月29日 2:00
-
こんにちは、フォーラムオペレーターの高橋春樹です。
J.Hashimotoさん、初めまして。アドバイス有難うございました。
Pawopewoさん、初めまして。MSDNフォーラムのご利用有難うございます。
描画速度の改善について、J.Hashimotoさんからアドバイスがあったと思うのですが、試して頂けましたでしょうか?
もし、問題が解決しない場合は、詳しい状況をお伝えして頂ければと思います。
今回、J.Hashimotoさんの投稿が有用な情報と思いましたので、勝手ながら、J.Hashimotoさんからの投稿に、
回答マークを付けさせてもらいました。今後ともMSDNフォーラムをよろしくお願いします。
マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
すべての返信
-
ダブルバッファリングで改善できると思います。
@IT:.NET TIPS ダブル・バッファリングにより描画を行うには? - C# VB.NET Windowsフォーム
引用:
"これは、グラフィックを画面に直接描画せずに、あらかじめ用意したメモリ上のビットマップ(オフスクリーン・バッファ、裏画面などと呼ばれる)に対していったんすべての描画を行い、それを画面に転送する方法である。この方法では、描画が完了したビットマップを転送するだけなので、描画途中のちらつきは完全になくなる。" -
こんにちは、フォーラムオペレーターの高橋春樹です。
J.Hashimotoさん、初めまして。アドバイス有難うございました。
Pawopewoさん、初めまして。MSDNフォーラムのご利用有難うございます。
描画速度の改善について、J.Hashimotoさんからアドバイスがあったと思うのですが、試して頂けましたでしょうか?
もし、問題が解決しない場合は、詳しい状況をお伝えして頂ければと思います。
今回、J.Hashimotoさんの投稿が有用な情報と思いましたので、勝手ながら、J.Hashimotoさんからの投稿に、
回答マークを付けさせてもらいました。今後ともMSDNフォーラムをよろしくお願いします。
マイクロソフト株式会社 フォーラム オペレーター 高橋春樹 -
描写はパネルに行っているのですが、それに関係があるのでしょうか?
だとすると、this.SetStyle といった操作は Panel の派生クラスを作って、それでやらないと効果がありません。
(Form に this と書いたら、Form に効果があるだけで、Panel に対しては何の効果もありません)
こちらのサンプルとか参考になるかもしれません。(内容は確認していません)
http://blogs.wankuma.com/yo/archive/2008/05/27/139673.aspx
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク Pawopewo 2009年11月29日 1:52
-
描写はパネルに行っているのですが、それに関係があるのでしょうか?
つまり Panel の Paint イベントでやってるってことですね?
これらのスタイルは描画を行うコントロールで設定してやらないと意味がありません。
そして SetStyle メソッドは protected で外部からは呼び出せないため、必然的になんらかのコントロールを派生させたカスタムコントロールを作成する必要があります。
// 子要素を含まないのならそれが Panel クラスである必要性はまずないでしょう。
それから、カスタムコントロールの OnPaintBackground をオーバーライドする(そして何もしない)のもいいかもしれません。- 回答としてマーク Pawopewo 2009年11月29日 2:00
-
もう一つお聞きしたいのですが、Panelの派生クラスのカスタムコントロールはどのようにして作ればよいのですか?http://msdn.microsoft.com/ja-jp/events/dd279486.aspxでみてみたのですが、ExpressEditionでは新しいプロジェクトのところに「Windows コントロール ライブラリ」の選択肢がないのですが・・・