文字のスクロールによるちらつきを解消する方法

このQ&Aのポイント
  • フォームにあるラベルに文字を表示し、その文字をスクロールするプログラムを作成しましたが、スクロールする際に文字がちらつく問題が発生しています。
  • 解決策として、文字を描画する際にクリア処理を行うことで、ちらつきを解消することができます。
  • また、文字を描画する位置をずらす際に、一定の速度でずらし、右端までいったら左端に戻すようにすることで、スムーズなスクロール効果を実現できます。
回答を見る
  • ベストアンサー

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

  • bo281
  • お礼率19% (12/63)

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

  • ベストアンサー
回答No.1

背景を塗りつぶしたときに、瞬間的にその色が出るのでちらついているのだと思います。 このようなちらつきは、ダブルバッファリングを用いることで抑えることができます。 1. Labelコントロールと同じサイズのBitmapを用意する。 2. 文字列の描画はBitmapに行う。 3. LabelにBitmapを描画する。 これで、背景の消去とテキストの描画はオフスクリーンで行われるため、画面がちらつかなくなると思います。 (ただ、ここまでするのなら、LabelコントロールではなくPictureBoxでもよさそうな気がしますけども。。。)

bo281
質問者

お礼

回答ありがとうございます。 PictureBoxにて文字のスクロールをしてみようと思うのですが、 具体的にどのようにしたらいいのでしょうか?

