0

C#でスクリーンセーバープログラムを書いています。そして、私はそれを次のようにしたい:

テキストから始めます。約 3 秒以上経過したら、テキストを非表示にして画像を表示します。次の 3 秒後、画像を非表示にしてテキストを表示し、ユーザーがスクリーンセーバーを終了する操作を行うまでループを繰り返します。

私がやったこと:単純なテキストラベルとタイマーコントロールから始めました。3秒ごとに画面上のテキストラベルの位置を変更することができました。ピクチャ ボックスを含めるようにコードを更新し、timer_tick メソッドに if-else ステートメントを挿入して、メソッドが呼び出されたときに、テキスト ラベルが表示されているかどうかをチェックし、それを非表示にしてピクチャ ボックスを表示しました。それ以外の場合は、ピクチャボックスが表示されている場合は、非表示にしてテキストボックスを表示します。コードを以下に示します。

  private void Form1_Load(object sender, EventArgs e)
    {
        Cursor.Hide();
        TopMost = true;

        moveTimer.Interval = 3000;
        moveTimer.Tick += new EventHandler(moveTimer_Tick);
        moveTimer.Start();
    }

    private void moveTimer_Tick(object sender, System.EventArgs e)
    {
        //Move text to new Location
        //textLabel.Left = rand.Next(Math.Max(1, Bounds.Width - textLabel.Width));
        //textLabel.Top = rand.Next(Math.Max(1, Bounds.Height - textLabel.Height));

        if (pictureBox1.Enabled == true)
            {
                pictureBox1.Hide();
                textLabel.Show();
            }

        if (textLabel.Enabled == true)
            {
                textLabel.Hide();
                pictureBox1.Show();
            }
    }

ここに問題があります。スクリーンセーバー プログラムを実行すると、画面はテキストで始まり、3 秒後に画像に変わり、そこで停止します。

テキストラベルまたはピクチャボックスを表示/非表示にして、連続ループで移動するにはどうすればよいですか?

これを正しい方法で実装しましたか?

明確で簡潔な説明/回答をいただければ幸いです。

ありがとう!

4

2 に答える 2

1

おそらく、切り替え可能な変数に状態を保持できます

private bool state = false; 

private void moveTimer_Tick(object sender, System.EventArgs e)
{
    //Move text to new Location
    //textLabel.Left = rand.Next(Math.Max(1, Bounds.Width - textLabel.Width));
    //textLabel.Top = rand.Next(Math.Max(1, Bounds.Height - textLabel.Height));

    if (state)
    {
        pictureBox1.Hide();
        textLabel.Show();
    }
    else
    {
        textLabel.Hide();
        pictureBox1.Show();
    }
    state = !state;
}

このようなものはどうですか?

于 2013-02-26T17:04:52.707 に答える
1

Enabled は、オブジェクトが入力を受け取ることができるかどうかを示します。目に見えるかどうかは、目に見えるかどうかを示すものです。

すべてのオブジェクトが有効になっているため、一度だけ変更されていることがわかります。1 つ目ifは成功し、画像を非表示にしてテキストを表示します。しかし、2 番目ifも成功し、画像を表示してテキストを非表示にします。これはすべて 1 つのイベント コールバックであるため、最初のイベントがif発生することはありません。

コメントで気付いているように、答えは有効にチェックしないことです。代わりに、[表示] をオンにします。も必ず使用してくださいelse。そうしないと、両方が true であるという同じ問題が発生する可能性があります。

private void moveTimer_Tick(object sender, System.EventArgs e)
{
    //Move text to new Location
    //textLabel.Left = rand.Next(Math.Max(1, Bounds.Width - textLabel.Width));
    //textLabel.Top = rand.Next(Math.Max(1, Bounds.Height - textLabel.Height));

    if (pictureBox1.Visible == true)
        {
            pictureBox1.Hide();
            textLabel.Show();
        }
    else
        {
            textLabel.Hide();
            pictureBox1.Show();
        }
}
于 2013-02-26T17:09:32.260 に答える