• 締切済み

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 すみませんがよろしくお願いします。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

複数の文字列をスクロールさせたいならその各文字列の表示位置を特定できるような仕組みが必要でしょう 各文字列について表示する文字列、位置、幅などをクラス(または構造体)の配列として記憶しておく 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

NOTOR
質問者

補足

返事ありがとうございます。 すみません 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で変更できるようにしてます。 あと、先ほど教えてもらった物を使ってみたのですが 自分の載せ方が悪いのかもしれませんが、少しエラーが出ているみたいでした。 こちらでも教えてもらったソースでもう少し試してみようと思います。 ありがとうございます。

関連するQ&A