ページ 1 / 1
仮想リストビューを実装
Posted: 2006年9月08日(金) 20:59
by ShOK
仮想リストビューを実装したいのですが、CやC++のサンプルしかなく、
ABでの実装方法が分かりません。
SetItemCountExという関数を使用することは分かったのですが、
それはどのシステムDLLの関数なのか、LVSICF_NOINVALIDATEALL や
LVSICF_NOSCROLL の定数の値は何なのか教えて頂けないでしょうか。
Re: 仮想リストビューを実装
Posted: 2006年9月09日(土) 07:49
by Sinryow
仮想リストビューを実装したいのですが、CやC++のサンプルしかなく、
ABでの実装方法が分かりません。
SetItemCountExという関数を使用することは分かったのですが、
それはどのシステムDLLの関数なのか、LVSICF_NOINVALIDATEALL や
LVSICF_NOSCROLL の定数の値は何なのか教えて頂けないでしょうか。
ShOKさんがご覧になったサンプルは、おそらくMFCを使っているものだと思います。
MFC(Microsoft Foundation Class)とはWindowsの各種ウィンドウやデータ型をクラスにまとめたライブラリで、C++でしか使えません(もしそのままABで使おうとすると、MFCのライブラリの内容自体をABに移植する必要がある)。
もしそのページを検索で見つけたのでしたら、そのページは放置し、別の検索結果のページの中で「CListView」というクラスを利用していないサンプルを参照して下さい。
【ちなみに】
もしかしてShOKさんがおっしゃる「仮想リストビュー」というのは、「表示はされないがリストビューみたいに情報を扱えるデータ型」という意味でしょうか?それなら全然違うアドバイスになるのですが・・・
Posted: 2006年9月09日(土) 20:55
by ShOK
http://ww1.enjoy.ne.jp/~turikiti/knowle ... stview.htm
http://members3.jcom.home.ne.jp/progstu ... tips4.html
http://www7.plala.or.jp/bunpan/htmldata ... _inx5.html
http://www7.plala.or.jp/bunpan/htmldata ... 00410.html
など、上げていくとキリがないのですが、どのサンプルがMFCを使っているのか分かりませんでした。
【ちなみに】
もしかしてShOKさんがおっしゃる「仮想リストビュー」というのは、「表示はされないがリストビューみたいに情報を扱えるデータ型」という意味でしょうか?それなら全然違うアドバイスになるのですが・・・
いえ、データ型ではありません。通常のリストビューでは表示がかなり遅くなるので、
仮想リストビューを使いたいと思ったのです。
Posted: 2006年9月09日(土) 22:46
by 7
> いえ、データ型ではありません。通常のリストビューでは表示がかなり遅くなるので、
遅くならないならリストビューでもいいんでしょうか?
ファイラーを作っていた経験上、FindFirstFile()関数からポンっFindNextFile()関数回してリストビューに項目をポンっ、ってリストビューにアイテムを追加しまくっていて、その処理が長いとリストビューの描写が終わるのに何十秒もかかることが有ったんですけど、LockWindowUpdate()関数でリストビューの描写を無効にしてからFindNextFile()関数でグルグル回しながら項目を追加して、処理が終わった後にLockWindowUpdate()関数でリストビューの描写を有効にしてみると何十秒もかかってたのが一瞬で終わりました。
リストビューに限らず、コントロールに過激な描写を求める場合、自分はLockWindowUpdate()関数で不要な描写はしないようにしています。
その前は、ShowWindow()関数で描写が速くなるって読みましてSW_HIDEでコントロールを非表示にして色んな処理が終わったらSW_SHOWで表示にしてました...。ブザマ。
Posted: 2006年9月09日(土) 23:33
by ShOK
> 遅くならないならリストビューでもいいんでしょうか?
はい、動作が遅くなければ構いません。
> リストビューに限らず、コントロールに過激な描写を求める場合、自分はLockWindowUpdate()関数で不要な描写はしないようにしています。
system32のファイルをすべて表示させてみましたが、普通のリストビューと同じ4秒前後でした。
試しに10000個のアイテムを表示させてみましたが、こちらも普通のリストビューと同じ15秒前後でした。
関数の戻り値が1だったので、LockWindowUpdate()関数自体は成功していると思います。
ShowWindow()関数についても同じ結果でした。
Posted: 2006年9月10日(日) 00:19
by 高信期
コード: 全て選択
Const LVSICF_NOINVALIDATEALL = &H00000001
Const LVSICF_NOSCROLL = &H00000002
Declare Sub ListView_SetItemCount Lib "comctl32" (hwndLV As HWND, cItems As Long)
Declare Sub ListView_SetItemCountEx Lib "comctl32" (hwndLV As HWND, cItems As Long, dwFlags As DWord)
でよろしいでしょうか?
ところで、LockWindowUpdate/UnlockWindowUpdate関数には
アンロック後にデスクトップ上のすべてのウィンドウに対しWM_PAINTを送信してしまう、というバグがあるそうです。
なので、描写の停止にはWM_SETREDRAWを使ったほうが無難です。
Posted: 2006年9月10日(日) 04:13
by ShOK
定義は出来ました。ありがとうございます。
WM_NOTIFYによってLVN_GETDISPINFOという通知が送られ、
lParamがLV_DISPINFO構造体になるので、そこに表示するアイテムの文字列を格納する。
ということみたいなのですが、どうすればよいかさっぱり分かりません。
あと、関数や定数の定義が分からないと困るのでPlatform SDKをさっきインストールしました。
CommCtrl.hを見てみたところ、
コード: 全て選択
#define LVN_FIRST (0U-100U)
#define LVN_GETDISPINFOA (LVN_FIRST-50)
#define LVN_GETDISPINFOW (LVN_FIRST-77)
#define LVN_GETDISPINFO LVN_GETDISPINFOW
とありましたが、「0U-100U」とは一体何なのでしょうか。
LVN_GETDISPINFOA と LVN_GETDISPINFOW は前者のほうでよいでしょうか。