HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0615
ぽこみちリストビュー8解決


ぽこみち

リンク

2008/6/15(Sun) 19:56:32|NO.16760

1.winobjにてリストビューを実装したのですが、カラムをクリック時にソートさせる機能などを実装した時の
カラムに"▲""▼"このような(bmpですか?)記号を表示させるにはどうしたらよいのでしょう?
英語圏のソフトでも記号が出るので、カラム名にbmpでも仕込んでいるのか、はたまたwindowsに実装されている
標準機能なのか?

2.ウインドウメッセージLVS_EDITLABELSにてアイテムの編集を行う時、指定したカラムのリストのみ編集可にするにはどうするのか?

3.リスト内にセパレータのようなものは作れるのか?例えばカラム関係なしに1行適当な文字列を表示させる選択は不可です

以上を実現できる方法を教えてください。宜しくお願いします。



この記事に返信する


flory

リンク

2008/6/16(Mon) 08:13:32|NO.16778

質問の「リストビュー」とは、詳細表示のリストビューですよね?
詳細表示リストビューと仮定して話を進めます。


>1.winobjにてリストビューを実装したのですが、
>カラムをクリック時にソートさせる機能などを実装した時のカラムに
>"▲""▼"このような(bmpですか?)記号を表示させるにはどうしたらよいのでしょう?
>英語圏のソフトでも記号が出るので、カラム名にbmpでも仕込んでいるのか、
>はたまたwindowsに実装されている標準機能なのか?
VC++ではできるらしいですが、普通はオーナードローを使うようです。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=7115&KLOG=7


>2.ウインドウメッセージLVS_EDITLABELSにてアイテムの編集を行う時、
>指定したカラムのリストのみ編集可にするにはどうするのか?
指定したカラム???
いまいち質問の意図がわからない。

サブアイテムも編集可能にしたい、というのであれば、「できない」というのが
答えになります。

特定のアイテムを編集可能・不可能にしたい、というのであれば、
LVN_BEGINLABELEDITメッセージ($FFFFFF97)の戻り値を0以外にすればアイテムの編集を
キャンセルすることができるので、それを利用してください。

それか、「項目編集ボタン」を作ってサブルーチンで編集処理を行うのもアリです。
これならサブアイテムの編集も自由自在ですし、特定項目を編集不可にするのも
楽にできるかと。

どうでもいいですが、LVS_EDITLABELSはウィンドウスタイルですよ。


>3.リスト内にセパレータのようなものは作れるのか?
>例えばカラム関係なしに1行適当な文字列を表示させる
>選択は不可です
「カラム関係なしに1行適当な文字列を表示させる」というのは、詳細表示リストビューの
用途の範囲外でしょう。
できないと思います。

特定項目を選択不可にするだけなら、LVN_ITEMCHANGINGメッセージ($FFFFFF9C)の戻り値を
0以外にすればできるかもしれません。



ぽこみち

リンク

2008/6/16(Mon) 19:41:34|NO.16791

floryさん前回も回答して頂きありがとうございます。
読み返してみたら書き方が失礼だし、間違いもありました。
すみません。

表示形式が複数あることをすっかり忘れていました。
詳細表示リストビューの質問です。

1.はオーナードローですか。調べてみます。

>2.ウインドウメッセージLVS_EDITLABELSにて
この部分は「ウインドウメッセージLVN_ENDLABELEDITの使い方と」
という文章がありました。

>指定したカラムのリスト
これは、例えばカラム1、2、3があって2のサブアイテムのみ編集という意味です。
でもできないみたいですね。
いくつかそのようなアプリケーションを見たことがあったので、たぶんクリックしたら
その場所にinputなどを表示させているのかもしれませんね

3.はXPのエクスプローラで詳細表示、「アイコンの整列->グループで表示」にすると
カラムの数、横幅関係なくグループ名とその下にグラデーションライン見たいなもので
見やすく分けられているので、それを実現したいと思いました。
そのグループ名とラインが、アイテムのフォント高よりも若干大きいので、
3.の例えはちょっと違ったかもしれません。



ぽこみち

リンク

2008/6/16(Mon) 23:32:32|NO.16796

3.について調べた所、MFCにて実現しているようです。Cとかそんな言語のライブラリクラス??
らしいのでHSPでは無理みたいですね

これはオーナードローじゃどうしようもないのでしょうか?
リストビューを1から作らない限り無理でしょうか?



ぽこみち

