tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルプログラムの制御について
記事No11442
投稿日: 2015/06/13(Sat) 16:51
投稿者ゆきみち
下記のプログラムで3秒間視標を呈示している最中に誤ってキーボタン(例えば、←↓↑→)を押すと
次のキーイベントが作動してしまいます。3秒間視標を呈示している間だけは、何を押しても反応しない(プログラムが動かない)することは可能なのでしょうか?ご指導のほど宜しくお願い申し上げます。

Public Class Form1
    Dim x, y, i As Single
    Dim a, b, c, d, f, h, k, r, s, w, qw As Single

    Dim BackColor_R, BackColor_G, BackColor_B As Short
    Dim RandoltColor_R, RandoltColor_G, RandoltColor_B As Short
    Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
        Dim q As Integer
        Timer1.Enabled = True


        q = e.KeyCode  
        Dim g As Graphics = CreateGraphics()

        a = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width
        b = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height

      
        c = 11.6

        d = Math.Sqrt(a * a + b * b)
        f = c * 2.54                
        h = 10 * f / d                    

        x = Me.ClientSize.Width \ 2
        y = Me.ClientSize.Height \ 2


        k = 6 * 10

        r = k / CSng(h)
        s = r * CSng(0.6)


        g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
        g.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality

        
        Dim randoltoRing As New SolidBrush(Color.FromArgb(RandoltColor_R, RandoltColor_G, RandoltColor_B))
        Dim haikei As New SolidBrush(Color.FromArgb(BackColor_R, BackColor_G, BackColor_B))


        g.FillEllipse(randoltoRing, x - r, y - r, r * 2, r * 2)
        g.FillEllipse(haikei, x - s, y - s, s * 2, s * 2)


        g.SmoothingMode = Drawing2D.SmoothingMode.None
        g.PixelOffsetMode = Drawing2D.PixelOffsetMode.None


        s = 8
        w = Int(Rnd() * s) + 1

        If w = 1 Then        
            g.FillRectangle(haikei, x + r * CSng(0.4), y - r * CSng(0.2), r * CSng(0.8), r * CSng(0.4))  
        ElseIf w = 2 Then    
            g.FillRectangle(haikei, x - r * CSng(1.2), y - r * CSng(0.2), r * CSng(0.8), r * CSng(0.4))  
        ElseIf w = 3 Then    
            g.FillRectangle(haikei, x - r * CSng(0.2), y + r * CSng(0.4), r * CSng(0.4), r * CSng(0.8))  
        ElseIf w = 4 Then    
            g.FillRectangle(haikei, x - r * CSng(0.2), y - r * CSng(1.2), r * CSng(0.4), r * CSng(0.8))  
        End If


        Dim myPen2 As New Pen(Color.Red, 1)
        Dim rotatePoint As New PointF(CSng(x), CSng(y))


        Dim myMatrix As New Drawing2D.Matrix()
        myMatrix.RotateAt(45, rotatePoint, Drawing2D.MatrixOrder.Append)
        g.Transform = myMatrix

        If w = 5 Then              
            g.FillRectangle(haikei, x - r * CSng(1.2), y - r * CSng(0.2), r * CSng(0.8), r * CSng(0.4))
        ElseIf w = 6 Then          
            g.FillRectangle(haikei, x + r * CSng(0.4), y - r * CSng(0.2), r * CSng(0.8), r * CSng(0.4))
        ElseIf w = 7 Then          
            g.FillRectangle(haikei, x - r * CSng(0.2), y + r * CSng(0.4), r * CSng(0.4), r * CSng(0.8))
        ElseIf w = 8 Then          
            g.FillRectangle(haikei, x - r * CSng(0.2), y - r * CSng(1.2), r * CSng(0.4), r * CSng(0.8))
        End If

        g.Dispose()


        Timer1.Interval = 3000

        
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

        Dim v As Graphics = CreateGraphics()

        Dim haikei_kakusu As New SolidBrush(Color.FromArgb(BackColor_R, BackColor_G, BackColor_B))
        v.FillEllipse(haikei_kakusu, x - 2 * r, y - 2 * r, r * 2 * 2, r * 2 * 2)
        Timer1.Enabled = False
        v.Dispose()

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        BackColor_R = 255
        BackColor_G = 255
        BackColor_B = 255
        RandoltColor_R = 178
        RandoltColor_G = 100
        RandoltColor_B = 67

        Me.BackColor = Color.FromArgb(BackColor_R, BackColor_G, BackColor_B)

        Timer1.Enabled = True

    End Sub
End Class

[ツリー表示へ]
タイトルRe: プログラムの制御について
記事No11443
投稿日: 2015/06/13(Sat) 19:38
投稿者ゆきみち
動作環境はVB2012です。

[ツリー表示へ]
タイトルRe: プログラムの制御について
記事No11444
投稿日: 2015/06/14(Sun) 14:41
投稿者魔界の仮面弁士
最大の問題点は、「CreateGraphics メソッド」を使っているということですね。

