При анимации Windows forms для вставки форма отображается в неправильном месте

#c# #.net #winforms #animation #location

#c# #.net #winforms #Анимация #Расположение

Вопрос:

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

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

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

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

 //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…..

Комментарии:

1. Можете ли вы уточнить, что форма находится «в неправильном месте». Она слишком высокая или низкая, слишком далеко влево или вправо или случайная. Где это должно быть?

2. я обновил вопрос «вверху слева от экрана»

3. Являются ли числа, которые вы указываете, относительно родительского окна? Просто снимите LocationMainX и locationMainy , возможно?

4. Установите для свойства StartPosition формы значение Manual.

5. @HansPassant сделал это снова, позиция (0,24) на 150 пикселей выше родительской формы. хотя это должно быть так. Родительский элемент. Расположение рабочего стола

Ответ №1:

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

Обновить:

Не совсем уверен, где вы хотите, чтобы эта форма отображалась. Может быть, просто используйте какой-нибудь 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();
  

Форма появится справа от кнопки.

Комментарии:

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

2. Обновлен @jaminator. Просто чтобы перепроверить, является ли это MDI-приложением?