• ベストアンサー

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

リストビューを使ったプログラムで、以下の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さんの言われる空白文字を足すという案を考えて見ます。

関連するQ&A

  • リストビューのスクロール

    お世話様です。 C#.NET(1.1)でプログラミングしています。 リストビューですが以下の設定を行っています。 CheckedBox=true View=List MultiSelect=true Scrollable=true ※カラム関係は何も設定してません。 この設定で、アイテムをどんどん追加していき、ListViewの最大高さまで アイテムが埋まると、水平スクロールが表示され2列目が表示されるのですが、これを垂直スクロールで下に追加という形をとりたいのですが、 どうしたらいいのかわからないです。 (なぜCheckListBoxにしないのかというのは、複数選択ができないからです。) ご存知の方、ご教授願います。(××)

  • リストビューのスクロールについて

    VC.NET MFC でリストビュー(CListCtrl)を使用しています。 そのリストビューにある垂直スクロールバーを操作しても、 PreTranslateMessage()になにもコマンドが送られてきません。 ・・・(1) また、LVN_BEGINSCROLLのハンドラを追加してみたんですが、 コンパイル時にLVN_BEGINSCROLLを認識してもらえません。 (コンパイルエラー) ・・・(2) いろいろ調べてcommctrl.hをインクルードしても 必要なDLL(Comctl32.lib ? Comclt32.lib)をプロジェクトに参加させても認識してもらえませんでした。 リストビューのスクロールバー操作時の処理をオーバーロードしたいのですが、できなくて困っています。 どのようにすればよろしいでしょうか? 助言のほどよろしくお願いします。

  • リストビューをスクロールさせるには

    フォームが表示されたあとリストビューを一番下までスクロールさせたいのですがどうすればいいのでしょうか?

  • リストビューのスクロールバーを非表示にしたい

    eMbedded Visual C++ 4.0 、MFC 、ダイアログベースでプログラミングをしています。 リストビューのスクロールバーを非表示にしてCListCtrl::Scrollを使い別のプログラムからスクロールさせたく、 「EnableScrollBarCtrl」や「ShowScrollBar」を使ってみたりしましたが非表示にできません。 リストビューのプロパティで「スクロールさせない」にチェックすると、CListCtrl::Scrollによるスクロールができなくなってしまいます。 非表示でCListCtrl::Scrollでスクロールできる方法をご存知でしたら教えてください。 なぜ別のプログラムでスクロールさせたいのかといいますと複数のリストビューを連動させてスクロールさせたいためです。 eMbedded Visual C++ 4.0はVC++6.0と似ているようですのでそのあたりに詳しい方アドバイスをください。

  • リストビューのスクロールバーについて

    いつもお世話になっております。 リストビューのスクロールバーについて教えて頂きたい事がございます。 ご教授よろしくお願いします。 リストビューにスクロールバーが表示されているのか?表示されていないのか?を判定する方法はありますか? よろしくお願いします。

  • Android ListViewで横一列で水平スクロールするリストの作

    Android ListViewで横一列で水平スクロールするリストの作り方。 マッピング用のlist.xmlにImageViewやTextViewを配置。 list.xmlのImageViewやTextViewへAdapterをセットしています。 生成されたListViewは通常このように表示される。 □ ▲ □ || □ ▼ しかし、今回解決したい問題は生成されたListViewの表示を以下にしたいのです。 □□□□ <======> 当方はListViewで横一列で水平スクロールするリストは無理なのか、可能なのかも分かっておりませんので、 「ListViewで横一列で水平スクロールするリストは無理だよ!」や 「ListViewで横一列で水平スクロールするリストはこう作ればいいよ」など、、 どんな情報でも構いませんので、どなたか、分かる方がいらっしゃいましたらご教授いただけませんでしょうか? 宜しくお願いいたします。

  • 水平スクロールから垂直スクロールへ変えたい

    いつもお世話になっております。 会社の同僚から質問があり、解決方法が分からなかったので、質問させて頂きます。 エクセルデータが100件ほど入ったフォルダがあるのですが、 それを開くとスクロールバーが水平方向のものしか表示されないそうです。 これでも特に問題は無いのですが、 使いづらいので垂直スクロールバーに変更したいとのことです。 ちなみに、試しで同様のフォルダを新規で作成したところ、 やはり水平スクロールバーが表示されるそうです。 又、こちらで類似の質問を発見し「アイコンの自動整列」にチェックを入れるという解決方法を試してみようとしたのですが、 なぜかその項目がグレーになっており、選択できませんでした。 長くなりましたが、この水平スクロールバーを垂直スクロールバー表示へ変更する方法はありますか? 宜しくお願い致します。

  • リストビューの表示開始行変更

    リストビューで垂直スクロールバーを使用せず、ボタンがクリックされた時に、ページ切り替えみたいな事をしたいのですが、どのようにしたらいいのでしょうか? Visual C++ 6.0 SP6 Windows XP Pro SP3 どなたか助言をお願いします。

  • 水平スクロールができない。

    hLB=CreateWindow ("LISTBOX",NULL,WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL|LBS_MULTIPLESEL,0,0,400,400,hW,NULL,hI,NULL); SendMessage(hLB,LB_SETHORIZONTALEXTENT,256,0); i=(int)SendMessage(hLB,LB_GETHORIZONTALEXTENT ,0,0); TextOut(hD,300,0,s,strlen(itoa(i,s,10))); (ただしchar s[99];と宣言されている) として200文字の文字列を200個リストボックスに格納すると 垂直スクロールバーはできるのですが水平スクロールバーができず水平方向にオーバーフローした文字を見るためのスクロールもできません。 しかしTextOutの結果は256になります。 どうすれば水平スクロールバーを出すことができ水平スクロールできるようになるのでしょうか。

  • 空のリストビューで1行おきに背景色を変える

    リストビューで1行おきに背景色を変えたくて、 http://homepage3.nifty.com/mitui707/VisualC/VClistview_color.html/ を参考にさせて貰らい、データを次々に追加していくと、サンプル通りに5行目の背景色と文字色は変わりました。 が、起動時の何もデータが無い状態の空のリストビューで1行おきに背景色を変えたいのです。 色々と試してますが、まだ初心者のため間違っているのかうまくいきません。 どなたか助言をお願いします。 VC++6.0を使用しています。