1

C# Windows アプリケーションを C++\CLI アプリに変換しています。

私はこのコードを「変換」することで立ち往生しています:

void LoadWindow(Mode mode) {
        if (timer != null && timer.Enabled) return;

        int currentIndex = Windows.IndexOf(panel.Controls[0]);
        int loadInex = 0, exitLeft = 0, entranceLeft = 0, stopLeft = 0;

        if (mode == Mode.Next)
        {
            loadInex = currentIndex == Windows.Count - 1 ? 0 : ++currentIndex;
            exitLeft = -((panel.Width / 2 - Windows[currentIndex].Width / 2) + Windows[currentIndex].Width);
            entranceLeft = panel.Width;
        }
        else
        {
            loadInex = currentIndex == 0 ? Windows.Count - 1 : --currentIndex;
            exitLeft = panel.Width;
            entranceLeft = -panel.Width;
        }

        stopLeft = panel.Width / 2 - Windows[loadInex].Width / 2;

        Windows[loadInex].Left = entranceLeft;
        panel.Controls.Add(Windows[loadInex]);

        timer = new System.Windows.Forms.Timer();
        timer.Interval = 10;
        timer.Tick += new EventHandler(delegate(object sender, EventArgs e) {
            if (mode == Mode.Next)
            {
                if (exitLeft <= panel.Controls[0].Left)
                    panel.Controls[0].Left -= 50;

                if (stopLeft <= panel.Controls[1].Left)
                    panel.Controls[1].Left = panel.Controls[1].Left - 50 < stopLeft ? stopLeft : panel.Controls[1].Left - 50;

                if (exitLeft >= panel.Controls[0].Left && stopLeft >= panel.Controls[1].Left)
                {
                    panel.Controls.RemoveAt(0);
                    timer.Enabled = false;
                }
            }

            if (mode == Mode.Previous)
            {
                if (exitLeft >= panel.Controls[0].Left)
                    panel.Controls[0].Left += 50;

                if (stopLeft >= panel.Controls[1].Left)
                    panel.Controls[1].Left = panel.Controls[1].Left + 50 > stopLeft ? stopLeft : panel.Controls[1].Left + 50;

                if (exitLeft <= panel.Controls[0].Left && stopLeft <= panel.Controls[1].Left)
                {
                    panel.Controls.RemoveAt(0);
                    timer.Enabled = false;
                }
            }
        });

        timer.Enabled = true;
    }

AFAIK C++\CLI は匿名メソッドをサポートしていません (ラムダを利用することさえできません)。

EventHandler デリゲートが LoadWindow 関数でローカル変数を使用していなければ、これは問題になりません。

どうすればこれを実装できますか? 単純なファンクター クラスの使用を検討しましたが、もっと「エレガントな」方法はありますか?

ありがとう、アレックス

4

0 に答える 0