リンク

2008/6/18(Wed) 23:15:10|NO.16821

かなり力技で3カラムのみのオブジェクトを設置して、その下にカラム無しのアイテムのみリストを
横に3つ設置して全項目編集可、グループ項目の文字用テキストの下に更に、アイテムリストを追加していく形で
出来そうな気がするのでなんとかやってみます。



flory

リンク

2008/6/19(Thu) 08:12:42|NO.16823

3.についてですが、よくよく調べてみると、こんなものがありました。

LVM_ENABLEGROUPVIEW Message
http://msdn.microsoft.com/en-us/library/bb774900(VS.85).aspx

LVM_INSERTGROUP Message
http://msdn.microsoft.com/en-us/library/bb761103(VS.85).aspx

XP以降なら、リストビューにこのようなメッセージを送ることで、
エクスプローラで「グループで表示」を行ったときのようにできます。

最低限の設定しかしてませんが、サンプルを。

//通常のウィンドウスタイル #const WS_CHILD $40000000 ; 子ウィンドウ #const WS_VISIBLE $10000000 ; 可視状態ウィンドウ #const WS_BORDER $00800000 ; 境界線を持つウィンドウ //リストビューのウィンドウスタイル #const LVS_REPORT $00000001 ; 詳細表示リストビュー //ウィンドウメッセージ #const LVM_INSERTITEM $00001007 ; アイテムを挿入 #const LVM_INSERTCOLUMN $0000101B ; カラムを挿入 #const LVM_INSERTGROUP $00001091 ; グループを挿入 #const LVM_ENABLEGROUPVIEW $0000109D ; グループ表示にする #uselib "comctl32.dll" #func InitCommonControls "InitCommonControls" InitCommonControls winobj "SysListView32", "", 0, WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT, 320, 240 hList = objinfo(stat, 2) ; ウィンドウハンドル取得 sendmsg hList, LVM_ENABLEGROUPVIEW, 1, 0 ; wParamには真偽値、lParamには必ずnullを指定 ; 戻り値は以下参照 ; 0 すでに設定されている ; 1 正常に設定できた ; -1 失敗 text = "カラム" LVCOLUMN = $F, 0, 240, varptr(text), 0, 0 sendmsg hList, LVM_INSERTCOLUMN, 0, varptr(LVCOLUMN) sdim Header, 64 cnvstow Header, "グループ1" ; Unicode文字列にすること dim LVGROUP, 10 LVGROUP = 4*10, $11, varptr(Header), 64, 0, 0, 0, 0, 0, 0 ; 第一メンバはLVGROUP構造体のサイズ ; 第二メンバは設定するマスク ; 第三メンバはヘッダ文字列へのポインタ ; 第四メンバはヘッダ文字列の長さ ; 第七メンバはグループのインデックス sendmsg hList, LVM_INSERTGROUP, -1, varptr(LVGROUP) ; wParamにはグループを追加する位置、lParamにLVGROUP構造体のポインタを指定 ; wParamに-1を指定した場合、リストの最後に追加される ; 戻り値はグループが追加されたインデックス(失敗した場合は-1が返る) cnvstow Header, "グループ2" LVGROUP = 4*10, $11, varptr(Header), 64, 0, 0, 1, 0, 0, 0 sendmsg hList, LVM_INSERTGROUP, -1, varptr(LVGROUP) sdim text, 64 text = "アイテム1-1" LVITEM = $101, 0, 0, 0, 0, varptr(text), 64, 0, 0, 0, 0, 0, 0 ; 最低限のLVITEM構造体のメンバに加えて、第十一メンバにグループのIDを指定 ; 第一メンバ(maskメンバ)にiGroupID($100)を加えることも忘れずに sendmsg hList, LVM_INSERTITEM, 0, varptr(LVITEM) text = "アイテム1-2" LVITEM = $101, 0, 0, 0, 0, varptr(text), 64, 0, 0, 0, 0, 0, 0 sendmsg hList, LVM_INSERTITEM, 0, varptr(LVITEM) text = "アイテム2-1" LVITEM = $101, 0, 0, 0, 0, varptr(text), 64, 0, 0, 0, 1, 0, 0 sendmsg hList, LVM_INSERTITEM, 0, varptr(LVITEM) text = "アイテム2-2" LVITEM = $101, 0, 0, 0, 0, varptr(text), 64, 0, 0, 0, 1, 0, 0 sendmsg hList, LVM_INSERTITEM, 0, varptr(LVITEM)
さらに高度な設定をしたいのであれば、先に挙げたMSDNのページなどで調べてみてください。
ただ、日本語の資料はまったくと言っていいほど存在しないので、英語を読む覚悟はしておいてください。



