view)でカラムヘッダを表示しない。デフォルトでは表示される。カラムヘッダにボタンのような動作をさせない。view)でカラムをクリックしても、ソートなどの動作をしないときに使用します。コントロールがフォーカスを失っても選択したアイテムが強調表示されるようにする。いちどにひとつのアイテムしか選択できないようにする。デフォルトでは複数のアイテムを選択できる。アイテムの文字列で昇順にソート。アイテムの文字列で降順にソート。当然ながら、LVS_ICON、LVS_LIST、LVS_REPORT、LVS_SMALLICONは同時には指定しません。4つの表示スタイルのうちどれかひとつを指定します。style)というものがあります。アイテムにチェックボックスを付けたり、アイテムの選択状態を行全体の強調表示で表したい場合は、拡張スタイルを使って指定します。拡張スタイルの指定は、ダイアログプロシージャ内のWM_INITDIALOGメッセージが来たところで実行しています。拡張スタイルの指定ばかりでなく、リストビューではユーザのいろいろな操作に反応する必要もあるので、dialogSetDlgprocTxpcode関数でダイアログプロシージャを設定します。サンプルマクロでは、main関数内で、この他にリストビューで表示するもとのデータとなるテキスト(タブ区切りの文字列)を用意したり、リスト操作用のボタンを付けたりしています。リストビューの初期化このままではリストビューにはなにもアイテムがない状態なので、ダイアログの初期化の段階(ダイアログプロシージャ内でWM_INITDIALOGが来たとき)でリストビューの内容も初期化します。もととなるデータは、(TX-Cらしく)タブ区切りのテキストとして用意しています。APIを使用して進めていきますが、ここではテキストをもとに一連の作業を自動的に行う関数、listviewInitFromTextを作成し、それを呼び出しています。*text);タブ区切りテキストでリストビューを初期化します。カラムヘッダが表示されるリストビューでは、テキストの1行目はヘッダとして解釈されます。チェックボックス付きのリストビューでは、テキスト行末の桁情報はチェックボックスの真偽値として扱われます("1"ならば真、"0"ならば偽)。リストビューにチェックボックスをつけてみる。0と#endifで挟まれている部分は、このままではコンパイルされません。1と書き換えることでコンパイルされるようになります。この部分では、前述の拡張スタイルを指定して、リストビューにチェックボックスを追加しています。チェックボックスがある場合と、ない場合とでコンパイルして、listviewInitFromText関数がテキストの最後の桁の解釈を変えるのを確認してみてください。リストビューの拡張スタイルには他に以下のようなものがあります。リストビュー内のチェックボックスを有効にする。アイテムのチェックボックスの状態を知るにはListView_GetCheckStateを使用します。アイテムが選択されたときに、アイテムとそのサブアイテム全体が強調表示されます。view)でのみ有効です。アイテムとサブアイテムの周囲にグリッド線を表示します。view)でのみ有効です。ドラッグ&ドロップでカラムヘッダのカラムの順番を入れ替えることができるようにします。view)でのみ有効です。ユーザがアイテムをクリックしたときに、親ウィンドウにLVN_ITEMACTIVATEメッセージを送ります。このスタイルではリストビューのホット・トラッキングが有効になります。ホバー選択を有効にします。ユーザがアイテムをダブルクリックしたときに、親ウィンドウにLVN_ITEMACTIVATEメッセージを送ります。このスタイルではリストビューのホット・トラッキングが有効になります。tracking)というのは、カーソルがアイテムの上に来たときに、選択状態とは別に、アイテムを強調表示することをいいます。selection)ともいいます——というのは、カーソルがアイテム上で一定時間静止していたときに自動的にアイテムを選択状態にすることをいいます。WM_INITDIALOGメッセージでは、この他に、ダイアログのカスタムデータの受け渡しや、作業用のテキストのオープンをしています。作業用のテキスト変数は、static変数にしなければいけないことに注意。このテキストはダイアログが閉じられるとき(WM_DESTROY)にいっしょにクローズしています。リストビューのアイテムの操作サンプルマクロは、ボタンを押すことでリストビューに対して、簡単な操作ができるようになっています。アイテムの上下への移動は、いったんアイテムの内容を作業用のテキストに書き出してから、そのアイテムを削除し、リストのひとつ上(またはひとつ下)の位置にそのアイテムを挿入する、という処理で実現しています。APIのListView_DeleteItem関数をそのまま利用していますが、アイテムの内容の取得と挿入では、アイテムの内容をタブ区切りでテキストに書き出すlistviewOutputItemText関数と、タブ区切りのテキストの内容をアイテムに出力するlistviewSetItemFromText関数とを作成して使用しています(作業用のテキストを用意しておいたのはこのためです)。API)リストビューからアイテムを削除します。成功したらTRUEを、失敗したらFALSEを返します。*text);リストビューのアイテムの内容をタブ区切りの文字列にしてテキストに挿入します。チェックボックスがついたリストビューでは、最後にチェックボックスの真偽値が出力されます。*text);テキストのカーソル位置の段落をタブ区切りのデータとみなしてリストビューにアイテムを挿入します。挿入したカラム数を返す。チェックボックスがついたリストビューでは、最後のアイテムはチェックボックスの真偽値として扱われます。hwndリストビューのハンドルindexアイテムを挿入する位置textデータのあるテキスト選択したアイテムを上に移動する処理は次のようになります。しているところと、アイテムを選択状態にするために呼び出しているListView_SetItemState関数の引数の後半でしょう。これはAPIの仕様がそうなっているので仕方ないのですが、どちらも使い方が直感的でないので、はじめは戸惑うところです。API)リストビューから特定の属性を持つアイテムを探します。アイテムが見つかったらその位置を、見つからなければ-1を返します。hwndリストビューのハンドルiStart検索を開始するアイテムの位置。最初のアイテムも条件にマッチするようにするには-1を指定します。ここで指定したアイテム自身は検索の対象になりません。flags検索するアイテムの位置や、状態。これは以下の値(一部)からひとつ以上を組み合わせて指定します。API)リストビューのアイテムの状態を変更します。hwndリストビューのハンドルiアイテムの位置。このパラメータに-1を指定すると、状態の変更はすべてのアイテムに適用されます。stateアイテムの新しい状態を指定します。maskパラメータで有効となる値を指定します。maskパラメータで指定されていない値は無視されます。下位バイトにはアイテムの状態を指定します。これは次の値(一部)からのひとつ以上の組み合わせです。LVIS_FOCUSEDアイテムがフォーカスを持ちます。複数のアイテムを選択できる場合でも、フォーカスを持つアイテムはひとつだけです。LVIS_SELECTEDアイテムが選択されます。(上位バイトにはリストビューのイメージリストについての指定が入るのですが、ここではアイコンは使わないので割愛します。)maskセットしたい、または無効にしたいstateパラメータの値を指定します。アイテムの追加、削除の処理もこれらの関数の組み合わせです。アイテムの追加の部分では、コードを簡潔にするために、決められたアイテムを決められた位置(リスト末尾)にしか追加できませんが、ダイアログを表示してアイテムの内容をユーザに入力させたり、現在選択されている位置に挿入するような動作に変更することもできるでしょう。リストビュー全体の内容の取得ユーザがいろいろとリストビューを操作して、最終的にダイアログの[OK]ボタンを押すと、リストビューの内容を、初期化の際に使ったテキストに書き出すようにします。ここでは、listviewOutputTextという関数を作成して呼び出しています。テキストに出力されたデータは、初期化のときと同様、タブ区切りになっています。あとは、TX-Cのテキスト操作用APIを使用してテキスト上のデータを処理していけばいいわけです(サンプルマクロでは、ただ単にそのテキストを表示するだけですが)。*text);リストビューの内容をタブ区切りでテキストに出力します。カラムヘッダが表示されている場合は、テキストの1行目はヘッダ名になります。チェックボックス付きのリストビューの場合は、行の末尾にチェックボックスの真偽値が追加されます。hwndリストビューのハンドルtext内容を出力するテキスト。リストビューでのその他の処理ここまでで説明できなかった関数や、サンプルマクロに含まれていながらデモでは使われていない関数などについての解説です。リストビューを使うときには、ここで書いてあるような処理を行う必要があることも多いでしょう。アイテムの総数の取得ListView_GetItemCount関数を使うと、リストビューにあるアイテムの総数を取得できます。API)リストビューのアイテム数を取得します。hwndリストビューのハンドルリストビューのアイテム数を返します。アイテムの文字列の取得・設定これまで出てきた関数を使用すれば、作業用テキストにアイテムの内容を挿入することでアイテムの文字列を知ることはできますが、それでは非効率的ですし、面倒ですので、アイテムの文字列を取得するためのAPIを紹介しておきます。API)リストビューのアイテムまたはサブアイテムの文字列を取得します。viewでの桁位置に相当します)。アイテムの文字列を取得する場合はここには0を指定します。pszTextアイテムまたはサブアイテムの文字列を受け取るバッファへのポインタcchTextMaxバッファのサイズ反対に、アイテムに文字列をセットするときには、ListView_SetItemText関数を使います。API)リストビューのアイテムまたはサブアイテムの文字列を変更します。viewでの桁位置に相当します)。アイテムの文字列を変更する場合はここには0を指定します。チェックボックスの状態の取得・設定これまで出てきた関数を使用すれば、作業用テキストにアイテムの内容を挿入することでチェックボックスの状態を知ることもできますが、それでは非効率的ですし、面倒ですので、チェックボックスの状態を取得するためのAPIを紹介しておきます。API)アイテムのチェックボックスの状態を取得します。LVS_EX_CHECKBOXES拡張スタイルが指定されているリストビューでのみ使用します。チェックが入っているかどうかを返します。hwndLVリストビューのハンドルiIndexチェック状態を調べるアイテムの位置では逆に、アイテムのチェック状態を設定するにはどうするかというと、ListView_SetCheckState関数が用意されて......ないんです。SDKのドキュメントには、たしかにListView_SetCheckStateという名前は出てくるのですが、ただ単に「アイテムのチェックボックスの状態を設定するには、以下のようなマクロを使いなさい」と、そのマクロの定義が書かれているだけで、なぜかヘッダファイルには記述されていません。仕方ないので、SDKドキュメントに書かれているとおり、マクロをコードの先頭で定義します。fCheck);アイテムのチェックボックスの状態を設定します。カラムの幅を指定するサンプルマクロでは、各カラムの幅は関数任せにしていましたが、じっさいには初期化時にカラムの幅を調節しておきたいというのが普通です。そのために、listviewSetColumnWidthという関数が、サンプルマクロに含まれています。この関数はじっさいには使われていませんが、WM_INITDIALOGメッセージのところでカラムの幅を調節するようにマクロを書き換えて、その動作を確認してみてください。widthArr[]);リストビューのカラムの幅を調節します。hwndリストビューのハンドルwidthArrカラム幅を指定した数値の配列。幅はリストビューの幅に対する百分率で指定します。配列の最後には0を指定します。配列を最後まで読んだ時点でまだカラムが残っている場合、残りのカラムは幅が自動的に調節されます。サンプルマクロで最初と2番目のカラムでリストビュー全体の半分を占めるようにしたい、といった場合、次のようなコードを追加することになります。じっさいにリストビューを使うサンプルマクロで使用している関数を再利用することで、簡単なリストビュー・コントロールを少ない手間で実装できるようになります。サンプルマクロの関数定義をコピーして、リストビューを付けようとしているマクロのソースファイルにペーストしてしまえば手軽です。main」と書かれている行の直前までが、リストビューを使うために作った、ここで紹介している関数群の実体です。この部分は、そっくりあなたのマクロに貼り付けて利用してしまって構いません。関数の性能に不満を覚えたら、その関数のコードを変更して、自分のマクロに取り込めばよいでしょう。APIを駆使していくことになります。Library)などでリストビューについての情報が得られます。SDKレベルでのプログラミングについて解説しているWebサイトなども、ひじょうに参考になるでしょう。長文で薄いうえに、対象の限られた情報ながら、このページがだれかのお役に立つことを願います。APIの解説にはそうであることを明記した。ListView_GetItemCount、ListView_GetItemText、ListView_SetItemTextの解説を追加。その他記述の見直しなど。2001-12-23公開。Voiceよりお寄せください。