• ベストアンサー

リストビューの水平スクロール抑止と文字列の表示位置

リストビューを使ったプログラムで、以下の2点についてどうしていいか分からないので、どなたか助言をお願いします。 (1)可視領域を23行としたリストビューで、起動時はスクロールを水平・垂直ともに抑止しておきます。ボタンをクリックする度に1行ずつ0行に挿入し、データが24行以上で垂直スクロールを許可してるのですが、挿入した行に+1行が表示されてしまいます。GetItemCount()で調べてもやはり1行多く表示されてます。カスタムドローで交互に背景色を変えていますが、その行に背景色はありません。水平スクロールを抑止している事が原因でしょうか?スクロールの抑止は、以下を参考にさせて貰ってます。 http://homepage3.nifty.com/mitui707/VisualC/VClistview_op1.html/ (2)ヘッダ部の表示はセンタリング、アイテムは左寄せにしたいのですが、アイテムの左寄せをどのようにすれば良いのか分かりません。 ヘッダ部の設定 LVCOLUMN myColumn; myColumn.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT; myColumn.fmt = LVCFMT_CENTER; どなたか助言をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • norachlo
  • ベストアンサー率100% (10/10)
回答No.2

※注意:以下は『.NET』での事例です。 その他の環境下ではかえって実装が面倒かもしれません。 (2) に関して、以前に同じような状況に出くわしたことがあります。 その時は以下のように、二つのリストビューを用いてそれらしいものに仕上げました。 もし可能であれば参考になさって下さい。 スプリットコンテナを上下に分割し、それぞれにリストビュー(Details)を配置、 コンテナに合うようにドッキング。 下のリストビューのヘッダを消去(HeaderStyle を None)。 スプリットコンテナの境界線をできるだけ上に引き上げて、 上のリストビューのヘッダだけが可視の状態にする。 また、境界線を細くして固定、固定パネルを1に設定。 各列を移動したり、ユーザーが幅を変えることはなかったので、 上のリストビューの Enabled を False に。つまりヘッダは表示のみ。 後は上下のリストビューのカラムの設定を個別に変えれば、 ヘッダとアイテムで異なるテキストアラインの調整が可能に。 ただし、ヘッダ部分をユーザが操作する場合や、列数が途中で変更される場合、 水平スクロールがあるような場合だとそれらを吸収する処置が必要になります。

taka077
質問者

お礼

助言、ありがとうございます。m(_ _)m 確かにこの方法も有りですね!VC++はまだ始めたばかりですが、CとVBはそれなりにやって来ているので、この方法に気付くべきでした。(仕事の都合上、1年ほどプログラムから離れていたせいかも...。) 今回はリストビューにデータを表示するだけですので、この方法を試して見ます。 が、今後は列幅を変更したりする事があると思われるので、他の方法も考える必要はあると思います。

その他の回答 (1)

回答No.1

もう解決しているかもしれませんが、開発環境は何ですか。 また、MFCですか。 (1) 「1行多く」とは、空欄が入ってしまうのですか。 その1行は、どこに入りますか。 また、スクロールの抑止をやめた時(TRUEではなく、全部コメントアウトした時)、余分な行は入りますか。 (2) 時々、あちこちの相談サイトで同じ質問を見かけますが、正しいコードを見たことはありません。 自信ありげに「オーナードロー」と書いて、コードも構造体も提示しないようなのばかりです。 気になって調べてみましたが、私も結局わかりませんでした。 存知よりのへテランは、ひとこと、「できない」ですと。。。 どうしてもやるのなら、列幅をピクセル単位で取得することはできますから、ヘッダ文字列の先頭に空白文字を適当数足せば、センタリングらしく見せることはできます。

taka077
質問者

補足

回答、ありがとうございます。 まだ解決してませんです...。 (1) >「1行多く」とは、空欄が入ってしまうのですか。 >その1行は、どこに入りますか。  そうです。24行目のデータを挿入した時、垂直スクロールを許可しているのですが、同時に25行目に空欄が入ってしまいます。 >また、スクロールの抑止をやめた時(TRUEではなく、全部コメントアウトした時)、余分な行は入りますか。  23行目のデータを挿入した時、水平・垂直両方のスクロールバーが表示され(23行目の上に水平スクロールバーが表示されている)、余分な行は入りませんでした。 (2)  サンプルを入手したのですが、VC++を始めて1ヶ月に満たない私には、難しすぎて...。後輩の話では、CHeaderCtrlを取得して、ヘッダーのみオーナー描画すればと助言をくれたのですが、まだうまく動作出来てません。  最後は、turukame2005さんの言われる空白文字を足すという案を考えて見ます。