CreateGrapchis での描画は一時的なものなので、外部要因によって容易く消えてしまうものです。
(消えてしまうことを防ぐという方向で考えない方が良いでしょう)

消えても構わないほど連続描画を繰り返すアニメーション処理などで使われることはありますが、
普通のアプリケーションでは、あまり使うことの無いメソッドです。


この手の描画処理では、
 (A案) Paint イベントによる e.Graphics への描画(OnPaint メソッドのオーバーロードでも可)
 (B案) Bitmap オブジェクトに Graphis.FromImage し、その画像を
   BackgroundImage プロパティに割り当てる(PictureBox.Image でも可)
というのが基本方針となります。


B 案は、描画頻度が少ない場合や、描画フォームサイズが変化しないケースで有効です。
コードとしても、描画処理が一度しか行われないので扱いやすいでしょう。


A 案は、頻繁に描きかえるようなもの(時計など)に有効です。Windows の本質的にはこちら。
描画タイミングが不定期なので、「描画データを更新する処理」と「描画処理本体」を分けて
考える必要があるため、描画処理を誘発させるための Invalidate メソッドと併用することも多いです。


今回はどちらでも構わないと思いますが、B 案が良いのでは無いでしょうか。
 bmp = New Bitmap(幅, 高さ)
で用意したビットマップに対して、
 g = Graphicis.FromImage(bmp)
で生成した Graphics に描画します。

描いた bmp は、Form.BackgroundImage ないしは PictureBox.Image に割り当てれば OK 。
キー入力 3 秒ルールについては、この bmp の内容を描きかえる(または別の bmp に差し替える)ことで
実現できるかと思います。

[ツリー表示へ]
タイトルRe^2: プログラムの制御について
記事No11445
投稿日: 2015/06/14(Sun) 18:53
投稿者ゆきみち
ご指導ありがとうございます。
Keyイベントのなかでグラフィックを使用とするとPaintイベントを上手く使えないのですが、
何か良い方法はありますでしょうか?
B案についてビットマップを使ったことがないので、簡単なもので試してから最初のプログラムに落としこみたいと思います。そこまで出来たらまた伺うことがあるかと思いますのでその際は何卒宜しくお願い申し上げます。

[ツリー表示へ]
タイトルRe^3: プログラムの制御について
記事No11446
投稿日: 2015/06/14(Sun) 21:41
投稿者魔界の仮面弁士
> Keyイベントのなかでグラフィックを使用とするとPaintイベントを上手く使えないのですが、
> 何か良い方法はありますでしょうか?

「キー入力を受け取る処理」「描画処理」「3秒間のカウント」が
それぞれ別のタイミングで発生するという点に気を配ってみてください。

描画(あるいは描画クリア)を行いたいときには、キーボード処理(あるいはタイマー)の
イベントの中で、Invalidate メソッドを呼び出してください。そうすれば、
End Sub 到達後に、続けて Paint イベントが発生しますので、そのタイミングで
描画処理(あるいは描画クリア)の Graphics 操作を行えば OK です。

プログラムがどのような動きになってほしいのかの説明がなかったので、
どのように修正すれば良いのかという具体的なアドバイスは出来かねますが…。

[ツリー表示へ]
タイトルRe^4: プログラムの制御について
記事No11448
投稿日: 2015/06/15(Mon) 18:58
投稿者ゆきみち
コメントありがとうございます。
プログラムの動きについてですが、
@黒の〇を書く
A白の〇を書く(@の3/5の大きさ)(ここでドーナツの形になる)
B切れ目の方向を決める
C3秒間呈示する。
(このときにどのキーボタンを押してもプログラムが動かないようにしたいが、上手くいかない...。)
D背景と同じ色でドーナッツを消す

今のままでは@からDの流れのなかで、もし途中で応答されてしまうと決まった時間呈示出来なくなるのが
問題なのです。これで具体的なアドバイスを頂くことは可能でしょうか?
お手数を掛けて申し訳ありませんが、もし良ければ何卒宜しくお願い申し上げます。

[ツリー表示へ]
タイトルRe: プログラムの制御について
記事No11447
投稿日: 2015/06/15(Mon) 15:41
投稿者shu
描画については既に回答がついていますので
『何を押しても反応しない』についてサンプルです。

Public Class Form1

    Private _Value As Integer = 0

    Private Sub Form1_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        If Timer1.Enabled Then Exit Sub

        Select Case e.KeyCode
            Case Keys.Up
                _Value += 1
                Label1.Text = _Value.ToString
            Case Keys.Down
                _Value -= 1
                Label1.Text = _Value.ToString
        End Select

        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
        Timer1.Stop()
    End Sub
End Class

[ツリー表示へ]
タイトルRe^2: プログラムの制御について
記事No11449
投稿日: 2015/06/15(Mon) 19:01
投稿者ゆきみち
コメントありがとうございます。
どうやったら、キーボートを押しても何も反応しないように出来るのかとずっと考えていましたが、
分からずにこのサイトで伺うことにしました。サンプルのプログラムを教えて下さりありがとうございます。
自分で動作確認して参考にします。本当にありがとうございました。

[ツリー表示へ]