フォームに描画して表示をスクロールしたい

このQ&Aのポイント
  • 非.NETユーザーが.NETを勉強中です。フォーム上に描画を行いたいが、表示しきれない場合にスクロールバーを表示したいです。
  • HScrollBarを使用して描画を行うが、スクロールバーが効かない問題が発生しています。
  • 根本的にHScrollBarコントロールを使用できないのか、プロパティの変更が必要なのか、どうすればスクロールバーを表示できるのか分かりません。
回答を見る
  • ベストアンサー

フォームに描画して表示をスクロールしたい

非.NETユーザーだったのですが、.NETを勉強しています。 フォーム上に描画を行いたいのですが、下のモジュールを入力して、 実行した場合○と□が描画されます。 しかし、フォームの大きさ以上の描画をした場合に、表示しきれないので スクロールバーを表示したいと思っています。 HScrollBarをフォームに貼り付けてBottomに移動した後、 実行した所、描画は行われるのですがスクロールバーが効きません。 なんらかのプロパティを変更しなければならないのでしょうか。 それとも、この場合根本的にHScrollBarコントロールを使用できないの でしょうか。 Private Sub cmd描画_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmd描画.Click Dim g As Graphics Dim p As Pen Dim b As SolidBrush Dim r1, r2, r3 As Rectangle g = Me.CreateGraphics p = New Pen(Color.Red) b = New SolidBrush(Color.Blue) r1 = New Rectangle(10, 10, 50, 50) g.DrawEllipse(p, r1) r2 = New Rectangle(70, 70, 50, 50) g.FillRectangle(b, r2) r3 = New Rectangle(500, 10, 50, 50) g.DrawEllipse(p, r3) End Sub よろしくお願い申し上げます。

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

  • ベストアンサー
  • NYOI
  • ベストアンサー率58% (56/96)
回答No.2

補足があったことに今気がつきました(笑) 遅くなりましたが。 通常はスクロールイベントから移動量を取得し、移動させたいオブジェクトの座標からその移動量を引く…といった書き方でいいと思います。 ただ、移動したいオブジェクトが複数ある場合は、ひとつひとつ移動処理を書くのが面倒なので通常PictureBoxなどを使います。 下記例では、Form上にcmd描画ボタン、PictureBox1、HScrollBar1があり、PictureBox1の中にPictureBox2があるものとします。またPictureBox2はデフォルトで.visible=falseにしています。 なお、PictureBox2は、描写したいオブジェが全て収まるよう、あらかじめ大きなサイズにしておいてください。 Private Sub cmd描画_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmd描画.Click     'はじめから図形が描画されていてもいい場合は、わざわざこんな処理は要りません。    PictureBox2.Visible = True End Sub Private Sub PictureBox2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox2.Paint    'Paintイベントに描画処理を書くことで、Formが最小化されたり画面外に出た場合でも、描画したものが消えたりしません。    Dim g As Graphics = e.Graphics    Dim p As Pen    Dim b As SolidBrush    Dim r1, r2, r3 As Rectangle    p = New Pen(Color.Red)    b = New SolidBrush(Color.Blue)    r1 = New Rectangle(10, 10, 50, 50)    g.DrawEllipse(p, r1)    r2 = New Rectangle(70, 70, 50, 50)    g.FillRectangle(b, r2)    r3 = New Rectangle(500, 10, 50, 50)    g.DrawEllipse(p, r3)    p.Dispose()    b.Dispose() End Sub Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll    'スクロールした分、PictureBox2を左に動かします。    PictureBox2.Left = -e.NewValue End Sub

lancasters
質問者

お礼

ご回答有難うございます。お手間かけてすみません。 思い通りのスクロールが出来ました。 こちらを利用してみます。有難うございました^-^

その他の回答 (1)

  • NYOI
  • ベストアンサー率58% (56/96)
回答No.1

HScrollBarのScrollイベントにはどういうコードを書いているんですか?

lancasters
質問者

補足

ご回答有難うございます。 >HScrollBarのScrollイベントにはどういうコードを書いているんですか? あぁ…コードは全く書いていません。 書かなくても動作すると思い込みでした…。 お手間の掛からないコードでしたら書き込み願えますか。 よろしくお願い申し上げます。

関連するQ&A

  • VB2010で、2つめのフォームを表示させると、フォームを閉じるまで1

    VB2010で、2つめのフォームを表示させると、フォームを閉じるまで1つめのフォームの操作ができないのですが、どなたか解決方法を御存じないでしょうか。 よろしくお願いします。 Form1のピクチャーボックスに描いた折れ線グラフ上のカーソル(Form11)が、 マウスの動きに合わせてグラフ線上をたどっていくようにしようとしています。 【Form1のボタンを押すと2つめのフォームを呼び出す】 Dim Mark As New Form11 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 'グラフカーソル表示 Mark.Show() 【呼び出されたフォームのコード】 Imports System.Drawing Public Class Form11 Private Sub Form2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint 'フォームのクライアント領域のサイズを設定 Me.ClientSize = New System.Drawing.Size(20, 20) 'カーソルを描く Dim MarkPen As New Pen(Color.Red, 1) Dim g As Graphics = e.Graphics g.DrawEllipse(MarkPen, 0, 0, 20, 20) '円の描画 Me.TopMost = True '最全面 Me.TransparencyKey = Me.BackColor '透明色の設定 Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None '枠なし End Sub End Class

  • 表示済みの フォームに描画する方法?(VB2008)

    約40日余りのVB.NET 初学者です。 そこで、この間の学習で意図して出来なかった諸点について質問します。 課題: 表示済みの フォームに hello, world と描画する! フォームの Paint イベントハンドラで Font オブジェクトを生成して描画。 これは出来ました。 しかし、次の試みに失敗しました。 Private Sub btnUpdateGraphicsText_Click() Handles btnUpdateGraphicsText.Click   Dim msg As String = "hello, world!"   Dim aFont As New Font("Arial", 12)   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx End Sub 一体、どうしたら成功するのかがサッパリわかりません。 宜しくお願いします。

  • Labelの文字をスクロールする際にちらつきが・・・

    お世話になります。 フォームにあるラベルに文字を表示し、その文字をスクロールするプログラムを作成しました。 スクロールはできるのですが、スクロールする際に文字がちらついて(早い点滅のような感じ)しまいます。 どのようにすれば、ちらつきを無くすることができますか? よろしくお願いします。 (VB2008にて作成) Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Label1.Text = "文字のスクロール" 'タイマーのインターバルで文字の進む速度が決まります Timer1.Interval = 5 Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim objG As Graphics objG = Label1.CreateGraphics() 'ここで一旦クリアしないと真っ黒になります objG.Clear(Label1.BackColor) '左端を決めて、文字を描画する objG.DrawString(Label1.Text, Label1.Font, New SolidBrush(Label1.ForeColor), iLeft, 0) '左端をずらす iLeft += 1 If iLeft > Label1.Width Then '右端までいったら戻す iLeft = 0 End If objG.Dispose() End Sub

  • 描画した後での塗りるぶし VB

    丸を描画後にColorDialogで指定された色で丸の範囲だけ塗りつぶすというプログラムを作っているのですが、なかなかうまくいきません。 丸は、このように描画するようにしています。 Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove If (e.Button = MouseButtons.Left) Then Dim g As Graphics = PictureBox1.CreateGraphics() Dim ePos As MouseEventArgs PictureBox1.Refresh() g.DrawEllipse(New Pen(Color.Black, 2), Spos.X, Spos.Y, e.X - Spos.X, e.Y - Spos.Y) ePos = e g.Dispose() End If End Sub Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown If (e.Button = System.Windows.Forms.MouseButtons.Left) Then Spos = e End If End Sub VB2010を使っています。 どなたか教えていただけるとありがたいです。よろしくお願いします。

  • テキストボックスに描画

    テキストボックスの上でマウスを動かすと赤い線を描画するプログラムを書きました。 Private Sub TextBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseMove Dim g As Graphics = sender.CreateGraphics() g.FillEllipse(Brushes.Red, e.X, e.Y, 5, 5) End Sub この方法の場合、フォームが再描画されると書いたものが消えてしまいます。 再描画されても消えなくて、なおかつアプリケーションをいったん終了しても復元できる方法があれば、教えてください。

  • VB2008でフォームに文字列をスクロールさせたい

    VB2008でフォーム上に右~左にフェイドイン、フェイドアウトする 物を作ろうとしてるのですが、どうしてもわからないので書き込みしました。 フォーム1にテキストボックスとボタンがあり、 ボタンを押す事によりテキストボックスの文字列をフォーム2の画面上に 表示し、右~左(HTMLLで言うとキーマー)に動くようにしたいのですが 右からって事は一番右の値が+だと思うのですがフォーム2は大きさを自由に 変更できるので大きさをさらに大きくした場合途中で消えてしまいます。 あと、タイマーでするとタイマーが終わるまで実行できないので 文字が流れてる間もボタンを押す事にyの値を変えて、 複数実行させたいのです。 以下が試しに書いてみたプログラムです。 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim objG As Graphics objG = Form2.CreateGraphics() objG.Clear(Form2.BackColor) objG.DrawString(Text1.Text, Label1.Font, New SolidBrush(Label1.ForeColor), iLight, 50 + Form2.Width) iLight += -1 If iLight < -50 Then Timer1.Stop() End If objG.Dispose() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Interval = 1 Timer1.Start() End Sub すみませんがよろしくお願いします。

  • C# フォームサイズ変更で消えない描画の方法

    前略 ・C#の初心者です。 ・ボタンをクリックして作成した描画がウィンドウサイズを小さくして、再び元のサイズにした場合再描画されずに消えたまになってしまいます。消えない描画の方法をおしえてください。 ・下記はボタンをクリックするとピクチャーボックスに円を描くプログラムです。これだとウィンドウサイズを小さくしたあと、再びウィンドウを大きくしたとき円は消えたままです。 private void button1_Click(object sender, EventArgs e) { Graphics g = pictureBox1.CreateGraphics(); g.DrawEllipse(Pens.Black, 0, 0, 100, 100); } ・また下記はピクチャーボックスのペイントイベントを用いて円を描いたもので、フォームのサイズを小さくして円をかくした後フォームサイズを元にもどしても円は自動的に再描画されますが、プログラムが起動すると円が描画されてしまうプログラムです。 private void pictureBox1_Paint(object sender, PaintEventArgs e) {   Graphics g = e.Graphics; g.DrawEllipse(Pens.Black, 0, 0, 100, 100); } ★ ボタンをクリックすると円が描画され、ウィンドウを小さくして円を隠し、ウィンドウサイズをもとの大きさにもどした時自動的に再描画する方法をおしえてください。 以上、よろしくお願いします

  • VB.netで図形描画ができません^^;

    初心者質問で申し訳ないです。 VB.net(Visual Studio 2005)で図形描画を行っています。 ボタン押下で図形(四角形)を描画する方法は理解できたのですが 起動時に表示するほうほうが分かりません。 どなたか教えてもらえないでしょうか? Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim g As Graphics g = PictureBox1.CreateGraphics() g.DrawRectangle(Pens.Black, 100, 50, 100, 100) g.Dispose() End Sub 上記のようにLoadから読み込むようにしましたが描画されませんでした。 よろしくお願い致します><

  • 再描画すると消える

    ピクチャーボックスに以下のような図形を描画するプログラムを書きました。 (PictureBox1のBackGroundImageには最初から適当なイメージが設定されています。) Dim Grp As Graphics Grp = Graphics.FromImage(Me.PictureBox1.BackgroundImage) Grp.FillEllipse(New SolidBrush(PaintSelectedColor), e.X - Me.PictureBox1.Location.X - PaintHutosa \ 2, e.Y - Me.PictureBox1.Location.Y - PaintHutosa \ 2, PaintHutosa, PaintHutosa) Grp.Dispose() Me.PictureBox1.Refresh() しかし、これを実行すると再描画されたときに消えてしまいます。 消えてしまう原因と、消えないようにする対処法をご伝授ください。

  • VB PictureBoxの描画範囲

    VisualStudio2010のVBにて、ピクチャーボックスの範囲をプログラム中で大きくして描画をさせたいのですが、ピクチャーボックスのサイズを大きくしても、大きくした範囲には描画がされません。 やり方は↓の方法です。 まず、formにボタンとピクチャーボックスを300×200で配置して、 http://homepage1.nifty.com/rucio/main/dotnet/Samples/dnSampleKeepImage.htm ↑のページで書かれてた方法でグラフィックを再描画させています。 Public Class Form1 Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = AutoGraphics(PictureBox1) PictureBox1.Width = 400 g.FillRectangle(Brushes.Black, 100, 100, 10, 10) '1つ目の図形 g.FillRectangle(Brushes.Black, 350, 100, 10, 10) '2つ目の図形 g.Dispose() End Sub Public Function AutoGraphics(ByVal picSource As PictureBox) As Graphics If picSource.Image Is Nothing Then picSource.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) End If Return Graphics.FromImage(picSource.Image) End Function End Class これを実行すると、1つ目の図形は描画されていますが、拡大した範囲にある2つ目の図形は描画されていません。 ピクチャーボックスの範囲を大きくした所にも描画をさせたいと思っています。 よろしくお願いします。