当窗体在动画窗口中滑动时,窗体出现在错误的位置

本文关键字:窗体 错误 位置 窗口 动画 | 更新日期: 2023-09-27 18:12:15

我有datagridviews在windows窗体上,我添加记录到datagridview使用小添加对话框,我希望他们动画,当用户按下按钮,他们被加载。我正在使用

 [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.....

当窗体在动画窗口中滑动时,窗体出现在错误的位置

根据您的编辑,您可以使用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();

表单将显示在按钮的右侧