2009-08-12 27 views
5

Tôi đã hỏi câu hỏi này trước đây và nghĩ rằng tôi đã tìm ra nhưng nó vẫn không hoạt động. Form.Show() moves form position slightlyForm.Location không hoạt động

Vì vậy, tôi có biểu mẫu cha mở một nhóm trẻ có chương trình() và sau đó khi cần thiết, tôi sử dụng hàm bringToFront() để hiển thị nó. Vấn đề là khi show() được gọi là hình thức con được liên kết hoàn hảo nhưng khi tôi sử dụng bringToFront nó di chuyển trái và xuống 1 px mà vít với biên giới của tôi. Tôi đã đặt tất cả các biểu mẫu con startPosition properties thành Manual trước khi show() - ing chúng. Tôi đã đặt frm.location = new Point (x, y) khi đưa lên trước. Tôi cũng đã cố gắng giải thích thiết lập frm.location khi show() - ing cũng có. Nó vẫn di chuyển nó sang trái và xuống 1 px khi tôi mangToFront(). Có cái gì đó với bringToFront() không cho phép tôi thay đổi thuộc tính vị trí của biểu mẫu? Đây là mã của tôi:

if (myNewForm != null) 
{ 
    myNewForm.MdiParent = this; 

    bool isFormOpen = false; 

    foreach (Form frm in Application.OpenForms) 
    { 
     if (frm.GetType() == myNewForm.GetType()) 
     { 
      frm.WindowState = FormWindowState.Maximized; 
      frm.BringToFront(); 
      frm.Location = new Point(-4, -30); 
      isFormOpen = true; 
      break; 
     } 
    } 

    if (!isFormOpen) 
    { 
     myNewForm.StartPosition = FormStartPosition.Manual; 
     myNewForm.Show(); 
    } 
} 

EDIT: Ok như vậy rõ ràng là Microsoft có một lỗi cho phép StartPosition chỉ làm việc cho ShowDialog() và không Hiện() nhưng từ chối để sửa chữa nó: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=107589

Nhưng nhu cầu ứng dụng của tôi để giữ cho tất cả các biểu mẫu khác nhau mở ra và chỉ đưa chúng lên phía trước khi cần thiết ... vì vậy ShowDialog() có thể không được sử dụng một cách thích hợp trong trường hợp này đúng không? Vậy tôi có những lựa chọn nào? Bất kì?

+0

Hmmm ... Nếu tôi xóa FormWindowState.Maximized điều này thực hiện chính xác những gì tôi muốn, tuy nhiên MdiParent cho phép người dùng cuộn và xem toàn bộ trẻ em và trẻ em đằng sau nó và tôi không muốn .... – novacara

Trả lời

1

Điều gì về cách sử dụng p/Invoke to MoveWindow? Liên kết được cung cấp bao gồm một ví dụ C#.

+0

Hoạt động hoàn hảo !! Cám ơn rất nhiều!! – novacara

+0

Rất vui khi nó hoạt động! – Armbrat

+0

Là một câu hỏi phụ ... Có ai biết cách sử dụng các cuộc gọi Windows API hoạt động với Visual Studio không? Các dll có được đưa vào sản phẩm hoàn chỉnh hay chương trình chỉ có thể được sử dụng trên hệ điều hành Windows không? – novacara

0

Bạn đã thử hiển thị biểu mẫu rồi điều chỉnh Vị trí chưa?

Chỉnh sửa: Hoặc, bạn đã thử điều chỉnh các thuộc tính Trái và Trên chưa?

+0

Có, tôi đã thử điều này. Và hàm BringToFront() của nó là vấn đề chứ không phải là Show() - ing.Nhưng tôi cũng đã cố gắng đưa lên trước và sau đó điều chỉnh vị trí ... vẫn không có gì. – novacara

+0

Có cùng một vấn đề. Vấn đề có vẻ là đầu tiên của tất cả Show() không cho phép StartPosition được thiết lập giống như nó được cho là không định vị lại. Thứ hai, khi tối đa hóa các con nó di chuyển nó xuống 1px và phải 1px mặc dù tôi không hiểu tại sao vì nó được tối đa ban đầu nhưng nằm ở nơi mà nó được cho là. Nếu tôi không tối đa hóa thì cha mẹ mdi cung cấp thanh cuộn và tôi chắc chắn không muốn điều đó. Nếu tôi chỉnh sửa các hình thức để được 1px trái và lên, nơi nó bây giờ nó cho thấy không chính xác ban đầu nhưng chính xác khi tôi bringtofront(). Tất cả những gì tôi muốn là một cách giải quyết! – novacara

1

Tôi cho rằng các biểu mẫu được di chuyển bằng mã xử lý các yêu cầu Show() (và BringToFront), vì vậy bạn thực sự không thể đặt vị trí của biểu mẫu - không phải trước hoặc sau khi gọi phương thức - vì vị trí biểu mẫu sẽ được cập nhật sau mã trong cửa sổ chính của bạn đã được thực hiện (và điều khiển trái trở lại máy bơm thông báo cửa sổ, theo thuật ngữ Win32, về cơ bản).

Tôi sẽ sử dụng một lớp con của Biểu mẫu cho từng biểu mẫu của bạn và sau đó thêm thuộc tính Điểm rõ ràng cho biết vị trí cố định nơi biểu mẫu cụ thể được mong đợi. Bên trong lớp này, ghi đè lên phương thức ảo OnShown (hoặc có lẽ phương thức OnActivated quá) và chỉ cần cập nhật vị trí này.Location với vị trí chính xác.

Điều đó sẽ buộc các biểu mẫu đến đúng vị trí, ngay cả khi một số mã bên trong các cửa sổ biểu mẫu thay đổi nó tại một thời điểm nào đó.

1

Bạn đã thử:

this.Location 

hoặc

Form.ActiveForm.Location?

15

Nếu bạn muốn đặt vị trí biểu mẫu, bạn phải đặt biểu mẫu WindowState thành Normal (trên bất kỳ cài đặt nào khác, vị trí được đặt cho bạn theo quy tắc của cài đặt đó, vì vậy giá trị của bạn bị bỏ qua) và của nó StartPosition đến Manual.

frm.WindowState = FormWindowState.Normal; 
frm.StartPosition = FormStartPosition.Manual; 
frm.BringToFront(); 
frm.Location = new Point(-4, -30); 
+0

"TDull" bạn đến từ đâu? ქართველი ხარ ...! – IremadzeArchil19910311