関連するQ&A

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

  • VBでの質問です

    VBでの質問です 5分を計るタイマーを作っていて5分たつと止まるプログラムを作っていて、コンマ以下のケタが長くて、しかも止まらない( Label1.Text = n5.Subtract(Now).ToStringをLabel1.Text = n5.Subtract(Now).TotalMinutesにしてIf Label1.Text = "00:00:00" ThenをIf Label1.Text = "0" Thenにした時は止まりました)ので止まるようにするにはどこを変えればいいですか? 教えてください 以下コードです Public Class Form1 Dim n5 As DatePrivate Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load n5 = Now.AddMinutes(5) Timer1.Interval = 1000 Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Label1.Text = n5.Subtract(Now).ToString If Label1.Text = "00:00:00" Then MsgBox("時間になりました。") Timer1.Stop() End If End Sub 長文ですいません

  • Elseifのコードが分かりません。(至急)

    急ぎのため再度の質問失礼します。 3つの数字すべてが7のとき、メッセージ1を出し、 どれか2つだけが7のときは、メッセージ2を出し、 どれか1つだけが7のときは、メッセージ3を出し、 どこにも7が含まれていないときは、メッセージ4を出すようにEndifを使って書きたいのですが、正しいコードを教えて下さい。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Randomize() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click PictureBox1.Visible = False Label4.Visible = False Label1.Text = CStr(Int(Rnd() * 10)) Label2.Text = CStr(Int(Rnd() * 10)) Label3.Text = CStr(Int(Rnd() * 10)) If End If End Sub Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click End Sub Private Sub Label3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label3.Click End Sub Private Sub Label5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label5.Click End Sub End Class よろしくお願いします。

  • MDIParent1に、ToolStripButton1とLabel1

    MDIParent1に、ToolStripButton1とLabel1、Label2を 配置しています。 やりたいことは  (1)ToolStripButton1をクリックしてForm1を表示させる。  (2)Label1をクリックしてForm1のTextをLabel1のTextに変更する。  (3)Label2をクリックしてForm1のTextをLabel2のTextに変更する。 最初に表示させたForm1のTextのみを変更させる。 現在下記のプログラムを実行したのですが Label1をクリックすると新たにForm1が表示されてしまいます。 (Form1のTextはLabel1のTextに変更されている) Label2をクリックすると新たにForm1が表示されてしまいます。 (Form1のTextはLabel2のTextに変更されている) クリックする毎にForm1がふえていきます。 対策方法を教えてください。 Public Class MDIParent1 Dim F1 As Form1  Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Dim frm As New Form1 frm.MdiParent = Me frm.Show() End Sub   Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click F1 = New Form1 F1.Visible = True F1.Text = Label1.Text Label1.BorderStyle = BorderStyle.Fixed3D Label2.BorderStyle = BorderStyle.None End Sub   Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click F1 = New Form1 F1.Visible = True F1.Text = Label2.Text Label2.BorderStyle = BorderStyle.Fixed3D Label1.BorderStyle = BorderStyle.None End Sub End Class

  • テキストファイルを読み込んで文字の動的表示をする方法を教えてください。

    Visual basic2005 Express Editionで、文字を動的に表示する方法は、 TextBoxとTimerをFormに貼り付けて、Timerのプロパティの動作の項目のEnabledをTrueにしてコードに Public Class Form1 Private hyouji As String = "テスト" Private nagasa As Integer = 0 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick TextBox1.Text = Microsoft.VisualBasic.Left(hyouji, nagasa) nagasa += 1 If nagasa > Len(hyouji) Then nagasa = 0 End If End Sub End Class と入力すると出来ますが、テキストファイルを読み込んで文字を動的に表示する方法が分かりません。 教えてください。よろしくお願いします。

  • System.Timers.Timer について

    下記のようなコードで動いていますが、 TestFunc に独自の引数を渡したいと考えています。 どうすれば実現できるでしょうか? 引数以外(メンバ変数等)では対応できていますので、 引数の方法だけ教えてほしいです。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load timer = New System.Timers.Timer() AddHandler timer.Elapsed, New ElapsedEventHandler(AddressOf TestFunc) timer.Interval = 1000 timer.Start() End Sub Public Sub TestFunc(ByVal sender As Object, ByVal e As ElapsedEventArgs) Console.WriteLine(DateTime.Now) End Sub

  • このコードはどこが間違っていますか?(至急)

    急ぎのため再度の質問失礼します。 (zのn乗)-(xのn乗+yのn乗)の計算をさせて、答えが0のときにメッセージを表示したいのですが、どのようなコードを書けばいいのでしょうか? Option Explicit On Public Class Form1 Dim x As Long Dim y As Long Dim z As Long Dim n As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click x = TextBox1.Text y = TextBox2.Text z = TextBox3.Text n = TextBox4.Text TextBox5.Text = (z ^ n) - (x ^ n + y ^ n) If (TextBox5 .Text= 0) Then Label6.Visible = True End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub Private Sub Label6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label6.Click End Sub End Class このコードだと答えが必ず-1になってしまうのですが、どこを直せばいいのでしょうか? 正しいコードを教えて下さい。 よろしくお願いします。

  • ボタンをクリックしても空白をリストに追加しないようにしたい

    初心者ですのでよろしくお願いいたします。 以下のようなコードでボタンを押すとテキストボックスに入力してあるテキストをリストに登録したいのですが、空白の場合は追加したくありません。どのように書けばいいでしょうか? よろしくお願いいたします。 (ちなみにLabel3にはリストに登録された数が出ます) Public Class Form1 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click End End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ListBox1.Items.Add(TextBox1.Text) TextBox1.Clear() Label3.Text = ListBox1.Items.Count End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ListBox1.Items.Remove(ListBox1.SelectedItem) Label3.Text = ListBox1.Items.Count End Sub End Class

  • Visual Basic でスクリーンショット

    学生で、visual basic を勉強しているものです Button1をクリックするとスクリーンショットを1秒ごとに撮り、 "c:\iMonitoring"に保存するというプログラムを書いています (Button2をクリックすると止まる) 写真の名前を撮った時刻にしたいのですがエラーが出てうまくいきません どうしていいか分からばいので教えてください (コードです) ********************************************************************************* Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Timer1.Enabled = False System.IO.Directory.CreateDirectory("C:\iMonitoring") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Timer1.Enabled = False End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim x As String = Now().ToString() Dim a As String = "C:\iMonitoring\" Dim b As String = ".bmp" Dim y As String = (a & x & b) 'Imports System.Drawing 'Imports System.Windows.Forms 'Bitmapの作成 Dim bmp As New Bitmap(Screen.PrimaryScreen.Bounds.Width, _ Screen.PrimaryScreen.Bounds.Height) 'Graphicsの作成 Dim g As Graphics = Graphics.FromImage(bmp) '画面全体をコピーする g.CopyFromScreen(New Point(0, 0), New Point(0, 0), bmp.Size) '解放 g.Dispose() '保存 bmp.Save(y) End Sub End Class

  • Tickイベントについての質問

    1秒間のループ回数を得るために下記のようなコードを記述したのですが、Tickイベントが発生せずループから抜けません。以前はVB6(Timer1_Timerイベント)を使用していたのですが、何の問題もなく使用出来ていました。誰か分る方、ご教授下さい。もちろんInterval=1000です。 '1sec間に繰り返されるループ回数 Private mlng1SecTimeCount As Long '1sec経過フラグ Private msht1SecFlg As Short '(省略) Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'ディレイタイム設定 DELAY_TIME_SETTING() End Sub Private Sub DELAY_TIME_SETTING() 'ディレイタイム設定 '解説:1sec間に実行されるループ回数の算出。 'ループ回数格納用変数 Dim lngLoopCount As Long 'タイマー1起動 Timer1.Enabled = True Do Until msht1SecFlg = 1 lngLoopCount += 1 Loop 'タイマー1停止 Timer1.Enabled = False 'データ保存 mlng1SecTimeCount = lngLoopCount End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick '解説:1sec経過後にインクリメント。 'インクリメント msht1SecFlg += 1 End Sub 以上よろしくお願い致します。

専門家に質問してみよう