スクロールするには?


エリック・プランクトン  2005-04-25 20:58:17  No: 57176

ダイアログベースで水平スクロールを使いたいのですがバーしか動かないで画面が左右に移動しません。どうすればいいでしょうか?誰か教えてください!


REE  2005-04-25 23:14:58  No: 57177

スクロールバーを単に貼り付けても何も起こらないので、
操作したときに、画面がスクロールするように自分で書いてください。


エリック・プランクトン  2005-04-25 23:39:53  No: 57178

すいません、説明不足でした。
色々なサイトでソースを見て試したのですが、どれもバーしか動きませんでした。ソースわかる人いませんか?


huruya  2005-04-26 00:55:36  No: 57179

バーしか動かないってどういうことですか??
バーが動けば正しく動いていると思うのですけど。。

水平スクロールが機能することにより何をしたいのかが
わからないので、その部分を明確にした方がソースを
提示しやすいかと思います。


REE  2005-04-26 02:05:38  No: 57180

>すいません、説明不足でした。

まだ、説明がかなり不足しています。

>色々なサイトでソースを見て試したのですが、どれもバーしか動きませんでした。ソースわかる人いませんか?

少なくとも、あなたが試した「バーしか動かない状態」を、他の人が再現できるぐらいの説明が必要です。


PATIO  2005-04-26 02:08:27  No: 57181

参考にしたソースの提示も無い様なので答えようが無いような。
基本的にスクロールバーが制御してくれるのはスクロールバー自身の挙動だけです。
実際にコントロールやら画像やらをスクロールするための操作は、
自分で記述して動作させないと駄目です。
単純にダイアログにスクロールバーを載せれば、他のコントロール等も自動で
スクロールしてくれると考えているのであれば、それは間違いです。
結局、ソースの提示が無いので想像で書くしかありません。
きわめて効率が悪いと思いますので解決のためには適切なソースの提示が必要だと考えてください。


エリック・プランクトン  2005-04-27 02:26:05  No: 57182

BOOL CUKScrollBarDlg::OnInitDialog()
  {
    CDialog::OnInitDialog();
    ……

    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    // m_hscroll1はCScrollBarクラスの水平スクロールバー。ClassWizardで設定する
    m_hscroll1.SetScrollRange(-20, 20);
    m_hscroll1.SetScrollPos(0);
  
    return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
  }

これでスクロールバーの左端が-20、右端が20となり、初期位置は0(つまりスクロールバーの中央)に設定される。
スクロールバー上でスクロールボックスをドラッグさせたり、両端の矢印をクリックするなどしてスクロールを実行すると、親ウィンドウにWM_HSCROLLメッセージ(垂直スクロールバーの場合はWM_VSCROLL)が送られる。親ウィンドウのOnHScrollハンドラをカスタマイズすることで、このメッセージを取得、操作することができる。 
  void CUKScrollBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  {
    // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
    int iPos = pScrollBar->GetScrollPos();
    int iMin, iMax;
    pScrollBar->GetScrollRange(&iMin, &iMax);

    switch(nSBCode) {
    case SB_LINELEFT:    // 左端の矢印をクリックした場合(または←キー)
      iPos--;
      if( iPos < iMin )
        iPos = iMin;
      break;
    case SB_LINERIGHT:    // 右端の矢印をクリックした場合(または→キー)
      iPos++;
      if( iPos > iMax )
        iPos = iMax;
      break;
    case SB_PAGELEFT:    // スクロールボックスの左側をクリックした場合(またはPageUpキー)
      iPos -= 10;
      if( iPos < iMin )
        iPos = iMin;
      break;
    case SB_PAGERIGHT:    // スクロールボックスの右側をクリックした場合(またはPageDownキー)
      iPos += 10;
      if( iPos > iMax )
        iPos = iMax;
      break;
    case SB_THUMBPOSITION:    // スクロールボックスを絶対移動させた場合
    case SB_THUMBTRACK:    // スクロールボックスをドラッグ移動させた場合
      iPos = nPos;
      break;
    }

    pScrollBar->SetScrollPos(iPos);

    // デフォルトの処理は実行せずにコメント化する
    // CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
  }

遅れて申し訳ないです。このソースで試してみたら、バーしか動きませんでした。


REE  2005-04-27 02:52:35  No: 57183

>遅れて申し訳ないです。このソースで試してみたら、バーしか動きませんでした。

バー以外を動かす記述はどこにあるんですか?
もしないのであれば、当然動きません。


みい  2005-04-27 03:09:40  No: 57184

ダイアログベースにこだわらなくていいなら、画面スクロールに限ればSDI&CFormViewで簡単にできるのにね。


PATIO  2005-04-27 21:54:36  No: 57185

これって文字通りスクロールバーの制御をしているだけです。
前にも書いていますが、動かしたい対象を動かすのはプログラマの仕事です。
動かしたいものがコントロールであれば、そのコンロトールにMoveWindow等を
使って動かす必要があるでしょうし、対象が画像なら必要な分だけ基準位置を
ずらして描画するためのコードを自分で書かなくては駄目です。


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

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






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