• ベストアンサー

ダイアログのスクロールバー

VC++6.0 MFC お世話になります。 メニューからモードレスダイアログを発生させてそこに文字列を書き出しているのですが、文字列が多い場合、入りきれません。そこでダイアログリソースに標準スクロールバーを付加させました。しかし、ソースが煩雑になっていきます。 調べてみれば、ウィンドウでは基本クラスをCScrollViewにすることにより、スクロールバーのメッセージ処理コードのを大半を肩代わりしてくれることを知りました。 そこで、ダイアログでもこのように便利なことはできないかと質問をした次第です。 できるのであれば、方針などを教えてください。 よろしくお願いします。

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

  • ベストアンサー
  • guccii
  • ベストアンサー率31% (14/44)
回答No.1

CScrollViewは、Document-View構造を前提としていますから、ダイアログにそのままでは適用できませんが、CWndを継承したクラスにCScrollViewから必要なコードを持ってきてCScrollWndみたいなくラスをつくってみては?MFCを使う場合には、ソースが公開されていますので、よくそんなことをやってました。 CScrollViewの  OnKeyDown  OnLButtonDown  OnRButtonDown  OnSize  OnHScroll  OnVScroll  OnMouseWheel とかのメッセージハンドラと  SetScrollSize  SetScrollTotalSize  SetScrollPageSize  SetScrollLineSize  GetScrollTotalSize  GetScrollPageSize  GetScrollLineSize  GetScrollPosition  ScrollToPosition  CenterOnPoint とかのメソッドぐらいをCWnd継承クラスに付加すれば、CScrollWndになりますよ。 ただ、MFCもそんなに再利用性の考慮されたソースではないので、細かな修正がちょこちょことめんどくさいですが... この場合めんどくさいのは、縦横のスクロールバーの表示/非表示によって描画領域の調整が必要なところがわかりにくい。 でも、ほんとにめんどくさいのは、スクロールバーとの連動よりも、テキストの描画ロジックだと思いますけど...。編集がなければそんなでもないですけどねぇ。テキスト処理に慣れてれば。 これを見て大変そうとか思うのなら、市販のコントロールとかを探して見たほうがいいかもしれません。

ion_2005
質問者

お礼

回答ありがとうございます。 確かに自分で作るのはめんどくさそうですね。 あまり時間がないので別の方法を採りたいと思います。 ただ、クラスを作る方針は勉強になります。 何かに生かしていければと思います。

その他の回答 (1)

  • yonfa
  • ベストアンサー率52% (22/42)
回答No.2

どのようなデザインのダイアログかわからないのでなんともいえませんが、コントロールがたくさん並んでいて、全体をスクロールするというのであれば、#1さんの言われるようにかなり面倒な実装になると思います。 メッセージボックスの延長みたいなものを作りたいのであれば、簡単にエディットコントロールを置くというのではどうでしょう?

ion_2005
質問者

お礼

回答ありがとうございます。 そう言われてみるとそうですね。 エディットコントロールに置くのが手っ取り早いですね。 何で気付かなかったんだろう・・・

