【VB6 ListBox】常に変動する内容をListBoxに記述、表示するようにしたのですが、


01行目の変動値を(List1.List(List1.ListIndex)="100"のような感じで)更新すると
再描画の際に、関係ない行も消されて、記述され直されてしまいます。

この処理が頻繁に発生した場合、値が更新されもしないのに再描画されてちらつく行ができてしまい
かなり目障りな状態になってしまうのですが、ちらつきを回避する良い方法などございませんでしょうか?

【備考】
・ListBoxを使っていますが、他のコントロールも使用可能です。
(ただし行数は可変であるためスクロールバーの対応が容易な
コントロールを選びたいと思っております。)
・指定行のみ描画しなおすことが出来れば理想的だと思います。

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/05/17 17:36:08
  • 終了:2010/05/22 03:08:16

ベストアンサー

id:heke2mee No.1

heke2mee回答回数162ベストアンサー獲得回数432010/05/18 05:54:33

ポイント100pt

ListBoxとListViewで指定行のみ描画ができるか試してみましたが駄目でした。


ちらつきを抑える方法

http://homepage2.nifty.com/hdkt/vb6_api_01.htm

この方法ですと、一回の更新で複数行を変更したい場合は、ちらつきを減らせると思います。

連続で呼び出すと、コントロールの描画が実行されるのでちらつきます。




時間があるなら、ユーザーコントロールを作成し、リストボックスと同じものを

自分で描画すればできます。



時間が無いなら、ListBoxと配列のデータに分けてみてはどうでしょうか

ListBoxの更新は画面外の箇所を変更してもコントロールの描画イベントが発生しているようです。

これを避けるために、配列にデータを貯め込み、通常のデータ更新は配列側に行います。

配列のデータに更新があった場合に、その箇所が表示範囲内の場合だけListBox側も更新すれば、ちらつきが

減ります。

(スクロールイベントが発生した場合とデータの件数が変化した場合も更新しないと駄目です。)

上に書いたサイトの「ちらつきを抑える方法」も組み合わせれば、かなりましになるはずです。


ListBoxの表示されている先頭位置はList1.TopIndexで取得できます。



調べているときに見つかった、その他の情報

http://bbs.pegalabo.net/c-board.cgi?cmd=ntr;tree=1;id=etc

id:harunoharuno

回答ありがとうございます。

>>この方法ですと、一回の更新で複数行を変更したい場合は、ちらつきを減らせると思います。

複数行が同時に更新されるのであれば有効な対応方法ですね。

今回は1行が連続で更新される設計なので、

使うことができませんが、今度躓いたときにためしてみようと思います。


>>時間があるなら、ユーザーコントロールを作成し、リストボックスと同じものを

>>自分で描画すればできます

オーナードローとかむずかしそーなので自分では考えもしないところです。

大変参考になります。


>>ListBoxの更新は画面外の箇所を変更してもコントロールの描画イベントが発生しているようです。

>>これを避けるために、配列にデータを貯め込み、通常のデータ更新は配列側に行います。

>>配列のデータに更新があった場合に、その箇所が表示範囲内の場合だけListBox側も更新すれば、ちらつきが

>>減ります。

>>(スクロールイベントが発生した場合とデータの件数が変化した場合も更新しないと駄目です。)

ListBoxいいところないなー。

仕方なしにListBoxの代用としてmsflexgridを用いたところちらつきがかなり減りました。

ただmsflexfrid用は対応するocxが入っていないPCでは使えないところが残念なところです

2010/05/22 03:07:50

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません