0

数日前、自分のフォト ビューアー/エディターの作業を開始しました。押された矢印キーに応じて写真を変更するメソッド「OnKeyDown」を実装しました。

case Keys.Left:
            case Keys.Down:
                ic.getImage().Dispose();
                --fileIndex;
                if (fileIndex < 0)
                    fileIndex = (fileCount - 1);
                ic.setImage(Image.FromFile(fileNames[fileIndex]), ref pictureBox1);
            break;

            case Keys.Right:
            case Keys.Up:
                ic.getImage().Dispose();
                ++fileIndex;
                fileIndex %= fileCount;
                ic.setImage(Image.FromFile(fileNames[fileIndex]), ref pictureBox1);
            break;

これは完全に機能します。次にやりたかったことは、スライドショーをプログラムすることなので、System.Timers.Timer を使用して、右矢印キーが押された場合と同じコードを実行するイベント goRight() をトリガーしました。

public void goRight(object source, ElapsedEventArgs e)
    {
            ic.getImage().Dispose();
            ++fileIndex;
            fileIndex %= fileCount;
            ic.setImage(Image.FromFile(fileNames[fileIndex]), ref pictureBox1);
    }

スライドショーアプリを使用すると壊れます。コードはまったく同じなので、理由がわかりません。コメントアウトすると、ic.getImage().Dispose() スライドショーは機能しますが、RAM 内のデータ量は次の写真ごとにどんどん増えていきます。

私は何か間違ったことをしていますか?お時間をいただきありがとうございます。

うーん、ほとんど忘れていました。if ステートメントを使用せずにインデックスを後方に移動する方法はありますか (キー ダウン イベントとキー 左イベントで) (前方の演算子 % など)。私はこれを試しました:

++fileIndex;
fileIndex %= fileCount;
ic.setImage(Image.FromFile(fileNames[(fileCount -1) - fileIndex]), ref pictureBox1);

また、一方向だけに進むとうまく機能しますが、方向を変えるといくつかのインデックスがスキップされます。それについて何か考えはありますか?

よろしくお願いします。Z

4

1 に答える 1

1

インデックスについては、次のようなことができます。

fileIndex = (fileIndex == 0) ? fileCount -1 : fileIndex - 1; // decrementing

fileIndex = (fileIndex == fileCount - 1) ? 0 : fileIndex + 1; // incrementing

cHao が言うように、代わりに System.Windows.Forms.Timer を使用してください。

于 2012-10-30T21:29:11.740 に答える