Dwie formy zawsze „tak samo widoczne”

0

Mam dwie formy zawsze widoczne:
** public partial class FormGl : Form
{
private FormImg Form_Img = new FormImg();
...
**
Nie ma problemu by zmusić formę (Form_Img) do tego by była zawsze na wierzchu (TopMost=true) ale zasugerowano mi potrzebę takiego ustawienia obu form by:

  • Form_Img była zawsze widoczna nad FormGl
  • gdy jakieś inne okno (program obcy) znajdzie się nad FormGl to ma przykrywać także Form_Img
  • gdy FormGl pojawi się na wierzchu to FormImgma byc nad nim (patrz p.1)

Obecnie program udaje mi się ustawić tak by Form_Img był:

  • zawsze na wierzchu, nawet jak FormGl jest przesłonięty
  • minimalizował się gdy minimalizuje się FormGl i maksymalizował się gdy maksymalizuje się FormGl (klikanie w pasek zadań)

Czy możliwe jest rozwiązanie tego problemu w ramach Visual Studio C#

1

Wydaje mi się, że tutaj jest rozwiązanie twojego przypadku C# - How to deal with 2 “TopMost” Forms? Przeczytałem twój problem chyba z dwadzieścia razy i nie jestem pewien, czy dobrze zrozumiałem.

0

Niestety, to rozwiązanie nie działa - jest rozwiązaniem innego problemu. Zresztą w samym (tamtym) pytaniu problem dotyczył tylko(!) dwóch formularzy ze sobą powiązanych. Nie pytano o ich "współdziałanie" z innymi oknami otwartymi w Windows. W moim przypadku program ma poprawnie ustawione wszystkie formularze. Problem polega na tym, że formularz potomny jest zawsze na wierzchu nawet gdy formularz "rodzicielski" jest przykryty przez inne okno Windows. A chciałbym by inne okno Windows działało zawsze tak samo na oba formularze mojego programu - albo było nad oboma albo pod oboma - nigdy pomiędzy.

0

Poczytaj o Panel.ZIndex. Nie jestem w stanie teraz tego przetestować jak działa na dialogach, ale jeżeli chodzi o kontrolki użytkownika działa poprawnie

1

Dlaczego musisz stosować takie czary mary? z czego to wynika? Jaki problem próbujesz rozwiązać. Generalnie nie powinno się grzebać z top most właśnie przez takie problemy.

Prawdopodbnie bedziesz musiał poszukać metod w winApi, np. SetWindowPos moze cos rozwiąze Twój problem.

Jeśli nie znajdzie w winApi czegość co magicznie zrobi robote za Ciebie. To będziesz musiał napisać wrapery na topMost i inne pokrewne i podpiąć się pod ewenty w taki sposób zeby każda zmiana tego co Cie interesuje zamiast lokalnie, szła przez scentralizowany algorytm który ustawi wszystko jak należy. Robota jest dość parszywa, i pewnie powalczysz dłuzsza chwile z bugami. Plus skończysz skończysz z jakimś managerem okien, bo gdzieś musisz pamiętać które okno było które. Jeśli chcesz mieć względnie to czysto to owrapowane metody wydziel jako interfejs, i nigdy nie ustawiaj tych pół z palca tylko zawsze przez interfejs. Jeśli skończysz z managerem, to możesz o wparowywać nim istniejące formy. IMagicWindow MagicOrderMangaer.CreateMagicWindow(Form form)

0

Dlaczego?
Form1 - zawiera listę (podgląd danych bazy) - zawsze widoczne, chociaż czasami nieaktywne
Form2 - zawiera dane dodatkowe do akurat wskazanego na Form1 rekordu, pobrane z innych baz, oraz "obrazek". Czasami niewidoczne zawsze tylko do odczytu.
Form3, Form4 - usługowe, gdy się pojawiają znika Form2.
Umieszczenie wszystkich danych na jednym formularzu jest co prawda możliwe ale "nieeleganckie" i nielogiczne - wiem, wiem rasowi informatycy się ze mną nie zgodzą. ;-)

Za rady bardzo dziękuję, obawiałem się że tym się to skończy ale chciałem skonsultować z kimś mądrzejszym ode mnie.
Jeszcze raz dziękuję
Witold

0

Udało się w śmiesznie prosty sposób:

  private void Form1_Activated(object sender, EventArgs e)
  {
   Form2.TopMost = true;
  }

  private void Form1_Deactivate(object sender, EventArgs e)
  {
   Form2.TopMost =false;
  }
0

Przepraszam, ale starałem się opisać problem jak najlepiej.
Przy okazji wskazane jest potestować kwestię włączania i wyłączania 'TopMost' w 'Form1_Activated' i 'Form1_Deactivate' w konkretnym programie. W moim, przy ustawieniu jak wyżej, program się "wygłupiał" choć działał. By działał poprawnie wystarczyło tylko użycie 'Form1_Deactivate'.

0
WJJ03 napisał(a):

Umieszczenie wszystkich danych na jednym formularzu jest co prawda możliwe ale "nieeleganckie" i nielogiczne - wiem, wiem rasowi informatycy się ze mną nie zgodzą. ;-)

Nie wiem, czy jestem rasowy, ale się odezwę.

Pomysł ten formy nadrzędnej wcale nie jest głupi, to upraszcza wiele spraw. Nie ma całej tej dyskusji o kolejności.
Tyle że na niej nie powinny leżeć "atomowe" kontrolki, a zaledwie cztery Twoje komponenty (w tym niektóre w niektórych chwilach niewidoczne)

Nie wiem, czy wiesz, że w WinForms bardzo łatwo, bez jakiejś tajemnej wiedzy, możesz zrobić swój komponent? Tak jak w Studio powołujesz nową Form, to obok jest UserComponent
U ciebie taki komponent to alter-ego Form1 czy Form2 (tych "cząstkowych" form)
Taki oddzielny komponent ma swoje źródła .cs, co tzreba ma prywatne, czyli masz to separację, i rasowi informatycy już nie plują, i/a zarazem możesz go położyć na jednej dużej Form (tej nadrzędnej)

Milion lat temu tak wyratowałem projekt w Bornad C++, gdzie mega-forma zawierała pierdylard zakładek, plik miał 50tys linii (linii, nie znaków. Co więcej, poprzednikowi do głowy nie przyszło dostrzec, że te zakładki powtarzają się w innej mega-formie - były wklejone i już po 2mc developmentu totalnie inne). Tam było z tym sporo roboty, w Win Forms jest bajecznie

0

Dziękuję za dodatkowe informacje, mój kod jest przy Twoim malutki - ma jakieś 10 tys.linii kodu (bez komentarzy).
A co do Twojego pomysłu to jest on interesujący. Może spróbuję przy innym projekcie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1