C # WinForms AnimateWindow проблема - PullRequest
3 голосов
/ 12 июля 2011

Я использую следующий код для анимации окна. Позвольте мне немного объяснить визуальную структуру моей программы. У меня есть одна 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);

1 Ответ

2 голосов
/ 21 июля 2011

Я протестировал ваш код, и он работает даже с текстовыми полями (работал и на richtextbox, но он стал черным и только в тех областях, где я печатал, вернул исходный цвет).

Убедитесь, что элемент управления, на котором вы хотите запустить этот код, должен быть скрыт до вызова функции эффекта. Например, я назвал Effects.Animate (textBox1, Effects.Effect.Center, 1000, 120); и textBox1.Visible был установлен в false в конструкторе.

Виджей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...