2011-10-25 77 views
0

我有windows窗體上的datagridviews,我將記錄添加到datagridview使用小的添加對話框,我希望他們動畫中,當用戶按下他們的按鈕被加載。我使用當動畫窗口窗體滑入時,窗體出現在錯誤的位置

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

來源:http://www.c-sharpcorner.com/UploadFile/kirtan007/761/

對話框設置動畫中,但在屏幕的左上角。我使用的添加對話框的Load事件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.Location然後它會顯示正確,所以我想有沒有訪問應用程序的根母,而不是做this.parent.parent的任何正式的方式。 ...

+0

您能否更具體地瞭解「在錯誤的位置」。它是太高還是太低,左邊還是右邊,或者是隨機的。它應該在哪裏? – ChrisF

+0

我已更新問題「屏幕左上角」 – PUG

+0

您提供的數字是否與父窗口相關?也許只要拿掉'LocationMainX'和'locationMainy'? – ChrisF

回答

0

根據您的編輯,您可以使用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(); 

的形式將顯示該按鈕的右側。

+0

這確實解決了即時問題,但目標放置在一個特定的新形式位置仍然沒有解決,因爲我想將新表單相對於父窗體中的按鈕進行放置。並且此按鈕嵌套在多個控制中,如分離器面板和組合框。如果可以找到該按鈕相對於主窗體的位置而不是其存在的控件,那將是非常好的 – PUG

+0

@jaminator更新。只是仔細檢查,這是一個MDI應用程序? – LarsTech