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件)
- 最新から表示
- 回答順に表示
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
この回答への補足
返事ありがとうございます。
すみません
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) Visual Basic : ImageListの画像がそろったときにメッセージを表示 1 2023/07/20 13:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
_tcscpy_s(wcscpy_s)の第二引数...
-
TCL言語で文字列検索方法を教え...
-
プログラムによく出てくるst...
-
ASPで別サイトの内容を Stream ...
-
括弧が含まれる文字列の括弧の...
-
fgetsで配列に数字を入れる。
-
VBA-DLLの引数受け渡しについて
-
ソースコードの間違い (C言語)
-
曜日を格納する配列の大きさ
-
C#でstringをポインタとして渡す
-
C++で入力した文字列から数字を...
-
VC++6.0 MFC ダイアログバーを...
-
ExcelVBAで質問です。離れた二...
-
c言語
-
C言語 配列の長さの上限
-
パイソンの
-
mallocについて
-
Excelですべての組合せ(重複組...
-
関数から配列を返すには?
-
文字列内の数字削除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C++で入力した文字列から数字を...
-
nullと""、\\0とEOFの違いにつ...
-
プログラムによく出てくるst...
-
%dなどの違い
-
WSH(VBS)でJSONの文字列を読み...
-
TCL言語で文字列検索方法を教え...
-
C#でstringをポインタとして渡す
-
16進数を2文字ずつ配列に格納し...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
C++で文字列の右端から特定の文...
-
シリアル通信で0x00を送信した...
-
VBA-DLLの引数受け渡しについて
-
数字の入った配列をファイルへ...
-
c#で他のアプリの文字入力フォ...
-
構造体→文字列→構造体 をする方法
-
Shift_JIS(16進)を文字に変換す...
-
バイナリファイル中の日本語文...
-
C言語の課題で困っています;
-
[C++]WCHARの1文字目しか表示で...
-
VB6.0でのバイナリデータの扱い...
おすすめ情報