プロが教える店舗&オフィスのセキュリティ対策術

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


すみませんがよろしくお願いします。

A 回答 (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

この回答への補足

返事ありがとうございます。
すみません
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で変更できるようにしてます。

あと、先ほど教えてもらった物を使ってみたのですが
自分の載せ方が悪いのかもしれませんが、少しエラーが出ているみたいでした。
こちらでも教えてもらったソースでもう少し試してみようと思います。
ありがとうございます。

補足日時:2008/09/02 11:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!