お世話になります。VS.NET2005 CLRのWindowsフォームアプリケーションで開発しています。
親フォームにコントロールが複数(50個くらい)あり親フォームから子フォームを呼び子フォ
ームから親フォームへ戻った際に描画がきれいに行われずにコントロールの残像(パラパラと表
示される)が発生し見た目が見苦しい状態になっています。
処理としては親フォームは一度ロードするだけで毎回ロードしているわけではなく後は子フォー
ムのほうでVisible = false,trueで切り替えて親フォームを表示、非表示するように見せてい
ます。試しにサンプルプログラムでフォームにコントロールボタンを10個貼り付けて実行さ
せ、そのフォーム上をWindowsの画面(エクスプローラ等)が横切るだけでコントロールの残像
(パラパラと表示される)が発生しました。
ほかのサイトでCLRはMFCに比べてメモリの消費が大きいと聞きましたが開発マシンは比較
的スペックの高いマシンを使用しています。プログラムで回避したい所ですが何か方法がありま
したらご教授ください。
開発環境はXPですが2000で実行したところ少しは見た目的にマシになった感じです。
WS_CLIPCHILDRENで調べてみ
>ぺさん
アドバイスありがとうございます。
WS_CLIPCHILDRENを実装して確認してみます。
たびたびすみません。
WS_CLIPCHILDRENを実装しようと試みたのですが肝心なCLRでの実装方法が
分かりません。ネット等で情報を収集していますがアドバイスを頂けたら
と思います。
フォームにコントロール(ボタン)が20個いるソースがあります。
※何も処理等は記述していないのでデフォルトでアプリが作成してくれる
ソースです。
これのどこの位置でWS_CLIPCHILDRENを実装するのでしょうか?すみません
具体的にソースを載せたいのですがこのPCには.NETの環境がないもので。
WS_CLIPCHILDRENを直接使うのならば
http://msdn2.microsoft.com/ja-jp/library/
system.windows.forms.createparams.style.aspx
これでしょうけど、これで目的を果たせるかは調べてません。
他に、半透明設定をかけておくとレイヤードウィンドウ化されて再描画が減る可
能性もありますが、こちらも目的を果たせるかは調べてません。
もう一つ、ダブルバッファリングが出来ればちらつきは抑えられますが、CLRでの実
装方法はこれまた調べてません。
調べていないばかりで申し訳ない。
足がかりにはなると思い書き込ませていただきました。
CLRのSystem::Windows::Form::ControlStylesには、WS_CLIPCHILDRENは無いみたいですね。
DoubleBufferと言うのはあるみたいなので試すならこっちなのかも。
OptimizedDoubleBufferと言うのもあるみたいです。
私の環境でボタンを20個貼り付けただけのフォームを作成してみましたけれど、
同じ事をMFCアプリでやった時に比べると描画遅いみたいですね。
ボタン部分の描画が少し遅れて描画されるのが確認できました。
ボタンの数を50個にするともっと顕著にでます。
但し、実用上問題が有るかといわれたら問題無いと答えると思います。
見た目的にも一瞬の話なので使うのに支障があるレベルでは無いと思います。
C++/CLIで組んだ場合、計算とか内部処理に関してはそれほど遅く無いと言う話を
入門書で見かけますけれど、描画処理に関してはやはり見てわかるくらい重いですね。
ある意味、仕方ない部分もあるのかなと思ってますけれど。
マシンスペックが無いと段々快適に使えないと言う状況が加速しそうで嫌ですが
これも時代の流れかなぁ。
.NET Frmaeworkを使うのであれば、ある程度は割り切りも必要かもしれませんね。
>麩さん PATIOさん
貴重なアドバイスありがとうございます。System::Windows::Form::ControlStylesを改
めて調べてみましたがPATIOさんのおっしゃる通りCLRにはWS_CLIPCHILDRENは無さそうで
す・・・。
DoubleBufferについてCLRで使用可能か少し調べて見ます。
>>私の環境でボタンを20個貼り付けただけのフォームを作成してみましたけれど、
>>同じ事をMFCアプリでやった時に比べると描画遅いみたいですね。
>>ボタン部分の描画が少し遅れて描画されるのが確認できました。
再現確認ありがとうございました。やはり確認出来たのですね。私もMFCでやってみまし
たが明らかにCLRの方がコントロールがパラパラと表示されて遅かったです。Windowsの
設定をXPから2000やクラシックモードに変えたりいろいろと試行錯誤しましたが残念な
がら出来ませんでした。
なんとかしてプログラムで回避出来たらと思いますので引き続き貴重な意見が聞けたら
と思います。
さらにネット等で調べましたが以下の記事を見つけました。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1617356&SiteID=7
DoubleBufferでも回避出来なかったとのことですので画面設計の見直しかはたまた開発
環境の見直しになりそうです。
う~ん、残念。プログラムで回避したかった・・・。