#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-приложением?