こんにちは。
お暇なときに回答いただけるとありがたいです。
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を小さくしてセル背景色を塗ったほうが早いようです。
なぜいちいちコントロールを小さくする方が早いのでしょうか?
小さくするたびに画面がちらつくので、なにか別の方法があればなお助かるのです
が・・・
よろしくお願いします。
おそらく背景色を変えるたびにコントロールの再描画が発生するのでしょう。
コントロールを小さくすると描画する範囲が狭いのでオーバーヘッドが小さいわけです。
MSFlexGridにはRedrawというプロパティがあるようなので調べてみるとよいでしょう。
subaruさん>
Redrawプロパティを描画中のみfalseにしたら、
表示領域を変更しなくても高速で再描画できるように
なりました。
this->m_flexgrid1.put_Redraw(false);
//ここで描画ルーチン
this->m_flexgrid1.put_Redraw(true);
ありがとうございます。
解決チェック忘れました・・・