- 締切済み
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 すみませんがよろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
複数の文字列をスクロールさせたいならその各文字列の表示位置を特定できるような仕組みが必要でしょう 各文字列について表示する文字列、位置、幅などをクラス(または構造体)の配列として記憶しておく Timer1_Tickの中で この配列をなめて表示するようにする とった具合でしょう Public Class myData Private sText as String Private ptPos as Point Private nWidth as Integer Public Property Text() as String Get return sText End Get Set ( byVal value as String) sText = value End Set End Property Public Property Location() as Point Get return ptPos End Get Set ( byVal value as Point) ptPos = value End Set End Property Public Property Width() as Integer Get return nWidth End Get Set ( byVal value as Integer) nWidth = value End Set End Property End Class といったクラスなどを定義します Form1側に Dim arObj() as myData などと配列を準備します 文字列の幅を取得するための Label01をフォームに張ります VisibleはFalseに、AutoSizeはTrueに設定します ボタンのクリックイベントで if arObj is Nothing then n = 0 else n = arObj.Length end if Array.Resize( arObj, n + 1 ) arObj(n) = new myData arObj(n).Location = new Point( Form2.Width, Me.Font.Height * n ) Lable01.Text = TextBox1.Text ' ラベルの幅の更新をする Application.DoEvents() arObj(n).Width = Label01.Width arObj(n).Text = TextBox1.Text Timer1_Tickの内容の文字列描画部分を for n as integer = 0 to arObj.Length - 1 g.DrawString( arObj(n).Text,Label1.Font, New SolidBrush(Label1.ForeColor), arObj(n).Location) arObj(n).Location.X -= 1 if arObj(n).Loaction.X < -arObj(n).Width then ' 右端を超えた場合の処理 Timer1.Stop() end if next
補足
返事ありがとうございます。 すみません Label1って書いてありますが、Label1や何も使わずに Form2に表示させたいのです。 Form2の状態はこんな感じです。 Public Class Form2 Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.ControlBox = False Me.Text = "" Me.KeyPreview = True End Sub Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp If e.KeyCode = Keys.Escape Then Me.WindowState = FormWindowState.Normal End If End Sub 'マウスのクリック位置を記憶 Private mousePoint As Point 'マウスのボタンが押されたとき Private Sub Form2_MouseDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles MyBase.MouseDown If (e.Button And MouseButtons.Left) = MouseButtons.Left Then '位置を記憶する mousePoint = New Point(e.X, e.Y) End If End Sub 'マウスが動いたとき Private Sub Form1_MouseMove(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles MyBase.MouseMove If (e.Button And MouseButtons.Left) = MouseButtons.Left Then Me.Left += e.X - mousePoint.X Me.Top += e.Y - mousePoint.Y 'または、つぎのようにする 'Me.Location = New Point( _ ' Me.Location.X + e.X - mousePoint.X, _ ' Me.Location.Y + e.Y - mousePoint.Y) End If End Sub End Class Form2のバックカラーはForm3で変更できるようにしてます。 あと、先ほど教えてもらった物を使ってみたのですが 自分の載せ方が悪いのかもしれませんが、少しエラーが出ているみたいでした。 こちらでも教えてもらったソースでもう少し試してみようと思います。 ありがとうございます。