• 締切済み

MFCで水平スクロールバー

非常に初歩的な質問で申し訳ありませんが、Visual C++のMFCでメインのウインドウに水平スクロールバーを取り付けるにはどうすればできるのでしょうか?

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>ドキュメント/ビューアーキテクチャについて復習しました。 >これはウインドウのクライアント領域を操作するクラス(ビュー)と、そこに表示するデータを操作するクラス(ドキュメント)を明確に分ける事を言うようですが、 >この場合はどういう意味で破綻するということを意味しておられるのでしょうか? ドキュメントビューアーキテクチャーでは、各クラスがそれぞれの役割を担当することで、それぞれ他のクラスの状態に影響されること無く処理を記述することが出来ます。 特にこの場合は、ドキュメントは表示範囲の指定(ビュー)に全く影響を受けずに表示内容を出力する処理を記述することが出来ます。 しかし、 >画面を表示する際にスクロールバーの位置を取得して、 >スクロールバーが右側になっていれば画面の右側を >描画(描画開始位置を左にする)という処理にする。 となると、ビューやフレームの状態によって、ドキュメントが影響を受けてしまい、表示範囲を意識した出力を行わなければいけなくなります。 破綻とは、この部分を差します。 >ということはプロジェクトを最初から作り直さないと無理ということになるのでしょうか? CScrollViewはCViewの派生クラスですので、ウィザードによって作成されるコードはほとんどCViewのときと変わりません。 一部、スクロール範囲を指定するメソッドを呼んだりといった処理がウィザードによって追加されますが、たいした量ではありません。 一旦、ウィザードで 1.今までの設定(おそらくCView)でウィザードで新しいプロジェクトを作成する。(作成中のプロジェクトと同名で) 2.CScrollViewの設定で、ウィザードで新しいプロジェクトをもうひとつ作成する。 3.1と2で生成されたViewのソースの違いをチェックし、それを作成中のプロジェクトに反映する。 といった感じで平気です。

Rossana
質問者

お礼

回答ありがとうございます.お礼遅くなり,申し訳ありません. >>一旦、ウィザードで 1.今までの設定(おそらくCView)でウィザードで新しいプロジェクトを作成する。(作成中のプロジェクトと同名で) 2.CScrollViewの設定で、ウィザードで新しいプロジェクトをもうひとつ作成する。 3.1と2で生成されたViewのソースの違いをチェックし、それを作成中のプロジェクトに反映する。<< それを見比べた所 CView→CScrollViewに置き換えて void CMyView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); CSize sizeTotal; // TODO: このビューのサイズの合計を計算します。 sizeTotal.cx = sizeTotal.cy = 100; SetScrollSizes(MM_TEXT, sizeTotal); } を追加したのですが,エラーになってできませんでした.どこがいけないでしょうか?

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>cs.style = cs.style | WS_HSCROLL; > >を追加。 だめですよ。こんなやり方でスクロールバー表示させちゃ。 MFCのドキュメントビューアーキテクチャーが破綻します。 ウィザードの6/6で基本クラスをCViewをCScrollViewにするだけです。 これでスクロールバーが必要なときに表示されますし、内容も一緒にスクロールします。

Rossana
質問者

お礼

回答ありがとうございます。 >MFCのドキュメントビューアーキテクチャーが破綻します。 ドキュメント/ビューアーキテクチャについて復習しました。これはウインドウのクライアント領域を操作するクラス(ビュー)と、そこに表示するデータを操作するクラス(ドキュメント)を明確に分ける事を言うようですが、この場合はどういう意味で破綻するということを意味しておられるのでしょうか? >ウィザードの6/6で基本クラスをCViewをCScrollViewにするだけです。 >これでスクロールバーが必要なときに表示されますし、内容も一緒にスクロールします。 ということはプロジェクトを最初から作り直さないと無理ということになるのでしょうか?

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.2

> 一行だけで出すことができるとは。 標準的な部品のON/OFFの場合は、比較的簡単です。 > 通常のスクロールバーのように右へ行くと画面が変わるようにするにはどうすればいいのでしょうか? こうなると結構面倒で、 SetScrollRangeなどでスクロールバーの範囲、位置を定義してやる。 画面を表示する際にスクロールバーの位置を取得して、スクロールバーが右側になっていれば画面の右側を描画(描画開始位置を左にする)という処理にする。 MFCが提供してくれるのはあくまでも部品だけですので、その部品を使ってどう動作させるかはプログラムに書く必要があります。もっとも、極力簡単に書けるような部品が提供されてはいますが…。 > またこういうものはどうやって調べるといいのでしょうか? 基本はヘルプです。 読み方はコツがいりますが、MFCとかSDKとか書かれた項目を必要に応じて使い分けます。MFCとは?Win32SDKとは?という所まで理解していると、調べる速度がだいぶ変わってきます。 上記の「SetScrollRange」というキーワードが分かれば、webで「SetScrollRange サンプル」なんかでソースコードを検索してみるのも良いでしょう。 -- スクロールバーの振る舞いが極端に違うものとして、 [スタート]-[プログラム]-[Visual Studio]-[Microsoft Visual Studio 6.0 ツール]-[Zoomin] ってのがあります。 こちらは縦スクロールバーを拡大倍率の指定に使っていますね。

Rossana
質問者

お礼

回答ありがとうございます.Zoominというのがあるのを初めて知りました.こんな使い方もあるのですね!教えて頂いたやり方で調べたのですが,ソースコードはなかなか見つかりませんでした.

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

> メインのウインドウ どうやって作成するメインのウィンドウなのか不明なので、可能/不可能も回答しづらいのですが…。 [ファイル]-[新規作成] 「新規作成」ウィンドウ 「プロジェクト」タブ 「MFC AppWizard(exe)」選択 プロジェクト名:Test OK 「MFC AppWizard - ステップ1」ウィンドウ SDIを選択 終了、OK [表示]-[ワークスペース]のClassViewで、 Testクラス CTest01View::PreCreateWindowに、 cs.style = cs.style | WS_HSCROLL; を追加。 でOKなハズ。

Rossana
質問者

お礼

回答ありがとうございました。一行だけで出すことができるとは。恥ずかしや恥ずかしやf(^^;MFCの入門書は持っているのですが、書いてなくて分かりませんでした。 neKo_deuxさんのおかげで望みの水平スクロールバーは出せたのですが、右へスクロールしてもすぐに元に戻って右へ画面が移動してくれません。通常のスクロールバーのように右へ行くと画面が変わるようにするにはどうすればいいのでしょうか?またこういうものはどうやって調べるといいのでしょうか?

関連するQ&A