掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
デスピサロ (ID:147112)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
魔界の仮面弁士さん,ご指摘ありがとうございます。 System.Windows.Forms.Timerに変更しました。 三木谷浩氏のPCではWindowsタイマーは不具合がでるとのことだったので 深く考えずスレッドタイマーを使ってしまいました。 別スレッドからコントロールを操作することは気にはなっていましたが, 動いたからいいかと軽く考えてしまいました。 System.Threading.Interlockedについてよく勉強してみます。 Public Class Form1 Dim Slot(2) As Drum Dim WithEvents StartButton As New Button Dim StopButton(2) As Button Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = 0 To Slot.Length - 1 Slot(i) = New Drum Slot(i).SetBounds(i * 64, 0, 64, 64) StopButton(i) = New Button StopButton(i).Text = "ストップ" StopButton(i).Tag = i StopButton(i).SetBounds(i * 64, 64, 64, 24) AddHandler StopButton(i).Click, AddressOf StopButton_Click StartButton.Text = "スタート" StartButton.SetBounds(64 * 3, 0, 64, 24) Next Me.Controls.AddRange(Slot) Me.Controls.AddRange(StopButton) Me.Controls.Add(StartButton) End Sub Private Sub StartButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartButton.Click For Each s As Drum In Slot s.Start() Next End Sub Private Sub StopButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Slot(CInt(DirectCast(sender, Button).Tag)).Stop() End Sub Class Drum Inherits PictureBox Private _DrumPosition As Integer Private WithEvents _Timer As New Timer Private _Flag As Boolean Sub New() Dim DrumString As String() = New String() {"★", "◎", "□", "△", "◆", "♂", "★"} Me.Image = New Bitmap(32, 32 * DrumString.Length) Using g As Graphics = Graphics.FromImage(Me.Image) g.FillRectangle(Brushes.Green, Rectangle.Round(g.VisibleClipBounds)) For i As Integer = 0 To DrumString.Length - 1 g.DrawString(DrumString(i), New Font("MS ゴシック", 18), Brushes.White, New RectangleF(0, 32 * i + 4, 32, 32 - 4)) Next End Using Me._Timer.Interval = 10 End Sub Public Sub Start() If Not Me._Flag Then Me._Flag = True Me._Timer.Start() End If End Sub Public Sub [Stop]() Me._Flag = False End Sub Protected Overrides Sub OnPaint(ByVal pe As System.Windows.Forms.PaintEventArgs) pe.Graphics.DrawImage(Me.Image, Me.ClientRectangle, New Rectangle(0, Me._DrumPosition, 32, 32), GraphicsUnit.Pixel) End Sub Private Sub _Timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles _Timer.Tick Me._DrumPosition += CInt(IIf(Me._Flag, 4, 1)) If Me._DrumPosition + 32 > Me.Image.Height Then Me._DrumPosition -= Me.Image.Height - 32 End If If Not Me._Flag AndAlso Me._DrumPosition Mod 32 = 0 Then Me._Timer.Dispose() End If Me.Invalidate() End Sub End Class End Class
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.