2009-08-12 23 views
5

Zadałem to pytanie wcześniej i myślałem, że mam to ustalone, ale nadal nie działa. Form.Show() moves form position slightlyForm.Location nie działa

Tak więc mam formularz nadrzędny, który otwiera grupę dzieci z show(), a następnie, gdy jeden jest potrzebny Używam bringToFront(), aby wyświetlić. Problem polega na tym, że wywołanie funkcji show() sprawia, że ​​forma potomna jest idealnie wyrównana, ale kiedy używam metody bringToFront, przesuwa się ona w lewo i dół o 1 piksel, która wkręca się przy moich obramowaniach. Ustawiłem właściwości właściwości startPosition dla wszystkich dzieci na Manual przed show() -. Ustawiłem frm.location = new Point (x, y) przy przenoszeniu do przodu. Próbowałem również explicity ustawienie frm.location, gdy show() - również. Wciąż przesuwa ją w lewo i w dół o 1 piksela, gdy wprowadzam metodę bringToFront(). Czy jest coś z bringToFront(), które nie pozwala mi zmienić właściwości położenia formularza? Tu jest mój kodu:

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, więc najwyraźniej Microsoft ma błąd, który umożliwia startPosition pracować tylko dla ShowDialog(), a nie show(), ale odmawia go naprawić: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=107589

ale moje potrzeby aplikacji aby zachować wszystkie otwarte formy i po prostu przynieść je na pierwszy plan w razie potrzeby ... więc funkcja ShowDialog() nie mogła być odpowiednio użyta w tym przypadku, prawda? Jakie więc opcje mam? Każdy?

+0

Hmmm ... Jeśli usunąć FormWindowState.Maximized to robi dokładnie to, co chcę go jednak wówczas MdiParent pozwala użytkownikowi na przewijanie i zobaczyć pełną dziecka i dzieci za nim i nie chcę, że albo .... – novacara

Odpowiedz

1

Co powiesz na używanie numeru p/Invoke to MoveWindow? Podany link zawiera przykład C#.

+0

Działa idealnie !! Dzięki wielkie!! – novacara

+0

Cieszę się, że działało! – Armbrat

+0

Jako pytanie poboczne ... Czy ktoś wie, w jaki sposób korzystanie z wywołań interfejsu Windows API działa z programem Visual Studio? Czy biblioteki DLL są dołączone do gotowego produktu lub czy program może być używany tylko w systemie operacyjnym Windows? – novacara

0

Czy próbowałeś już pokazać formularz, a następnie dostosować lokalizację?

Edycja: Czy próbowałeś dopasować właściwości Lewy i Górny?

+0

Tak, próbowałem tego. I jego BringToFront() - to jest problem, a nie Show() - ing.Ale próbowałem też doprowadzić do przodu, a następnie dostosować lokalizację ... nadal nic. – novacara

+0

Tak, ten sam problem. Wydaje się, że problem polega przede wszystkim na tym, że Show() nie pozwala na ustawienie StartPosition tak, jak powinno, więc nie ma potrzeby ponownego lokalizowania. Po drugie, maksymalizując dziecko, przesuwa go w dół o 1 piksel i 1 piksel, chociaż nie rozumiem, dlaczego jest on zmaksymalizowany początkowo, ale znajduje się tam, gdzie powinien. Jeśli nie maksymalizuję to rodzic mdi daje paski przewijania i zdecydowanie tego nie chcę. Jeśli zmienię formularz na 1px w lewo i na górze, gdzie jest teraz, początkowo wyświetla się niepoprawnie, ale poprawnie, gdy wprowadzam bringtofront(). Wszystko, czego chcę, to obejście! – novacara

1

Przypuszczam, że formularze są przenoszone przez kod, który obsługuje żądania Show() (i BringToFront), więc naprawdę nie można ustawić położenia formularza - ani przed, ani po wywołaniu metody - ponieważ lokalizacja formularza zostanie zaktualizowana po kod w twoim głównym oknie został wykonany (i pozostawił kontrolę nad pompą wiadomości okna, w zasadzie Win32).

Chciałbym użyć podklasy formularza dla każdego formularza, a następnie dodać jawną właściwość Point, która wskazuje stałą pozycję, w której oczekuje się, że konkretny formularz będzie. W tej klasie nadpisaj wirtualną metodę OnShown (lub być może także metodę OnActivated) i po prostu zaktualizuj to położenie. Lokalizacja z poprawną lokalizacją.

To powinno zmusić formularze do poprawnej pozycji, nawet jeśli jakiś kod w formularzach okien zmienia go w pewnym momencie.

1

Czy próbowałeś:

this.Location 

lub

Form.ActiveForm.Location?

15

Jeśli chcesz ustawić lokalizację formularza, musisz ustawić WindowState do WindowState na Normal (w każdym innym ustawieniu, lokalizacja jest ustawiona zgodnie z regułami tego ustawienia, więc twoja wartość jest ignorowana), oraz jego StartPosition do Manual.

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

"TDull" skąd pochodzisz? ქართველი ხარ ...! – IremadzeArchil19910311