1

ダイアログ ベースの MFC アプリケーションで CScrollBar から派生するクラスを設計します。ダイアログ クラス (MyScrollbarDlg) で、ON_WM_VSCROLLメッセージを設定し、ヘッダー ファイルでOnVSCrollメソッドを宣言します。また、対応する .cpp ファイルに OnVScroll() メソッドを実装します。しかし、驚いたことに、スクロールバーの一番下にある矢印をクリックすると、最初にしか機能しませんでした。

コードをデバッグしたいので、OnVScroll メソッドにブレーク ポイントを設定します。その後、奇妙なことが起こりました。ブレークポイントは最初のクリックでしか到達しませんでした。続行すると、スクロールバーがダイアログから消えました! これがどのように起こるかわかりません。この迷惑なバグを修正するのを手伝ってくれる人はいますか? どうもありがとうございました!

以下のようにスクロール範囲を設定しました。

  SCROLLINFO scrllInfo;
  m_scrollbar.GetScrollInfo(&scrllInfo, SIF_ALL);
  scrllInfo.nMax = 15;
  scrllInfo.nMin = 0;
  scrllInfo.nPage = 0;
  scrllInfo.nPos = 0;
  m_scrollbar.SetScrollInfo(&scrllInfo, TRUE);

ところで、私はダイアログの埋め込みスクロールバーを使用しませんが、ダイアログのメンバーに設定されたスクロールバー コントロールを使用します。

いくつか実験を行ったところ、前述の問題は、スクロールバー コントロールの下部にある矢印をクリックしたときにのみ発生することがわかりました。他の矢印をクリックするか、スクロールボックスをドラッグするとうまく機能します。私が気付いていないスクロールバーの下矢印をクリックすると、何か違いがありますか?

スクロール メッセージが THUMBPOSITION または THUMBTRACK でない場合、メソッドのパラメーターnPosOnVScroll()使用されないことがわかりました。そこで、コードを次のように変更しました。

    int currPos = m_scrollbar.GetScrollPos(); m_scrollbar.SetScrollPos(currPos + 1,  TRUE);

今回は正常に動作しますが、ブレークポイントを設定すると、スクロールバーが再び消えました。なぜなのかご存知ですか?

4

1 に答える 1

1

スクロール範囲が設定されていることを確認してください。これを設定しない場合、メソッドは 1 回だけ呼び出されます。

行ったことがある...


{編集} 私は運が良かった

m_ScrollBar.SetScrollRange(min, max);

scrollinfo を設定するよりも。

保存する前にフラグ フィールドをチェックして、正しく設定されているかどうかを確認することをお勧めします。

また、あなたが電話をかけていることを再確認してください

m_ScrollBar.SetScrollPos(CurPos);

ボタンをクリックしたら位置を設定するには

于 2008-10-28T13:05:38.367 に答える