MSFlexGridの表示速度 なぜ違う?

[戻る]
DirtRunner 2008/04/16(水) 17:13:43
こんにちは。
お暇なときに回答いただけるとありがたいです。


VC++2005 WinXP MFC CFormViewでのウインドウ作成です。

MSFlexGrid6.0(ActiveX)をフォームに追加し、セル幅x高さが100x100くらい(画面上で数
mmくらい)で、
セル数が500x500セルくらいの表?を作成しました。
セルには文字を入れるのではなく、セル背景色を変更する形で、
いわばセル背景色でドット絵を描くようなイメージです。

FlexGridのコントロールの大きさは700x700pixelくらいです。
ここで、

m_flexgrid1.put_Col(x);
m_flexgrid1.put_Row(y);
m_flexgrid1.put_CellBackColor(RGB(255,0,0));

x,yに任意の座標を入れつつ上記をループすると、仮に2000チップを塗ろうとすると
えらく時間がかかってしまいました。
塗った後の再描画は十分に早く、コントロールからはみ出た分がスクロールしますが、
そのスクロールもスムースに動きます。



ところが、
this->m_flexgrid1.MoveWindow(grid_x,grid_y,50,50,1);

のように、FlexGridのコントロールの大きさを小さくしてからセル背景色の変更ループを
実行し、

this->m_flexgrid1.MoveWindow(grid_x,grid_y,700,700,1);
として大きさを戻してやると、1秒以内で描画することができました。



とりあえず目的は達成したのですが、なぜそうなるのかがわかりません。
また、描画した後も一部のセル背景色をいろんなイベントのときに
変更することがあります。
そのたびにも、一度FlexGridを小さくしてセル背景色を塗ったほうが早いようです。

なぜいちいちコントロールを小さくする方が早いのでしょうか?
小さくするたびに画面がちらつくので、なにか別の方法があればなお助かるのです
が・・・

よろしくお願いします。

subaru 2008/04/16(水) 23:54:32
おそらく背景色を変えるたびにコントロールの再描画が発生するのでしょう。
コントロールを小さくすると描画する範囲が狭いのでオーバーヘッドが小さいわけです。
MSFlexGridにはRedrawというプロパティがあるようなので調べてみるとよいでしょう。

DirtRunner 2008/04/17(木) 14:57:27
subaruさん>
Redrawプロパティを描画中のみfalseにしたら、
表示領域を変更しなくても高速で再描画できるように
なりました。

this->m_flexgrid1.put_Redraw(false);

//ここで描画ルーチン

this->m_flexgrid1.put_Redraw(true);


ありがとうございます。

DirtRunner 2008/04/17(木) 14:57:51
[[解決]]
解決チェック忘れました・・・

古いスレッドには追加発言できません。