関連するQ&A

  • 3つの水平スクロールバーの違いについて知りたいです。

    3つの水平スクロールバーの違いについて知りたいです。 僕は、VC++6.0でエディタを作ろうとしているWINAPI初心者です。 ダイアログボックスにリソースエディタで3つスクロールバーを配置しました。 しかし、どうすれば、それぞれのスクロールバーが動いたか知ることが出来ませんでした。 ネットで検索しても出てこないので、ここで質問させて貰いました。 よろしくお願いします。

  • ダイアログをスクロールさせるには

    MFCでウィンドウにダイアログボックスを張り付けた時に、 ダイアログボックスの表示させたい領域よりウィンドウサイズが小さい場合、 自動でスクロールバーを表示させるようにするにはどうすればいいのでしょうか? ダイアログで表示させたい領域を区切ってスクロール判断をさせるようにはできないのでしょうか?

  • テキストボックスとスクロールバー

     VC++ 2005 Express Edition を使用しています.  テキストボックスへの文字列の(末尾への)追加を下のように行っています. vvv this->textBox1->Text = this->textBox1->Text + "\r\n" + textBox2->Text; ^^^  追加を繰り返してテキストの行数がテキストボックスの高さを越えると右端にスクロールバーが出るのですか,上の方法で追加していくとスクロールバーがテキストボックスの上辺に付いたままで,追加しているテキストを確認できません(スクロールバーの長さは小さくなっているので,文字列が追加されている,ということは分かります).  テキストの行数がテキストボックスの高さ以上になったときに,スクロールバーをテキストボックスの下辺に付ける,ということはできるのでしょうか.

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

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

  • スクロールバーを短くする方法はありますか?

    エクセルの一番下のスクロールバーがすごく長くなっていて、つかみにくいのですが、短くする方法はありますか? すごく右側の列のどこかに何か値が入ってるのでしょうか? それがどこで何ていう文字なのかわかりません。 実際はY列までしかデータは入っていません。(そのつもりです)

  • リストコントロールのスクロールバーを操作無効にするには

    お世話になります、fujicafeと申します。 現在、VC++でMFCのダイアログベースのアプリケーションを作成し、そこでリストコントロールを配置させています。 リストコントロールは自動的に垂直方向のスクロールバーを表示させるようにしています。 そこで質問なのですが、現在、リストコントロールの垂直方向のスクロールをスクロールバーの操作ではなく、キー操作によって行おうと思っているのですがどのようにすればスクロールバーの操作を無効にできますでしょうか? ポイントとしては ・リストコントロールの自動的に表示させる垂直スクロールバーはそのまま表示させたい(スクロールバーは全体行での現在の行の位置を示すだけ) ・リストコントロールの垂直方向の移動はキー操作でしたい。 これを実現するには、やはりリストコントロールのスクロールバー表示を無しにし、別でスクロールバーを設置させるしか方法はないでしょうか? 現状で、キー操作でのリストコントロールのスクロールバーの操作は実現できていますので、出来ればリストコントロールのスクロールバーの操作の無効のみが出来ればいいなと思っております。 ご意見がありましたら、よろしくお願いいたします。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。

  • MFC ダイアログ上のID取得について

    VC++6.0 MFC ダイアログベースで開発しています。 リソースエディタで配置したダイアログ上にある全てのコントロール(ボタン、テキスト等)IDを取得する方法はありませんか? よろしくお願いします。

  • スクロールバーでのピクチャーコントロールやリストビューの移動

    お世話になります。 今回お聞きしたいことは MFCでダイアログ上にリストコントロールとスクロールバー、またはピクチャーコントロールとスクロールバーを設置した際に、スクロールバーの移動に伴って、リストコントロール内の列や、ピクチャーコントロールに表示されている画像の見えている箇所を移動させることが出来るかどうか。 です。 まだ、本格的にプログラムを作り始めてるわけではないのですが、事前にこのような動作が実現可能かどうかお聞きしたく、質問させて頂きました。 もしご存知の方がいましたら、参考になるHPや方法を教えていただければと思っています。参考になるHPがなくても、実現可能かどうかだけ教えて下さるだけでも結構ですので、宜しくお願い致します。 開発環境は Windows CE 6.0 Visual Studio 2005 です。

  • ダイアログの丸ごとコピー

    VC++6.0でMFCのプロジェクトを作っています。Aのプロジェクトで作成したダイアログを別のBプロジェクトで丸ごと(リソースもクラスも)コピーして利用することはできますか。出来るなら方法を教えてください。

  • TextBoxのスクロールバーの設定

    Visual Basic 2005 Express Editionでやっています。 TextBoxのScrollBarsを""Vertical"にすると、垂直スクロールバーが使えるのですが、これって、TextBoxに文字列を追加していくと、TextBoxの下の方に追加されていくんです。 そこで質問なのですが、常にTextBoxの一番上しか見れないので、追加されていった文字列の方を"常に"見たいのですが、どうやれば見れるでしょうか? コードでTextBoxの一番下を指定できたりするのでしょうか? ただ単に、下にスクロールすればいいというのは、ここでは省かせていただきますm(_ _)m