В то время как анимация окон формы для скольжения, форма появляется в неправильном месте - PullRequest
0 голосов
/ 25 октября 2011

У меня есть таблицы данных в форме окна, я добавляю записи в таблицу данных с помощью небольших диалоговых окон добавления, я хочу, чтобы они анимировались, когда пользователь нажимает кнопку, на которой они загружены. Я использую

 [DllImport("user32")]
        static extern bool AnimateWindow(IntPtr hwnd, int time, int flags);

Источник: http://www.c -sharpcorner.com / UploadFile / kirtan007 / 761 /

Диалоги оживляются, но в левом верхнем углу экрана. Я использую нижеприведенный код в событии Load диалога добавления:

//Set the Location  negative values are being returned when my dialog appears
                this.Location = new Point(LocationMainX + WidthOfMain, locationMainy + 10);

                //Animate form
                AnimateWindow(this.Handle, 750, AW_SLIDE | AW_HOR_POSITIVE);

В родительской форме я передаю свое местоположение дочерней форме.

AddForm form = new AddForm (this.DesktopLocation)
form.ShowDialog(); //I have also noticed doing form.Show(); messes with the position of dialog

Моя основная форма загружается в другую форму, поэтому я предполагаю, что она возвращает относительное местоположение. Но я попробовал:

AddForm form = new AddForm (this.Parent.DesktopLocation)
    form.ShowDialog();

это не возвращает отрицательных значений, но возвращает (0,24), что также неверно. как диалоговое окно анимирует около 150 пикселей над родительской формой.

когда я устанавливаю форму также относительно this.Parent.Parent.Location, тогда все выглядит правильно, , поэтому я предполагаю, что существует какой-либо формальный способ доступа к корневому родительскому элементу приложения, вместо того, чтобы делать this.parent .parent .....

1 Ответ

0 голосов
/ 25 октября 2011

Для вашего редактирования вы можете просто использовать this.ParentForm вместо this.Parent.Проверьте на ноль, на всякий случай и т. Д.

Обновление:

Не совсем уверен, где вы хотите, чтобы эта форма отображалась.Может быть, просто используйте pinvoke :

using System.Runtime.InteropServices;

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
  public int Left;
  public int Top;
  public int Right;
  public int Bottom;
}

А затем, чтобы показать форму:

RECT fromRECT;
GetWindowRect(new HandleRef(this, button1.Handle), out fromRECT);
form.Location = new Point(fromRECT.Left + (fromRECT.Right - fromRECT.Left), fromRECT.Top);
form.Show();

Форма будет отображаться справа от кнопки.

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