Я использую следующий код для анимации окна.
Позвольте мне немного объяснить визуальную структуру моей программы. У меня есть одна FlowLayoutPanel, расположенная поверх моей Form1, а также много объектов GroupBox, расположенных поверх FlowLayoutPanel. И, наконец, у меня есть одна кнопка и невидимый объект RichTextBox, расположенный над GroupBox.
например: Form1-> FlowLayoutPanel-> GroupBox-> Button и RichTextBox (невидимый)
Я пытаюсь добиться того, чтобы, щелкая объект Button, я хотел, чтобы мой RichTextBox скользил вниз. Я попробовал это, создав одну кнопку и RichTextBox поверх моей основной формы, и он работал отлично. Однако, когда я пытаюсь сделать то же самое, используя элементы управления GroupBox во время выполнения, моя функция Animate выдает неизвестное исключение.
class Effects
{
public enum Effect { Roll, Slide, Center, Blend }
public static void Animate(Control ctl, Effect effect, int msec, int angle)
{
int flags = effmap[(int)effect];
if (ctl.Visible) { flags |= 0x10000; angle += 180; }
else
{
if (ctl.TopLevelControl == ctl) flags |= 0x20000;
else if (effect == Effect.Blend) throw new ArgumentException();
}
flags |= dirmap[(angle % 360) / 45];
bool ok = AnimateWindow(ctl.Handle, msec, flags);
if (!ok) throw new Exception("Animation failed");
ctl.Visible = !ctl.Visible;
}
private static int[] dirmap = { 1, 5, 4, 6, 2, 10, 8, 9 };
private static int[] effmap = { 0, 0x40000, 0x10, 0x80000 };
[DllImport("user32.dll")]
public static extern bool AnimateWindow(IntPtr handle, int msec, int flags);
}
Я также заметил, что когда я вызываю функцию Animate, используя родительский элемент RichTextBox
например, Effects.Animate (textBox.parent, Effects.Effect.Slide, 150, 90);
анимация работает без проблем.
Я не знаю, почему это работает с родителем, а не с реальным объектом.
например, Effects.Animate (textBox, Effects.Effect.Slide, 150, 90);