ぽこみち

リンク

2008/6/19(Thu) 19:16:24|NO.16833

いつもありがとうございます。
私も随分検索したのですが、さっぱり分かりませんでした。
以前、日本語版のMSDNは痒い所に手が届かない事が度々あって、見向きもしてませんでした。
英語版と日本語版で違うとは思っても見ませんでした。
考えてみれば当たり前のことですが、提供元の本家を探す事が一番の近道ですね。

英語は苦手な部類ですが、翻訳サイトと辞書でなんとか調べてみます。
色々と勉強になりました。ありがとうございました。



New Monkey

リンク

2008/6/19(Thu) 23:06:44|NO.16844

カラムに▲▼記号を表示させる

前に作ったのがあったので投稿
汚いですが


#uselib "user32.dll" #func global SendMessage "SendMessageA" sptr,sptr,sptr,sptr #const WS_CHILD $40000000 #const WS_VISIBLE $10000000 #const WS_BORDER $00800000 #const LVS_REPORT $00000001 #const LVM_INSERTITEM $00001007 #const LVM_INSERTCOLUMN $0000101B #const LVN_COLUMNCLICK $FFFFFF94 #const WM_NOTIFY $0000004E #module #const HDM_GETITEM $00001203 #const HDM_SETITEM $00001204 #const HDF_JUSTIFYMASK $00000003 #const HDF_STRING $00004000 #const HDF_SORTUP 0x0400 #const HDF_SORTDOWN 0x0200 #const HDI_FORMAT $00000004 #const LVM_GETHEADER $0000101F #const HDM_GETITEMCOUNT $00001200 #deffunc ListViewSetSortMark int hlv, int icol, int dir SendMessage hlv, LVM_GETHEADER, 0, 0 hhdr = stat //ヘッダのハンドル SendMessage hhdr, HDM_GETITEMCOUNT, 0, 0 ccol = stat //カラムの数 dim hdi, 11 //HDITEM hdi(0) = HDI_FORMAT //mask //前回のマークを消去 repeat ccol SendMessage hhdr, HDM_GETITEM, cnt, varptr(hdi) hdi(5) = hdi(5)&HDF_JUSTIFYMASK|HDF_STRING&(HDF_SORTDOWN^-1)&((HDF_SORTUP^-1)) //fmt SendMessage hhdr, HDM_SETITEM, cnt, varptr(hdi) loop //マークを表示 SendMessage hhdr, HDM_GETITEM, icol, varptr(hdi) switch dir case 1 hdi(5) = hdi(5)&HDF_JUSTIFYMASK|HDF_STRING|HDF_SORTUP //fmt SendMessage hhdr, HDM_SETITEM, icol, varptr(hdi) swbreak case -1 hdi(5) = hdi(5)&HDF_JUSTIFYMASK|HDF_STRING|HDF_SORTDOWN //fmt SendMessage hhdr, HDM_SETITEM, icol, varptr(hdi) swbreak swend return #global winobj "SysListView32", "", 0, WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT, 600, 400 hlv = objinfo(stat, 2) repeat 3 text = "カラム"+(cnt+1) LVCOLUMN = $F, 0, 200, varptr(text), 0, 0 sendmsg hlv, LVM_INSERTCOLUMN, cnt, varptr(LVCOLUMN) loop oncmd gosub *OnNotify, WM_NOTIFY stop *OnNotify dupptr NMHDR, lParam, 12 if (NMHDR(0)=hlv)&(NMHDR(2)=LVN_COLUMNCLICK) { dupptr NM_LISTVIEW, lParam, 12+32 icol = NM_LISTVIEW(4) if icol=sortcol { sortdir *= -1 } else { sortdir = 1 } sortcol = icol ListViewSetSortMark hlv, sortcol, sortdir } return



ぽこみち

リンク

2008/6/19(Thu) 23:58:55|NO.16849

今ちょうど、XPのコモンコントロールには標準でこの機能が付いているんじゃないか、と妄想しながら
HDF_SORTDOWN、UPの定数等調べていた所です。

この辺の情報って凄く少なくて滅入ってました。今からじっくり眺めてみます。
為になる情報ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.