Rodzaje okien w WinApi

0

Witam ponownie,
Znowu mam kilka pytań odnośnie WinApi i będę ogromnie wdzięczny za kolejną pomoc.
Zaznaczam, że przed zadaniem pytania korzystałem z google!

  1. Zacznę może od pytania czym właściwie różni się zwykłe okno aplikacji od okna dialogowego (niemodalnego)? Jakie cechy różnią oba te okna? Czy jest jakaś znacząca różnica? (różnica między oknem modalnym jest oczywista).

  2. Chciałem się również zapytać czy kontrolki w WinApi to okna dialogowe niemodalne czy zwykłe okna (niedialogowe)?

  3. Kolejne pytanie dot. tworzenia okien dialogowych w kodzie. Jeżeli chce zbudować okno dialogowe bez korzystania z zasobów tj. przy użyciu funkcji CreateWindowEx() to jak w zasadzie to zrobić? Doczytałem, że powinienem użyć stylu WC_DIALOG w klasie okna (czyli WNDCLASSEX), ale w msdn nie ma wymienionego takiego stylu i mam wątpliwość, czy ten styl nie powinien być wymieniony np. w funkcji CreateWindowEx()? A jeśli tak to w dwExStyle czy dwStyle?).

  4. Jak chce utworzyć okno dialogowe przy użyciu funkcji CreateWindowEx() to jak odróżnić, że ma to być okno modalne, a jak niemodalne?

  5. Na koniec mam pytanie odnośnie umieszczenia w oknie głównym lub innym ale niedialogowym kontrolek typu radiobutton. Otóż przeczytałem, że funkcje typu: CheckDlgButton(), CheckRadioButton(), IsDlgButtonChecked() działają tylko w oknach dialogowych. Pytanie więc jak sprawdzić zaznaczenie kontrolki, gdy jest umieszczona w zwykłym oknie?

Z góry dziękuję za udzieloną pomoc.
pozdrawiam

P.S. jeśli znacie odpowiedź tylko na poszczególne pytania to odpowiedzcie na te, które znacie odpowiedź.

0
  1. Trochę ciężko odpowiedzieć na to pytanie (przynajmniej ja nie bardzo umiem) po mojemu właściwie niczym się nie różnią poza komunikatami (np. zamiast WM_CREATE jest WM_INITDIALOG) i zastosowaniem okna dialogowa mało kiedy są głównymi oknami programu a raczej takimi służącymi do komunikacji z użytkownikiem wyświetlanymi na chwilę.

  2. Tak i tak zależy jeżeli mamy okno z zasobów i na nim kontrolki to na 100% są to okna dialogowe np. aby uzyskać uchwyt takiej kontrolki trzeba użyć funkcji GetDlgItem

  3. WC_DIALOG to nie styl a stała klasy okna dialogowego

  4. Modalne okna dialogowe zawierają styl DS_MODALFRAME

  5. Komunikat BM_GETCHECK lub makro Button_GetCheck

0
  1. Zacznę może od pytania czym właściwie różni się zwykłe okno aplikacji od okna dialogowego (niemodalnego)? Jakie cechy różnią oba te okna? Czy jest jakaś znacząca różnica? (różnica między oknem modalnym jest oczywista).
    To nie okno się różni, tylko pętla komunikatów. Dialog niemodalny podczepia się pod twoją pętlę komunilatów głównego okna, zjadając swoje komunikaty w wywołaniu IsDialogMessage - komunikaty te są wysyłane do odpowiedniego DialogProc, które nie jest do końca takie samo co WindowProc.

Dialog modalny przy otwarciu robi EnableWindow(false) na swoim parencie, a potem wpada we własną blokującą pętlę komunikatów. To jest samo w sobie łatwe do napisania - ale trzeba pamiętać o wielu drobnych szczegółach, jak prawidłowe reagowanie na taba (WS_TABSTOP) i niektóre skróty klawiaturowe (tym się zajmuje IsDialogMessage) - dlatego właśnie są gotowe funkcje winapi do dialogów.

  1. Chciałem się również zapytać czy kontrolki w WinApi to okna dialogowe niemodalne czy zwykłe okna (niedialogowe)?

Pojęcie modalności w przypadku kontrolek nie ma sensu. Kontrolki to zwykłe okna z własnym WindowProc i bez pętli komunikatów (te są obsługiwane przez twoją główną pętlę).
Zarejestruj sobie klasę (RegisterClass) okna z jakimś WM_PAINT i reagującego na kliknięcie (zmianą koloru albo messageboxem). Wstaw do okna głównego tak jak się wstawia buttona (czyli z parentem na okno, styl WS_VISIBLE | WS_CHILD). Działa? działa.

Jak chce utworzyć okno dialogowe przy użyciu funkcji CreateWindowEx() to jak odróżnić, że ma to być okno modalne, a jak niemodalne?
Raymond Chen podawał kiedyś na swoim blogu kod źródłowy funkcyj DialogBox*‌ i CreateDialog*‌, więc nie ma w tym magii i można zasymulować dialogi samemu. Nie znajdę teraz linka.

0

PS. z tego co pamiętam, DialogBox() wygląda mniej więcej tak (pseudokod):

void DialogBox(...)
{
   HWND dialog = CreateDialog(...);
   EnableWindow(parent, false);
   while (GetMessage(...)) ... // pętla komunikatów
   // w WM_DESTROY jest EnableWindow(parent, true);
}

czyli dialog modalny jest dialogiem „niemodalnym” po czym następuje blokująca pętla komunikatów.

0

Dziękuję Wam bardzo za odpowiedzi.
Poczytałem jeszcze trochę o omawianym problemie i sporo się wyjaśniło ;-).

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