|
|
2008/6/15(Sun) 19:56:32|NO.16760
1.winobjにてリストビューを実装したのですが、カラムをクリック時にソートさせる機能などを実装した時の
カラムに"▲""▼"このような(bmpですか?)記号を表示させるにはどうしたらよいのでしょう?
英語圏のソフトでも記号が出るので、カラム名にbmpでも仕込んでいるのか、はたまたwindowsに実装されている
標準機能なのか?
2.ウインドウメッセージLVS_EDITLABELSにてアイテムの編集を行う時、指定したカラムのリストのみ編集可にするにはどうするのか?
3.リスト内にセパレータのようなものは作れるのか?例えばカラム関係なしに1行適当な文字列を表示させる選択は不可です
以上を実現できる方法を教えてください。宜しくお願いします。
|
|
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つ設置して全項目編集可、グループ項目の文字用テキストの下に更に、アイテムリストを追加していく形で
出来そうな気がするのでなんとかやってみます。
|
|
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は痒い所に手が届かない事が度々あって、見向きもしてませんでした。
英語版と日本語版で違うとは思っても見ませんでした。
考えてみれば当たり前のことですが、提供元の本家を探す事が一番の近道ですね。
英語は苦手な部類ですが、翻訳サイトと辞書でなんとか調べてみます。
色々と勉強になりました。ありがとうございました。
|
|
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の定数等調べていた所です。
この辺の情報って凄く少なくて滅入ってました。今からじっくり眺めてみます。
為になる情報ありがとうございました。
|
|