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 関数でローカル変数を使用していなければ、これは問題になりません。
どうすればこれを実装できますか? 単純なファンクター クラスの使用を検討しましたが、もっと「エレガントな」方法はありますか?
ありがとう、アレックス