リストビューコントロールの水平スクロールバーを常に非表示にするには?

解決


kona  2010-08-31 23:30:25  No: 71909

VC6.0、WindowsXpです。

ダイアログにリストビューコントロールを作成したのですが、
挿入したアイテムの文字数が一定数を超えると自動的に水平スクロールバーが表示されます。
この水平スクロールバーを常に非表示にしたいのですが、どうしたら良いのでしょうか?

宜しくお願い致します。


仲澤@失業者  2010-09-01 00:08:31  No: 71910

レポートスタイルのリストコントロールのお話だと仮定すると。
水平スクロールバーが出る条件は
1.各カラム幅の合計がリストコントロールのクライアント幅を超えて
    いる場合
ですね。
ShowScrollBar( SB_HORZ, FALSE);
で一応消せますが、何らかの再描画などのタイミングで、
また表示されてしまいます。なかなかしつこいです。


kona  2010-09-01 00:50:40  No: 71911

仲澤@失業者さん

回答ありがとうございます。

>レポートスタイルのリストコントロールのお話だと仮定すると。
そうです。レポートスタイルです。

再描画というのはOnPaintのことで良いのでしょうか?
とりあえず、OnPaint内を以下のようにしてみると
常に非表示になりました。

void CxxDlg::OnPaint() 
{
  if (IsIconic())
  {
    CPaintDC dc(this); // 描画用のデバイス コンテキスト

    SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

    // クライアントの矩形領域内の中央
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2;

    // アイコンを描画します。
    dc.DrawIcon(x, y, m_hIcon);
  }
  else
  {
    CDialog::OnPaint();
  }

  m_List.ShowScrollBar( SB_HORZ, FALSE );
}

※m_List → CListCtrl


仲澤@失業者  2010-09-01 02:10:10  No: 71912

親がDLGの場合、リサイズされないのでうまく動作していると
考えられます。サイズ変更可能なウインドウに貼り付けた
場合は、他にも配慮しなければいけないことに注意してください。


maru  2010-09-01 04:17:41  No: 71913

> 親がDLGの場合、リサイズされないのでうまく動作していると
> 考えられます。サイズ変更可能なウインドウに貼り付けた
> 場合は、他にも配慮しなければいけないことに注意してください。
リサイズした場合にもペイントメッセージは発行されると思いましたが...

それより
> 水平スクロールバーを常に非表示にしたいのです
どういう意味があるか興味があります。
一定以上は見えなくてもいいってこと?
デフォルトの動作はMicrosoftがそれが標準的な動作だと考えているもの
です。その動作を変える場合、本当にそれでよいか再検討してみること
をお勧めします。


仲澤@失業者  2010-09-01 18:39:46  No: 71914

>リサイズした場合にもペイントメッセージは発行されると思いましたが...

自分で試した時のこと、バーが一瞬表示されてしまうのです。
WM_PAINTのタイミングでは、既に遅い場合があるようです。
サイズ変更が1度だけなら気にならないのですが・・・。

>どういう意味があるか興味があります。

同じく(vv;)。自分が水平スクロールバーを非表示にしたかった
ケースというのは、リストボックスの様にリストコントロールを
使いたかった時で、左右に2列並べたコントロール間をドラッグ
して、両者の幅を変更できるというものでした。全て表示したければ
幅を変更すればよいので、原理的に、常に全てが表示されている
必要がないケースで、むしろスクロールバーが邪魔になる場合といえます。


kona  2010-09-01 19:31:30  No: 71915

maruさん、仲澤@失業者さん

回答ありがとうございます。

>どういう意味があるか興味があります。

この画面(プログラム)はPC上で使用するものではありません。

画面上にあるリストはタッチパネルで選択できるようになっています。
しかし、タッチパネルの画面が小さく、性能もそこまで高くはありません。
そのためスクロールすることがおそらく出来ません。

リストに表示する項目はユーザにより異なります。
ユーザによっては水平スクロールバーが表示される可能性があります。
水平スクロールバーが表示されているのにも関わらずスクロールできない、
というのは問題だそうです。

カスタマイズの際に表示する文字数の制限をきつくする手もありますが、
いかんせん画面が小さいので別の問題があります。

ハード的な問題な感じもするのですが、
ソフトで解決した方が安く済みますからね。
(そもそも大した問題ではありませんが)

ありがとうございました。
また宜しくお願い致します。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加