Ĺadny brzuch
Witam,
W jaki sposób można zmienić sposób tryb okna modalnego na normalne przy zastosowaniu funkcji API?
Słabo kojarze, ale zamiast .ShowModal dajesz .Show danej formy :P
To byłoby zbyt proste pytanie dla eksperta :P
Chcę zmienić atrybuty wyświetlaniego okna dialogowego. Funkcja GetWindowLong dla parametów GWL_EXSTYLE i GWL_STYLE zwraca mi takie same wartości dla okna otwartego za pomocą funkcji Show i ShowModal. Wynoszą one odpowiednio: $16CF0000 i $10100.
Więc teraz myślę, że dobrze rozumiesz moje pytanie :P
To byłoby zbyt proste pytanie dla eksperta :P
Chcę zmienić atrybuty wyświetlaniego okna dialogowego. Funkcja GetWindowLong dla parametów GWL_EXSTYLE i GWL_STYLE zwraca mi takie same wartości dla okna otwartego za pomocą funkcji Show i ShowModal. Wynoszą one odpowiednio: $16CF0000 i $10100.
Więc teraz myślę, że dobrze rozumiesz moje pytanie :P
Mogę się mylić, ale wydaje mi się że jest to niemożliwe. Styl okna jest zawsze taki sam. Różnica jest w jego wywoływaniu. Okno niemodalne jest wołane jakby na nowym wątku (dzięki czemu nie blokuje działania rodzica), a modalne na tym samym co rodzic.
Trzebaby dokłądnie zapoznać się ze strukturami funkcji Show i ShowModal.
Jeśli się mylę to chętnie poznam prawidłową odpowiedź, także ta jak zmienić tryb okienka.
Dzieki za wypowiedz :) Trudno sie z Tobą zgodzić w 100%. W każdym razie musze ten problem rozwiązać. Jeżeli mi się uda to dam znać w tym poście.
Użytkownik stan24 edytował ten post 26 kwiecień 2007, 14:06
Luknąłem w w WinHelpa (winapi) i w zasadzie obydwa okna są wywoływane identycznie. To co je różni to oczywiście nazwa funkcji: DialogBox vs. CreateDialog (co ciekawe funkcje mają takie same parametry), oraz to, że windows wyłącza okno nadrzędne przy wywołaniu modalnym (i tylko to). Oczywiście w czasie startu wysyła jeszcze WM_CANCELMODE, ale to chyba nie ma większego znaczenia w późniejszym działaniu aplikacji.
W helpie napisano, że można łatwo zmienić zachowanie okienka modalnego włączając poprostu okno nadrzędne. Czyżby trik godny eksperta? Zamiast wysyłać jakieś komunikaty do okienka modalnego włączamy poprostu okno nadrzędne :) phi...
Najważniejszy fragment z oryginału (moim zdaniem):
When the owner window is not already disabled, Windows automatically disables the window and any child windows belonging to it when it creates the modal dialog box. The owner window remains disabled until the dialog box is destroyed. Although a dialog box procedure could potentially enable the owner window at any time, enabling the owner defeats the purpose of the modal dialog box and is not recommended. When the dialog box procedure is destroyed, Windows enables the owner window again, but only if the modal dialog box caused the owner to be disabled.
As Windows creates the modal dialog box, it sends the WM_CANCELMODE message to the window (if any) currently capturing mouse input. An application that receives this message should release the mouse capture so that the user can move the mouse in the modal dialog box. Because Windows disables the owner window, all mouse input is lost if the owner fails to release the mouse upon receiving this message.
Jeszcze raz wielkie dzieki za pomoc :)
Ja mam przypadek troche trudniejszy Okno->OknoDlg1->OknoDlg2 /obydwa okna Dlg sa modalne/. Problem jaki postanowilem rozwiazac to wpisywanie warości do opowiednich kontrolek bez utraty możliwości stereowania Oknem glownym. Na razie robie to tak:
1) Tworzę wątek
2) W wątku otwieram OknoDlg1, wysylam komunikat WM_CANCELMODE jezeli okno ma ustawienia CaptureMode, "klikam" w odpowiedni Btn w celu otworzenia OknaDlg2, ukrywam oknoDlg1, koncze watek.
3) Dla oknaDlg2 podobnie jw wysylam komunikat WM_CANCELMODE, zmieniam rodzica na Okno glowne i ukrywam. Tu dość ciekawa sprawa, żeby można było ukryć oknoDlg2 musze odczekać ok. 100ms, Funkcje jakie testowałem: pętla Handle=0, IsVisible ect. zawodzą. Pomimo, że mam uchwyt okna nie mogę go ukryć.
4) Zamykam OknoDlg1
Bardzo skomplikowane. Niedawno robilem to chyba prosciej lecz przy porzadkowaniu programu pomysł gdzieś zaginął. Dlatego jeszcze nie zamykam tego tematu. Za wszczelkie wskazówki z gory wielkie dzieki. :)
Użytkownik stan24 edytował ten post 26 kwiecień 2007, 20:13
W helpie napisano, że można łatwo zmienić zachowanie okienka modalnego włączając poprostu okno nadrzędne. Czyżby trik godny eksperta? Zamiast wysyłać jakieś komunikaty do okienka modalnego włączamy poprostu okno nadrzędne :) phi...
Rzeczywiście tak jest. Czasami rozwiązanie jest tak proste, że aż trudno na nie wpaść.
Przyznam szczerze, że spodziewałem się czegoś bardziej skomplikowanego. Znowu magicy Bila mnie zaskoczyli ;-)
Poprostu proste jest piekne :)
Używam już EnableWindow(hMain, true) i program działa jak należy. Bez konieczności zmieniania rodzica.
Zamykam temat. :(
Dzieki jeszcze raz
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
W jaki sposób można zmienić sposób tryb okna modalnego na normalne przy zastosowaniu funkcji API?
Słabo kojarze, ale zamiast .ShowModal dajesz .Show danej formy :P
To byłoby zbyt proste pytanie dla eksperta :P
Chcę zmienić atrybuty wyświetlaniego okna dialogowego. Funkcja GetWindowLong dla parametów GWL_EXSTYLE i GWL_STYLE zwraca mi takie same wartości dla okna otwartego za pomocą funkcji Show i ShowModal. Wynoszą one odpowiednio: $16CF0000 i $10100.
Więc teraz myślę, że dobrze rozumiesz moje pytanie :P
To byłoby zbyt proste pytanie dla eksperta :P
Chcę zmienić atrybuty wyświetlaniego okna dialogowego. Funkcja GetWindowLong dla parametów GWL_EXSTYLE i GWL_STYLE zwraca mi takie same wartości dla okna otwartego za pomocą funkcji Show i ShowModal. Wynoszą one odpowiednio: $16CF0000 i $10100.
Więc teraz myślę, że dobrze rozumiesz moje pytanie :P
Mogę się mylić, ale wydaje mi się że jest to niemożliwe. Styl okna jest zawsze taki sam. Różnica jest w jego wywoływaniu. Okno niemodalne jest wołane jakby na nowym wątku (dzięki czemu nie blokuje działania rodzica), a modalne na tym samym co rodzic.
Trzebaby dokłądnie zapoznać się ze strukturami funkcji Show i ShowModal.
Jeśli się mylę to chętnie poznam prawidłową odpowiedź, także ta jak zmienić tryb okienka.
Dzieki za wypowiedz :) Trudno sie z Tobą zgodzić w 100%. W każdym razie musze ten problem rozwiązać. Jeżeli mi się uda to dam znać w tym poście.
Użytkownik stan24 edytował ten post 26 kwiecień 2007, 14:06
Luknąłem w w WinHelpa (winapi) i w zasadzie obydwa okna są wywoływane identycznie. To co je różni to oczywiście nazwa funkcji: DialogBox vs. CreateDialog (co ciekawe funkcje mają takie same parametry), oraz to, że windows wyłącza okno nadrzędne przy wywołaniu modalnym (i tylko to). Oczywiście w czasie startu wysyła jeszcze WM_CANCELMODE, ale to chyba nie ma większego znaczenia w późniejszym działaniu aplikacji.
W helpie napisano, że można łatwo zmienić zachowanie okienka modalnego włączając poprostu okno nadrzędne. Czyżby trik godny eksperta? Zamiast wysyłać jakieś komunikaty do okienka modalnego włączamy poprostu okno nadrzędne :) phi...
Najważniejszy fragment z oryginału (moim zdaniem):
When the owner window is not already disabled, Windows automatically disables the window and any child windows belonging to it when it creates the modal dialog box. The owner window remains disabled until the dialog box is destroyed. Although a dialog box procedure could potentially enable the owner window at any time, enabling the owner defeats the purpose of the modal dialog box and is not recommended. When the dialog box procedure is destroyed, Windows enables the owner window again, but only if the modal dialog box caused the owner to be disabled.
As Windows creates the modal dialog box, it sends the WM_CANCELMODE message to the window (if any) currently capturing mouse input. An application that receives this message should release the mouse capture so that the user can move the mouse in the modal dialog box. Because Windows disables the owner window, all mouse input is lost if the owner fails to release the mouse upon receiving this message.
Jeszcze raz wielkie dzieki za pomoc :)
Ja mam przypadek troche trudniejszy Okno->OknoDlg1->OknoDlg2 /obydwa okna Dlg sa modalne/. Problem jaki postanowilem rozwiazac to wpisywanie warości do opowiednich kontrolek bez utraty możliwości stereowania Oknem glownym. Na razie robie to tak:
1) Tworzę wątek
2) W wątku otwieram OknoDlg1, wysylam komunikat WM_CANCELMODE jezeli okno ma ustawienia CaptureMode, "klikam" w odpowiedni Btn w celu otworzenia OknaDlg2, ukrywam oknoDlg1, koncze watek.
3) Dla oknaDlg2 podobnie jw wysylam komunikat WM_CANCELMODE, zmieniam rodzica na Okno glowne i ukrywam. Tu dość ciekawa sprawa, żeby można było ukryć oknoDlg2 musze odczekać ok. 100ms, Funkcje jakie testowałem: pętla Handle=0, IsVisible ect. zawodzą. Pomimo, że mam uchwyt okna nie mogę go ukryć.
4) Zamykam OknoDlg1
Bardzo skomplikowane. Niedawno robilem to chyba prosciej lecz przy porzadkowaniu programu pomysł gdzieś zaginął. Dlatego jeszcze nie zamykam tego tematu. Za wszczelkie wskazówki z gory wielkie dzieki. :)
Użytkownik stan24 edytował ten post 26 kwiecień 2007, 20:13
W helpie napisano, że można łatwo zmienić zachowanie okienka modalnego włączając poprostu okno nadrzędne. Czyżby trik godny eksperta? Zamiast wysyłać jakieś komunikaty do okienka modalnego włączamy poprostu okno nadrzędne :) phi...
Rzeczywiście tak jest. Czasami rozwiązanie jest tak proste, że aż trudno na nie wpaść.
Przyznam szczerze, że spodziewałem się czegoś bardziej skomplikowanego. Znowu magicy Bila mnie zaskoczyli ;-)
Poprostu proste jest piekne :)
Używam już EnableWindow(hMain, true) i program działa jak należy. Bez konieczności zmieniania rodzica.
Zamykam temat. :(
Dzieki jeszcze raz