Do nich też i tylko do nich będzie się w tym rozdziale odnosić sam termin okno. - PDF\nDownload "Do nich też i tylko do nich będzie się w tym rozdziale odnosić sam termin okno."\n1 2 ANATOMIA OKNA Nauczycielem wszystkiego jest praktyka. Juliusz Cezar W systemie Windows składniki interfejsu użytkownika nazywamy oknami. Nadmieniłem w poprzednim rozdziale, iż określeniem tym obdarzamy zarówno te prostokątne obszary ekranu, które również użytkownicy nazywają oknami, jak i umieszczone na nich kontrolki w rodzaju przycisków czy pól tekstowych. Obecnie jednak zajmiemy się tylko oknami w rozumieniu potocznym - dogłębnie poznamy proces ich tworzenia oraz istnienia i interaktywności. Do nich też i tylko do nich będzie się w tym rozdziale odnosić sam termin okno. Okna, o których będziemy mówili, są często (szczególnie w wizualnych środowiskach programowania) zwane formularzami, formatkami lub formami (ang. forms). Zanim jeszcze przejdziemy do zaplanowych zagadnień, musimy sprecyzować sobie kilka(naście) pojęć odnoszących do okien w Windows. Mam przez to na myśli poszczególne elementy okna, przedstawione na poniższym rysunku: Rysunek 7. Elementy okna\n2 372 Większość z nich nie powinna być ci obca, jako że nieustannie stykasz się z nimi, użytkując komputer. Warto aczkolwiek wyjaśnić sobie wszystkie: obszar klienta lub obszar kliencki (ang. client area) zajmuje prawie cały rysunek i nie jest to przypadek: stanowi on bowiem jedyną obowiązkową (!) część okna. Wszystkie pozostałe elementy, zwane łącznie obszarem pozaklienckim (ang. non-client area), mogą być zmieniane za pośrednictwem styli okna; powiemy sobie o tym dokładnie w dalszym ciągu rozdziału. Czym jest jednak obszar klienta? Otóż jest to właściwa treść okna: umieszczane są tutaj kontrolki potomne, tutaj przebiega też rysowanie za pośrednictwem funkcji Windows GDI, ogólnie mówiąc - jest to rejon okna, którego zagospodarowanie leży całkowicie w rękach programisty. System operacyjny zasadniczo nie wtrąca się więc ani do wyglądu obszaru klienta, ani do jego zachowania się w reakcji na zdarzenia pasek tytułu jest umiejscowiony na górze okna. Zgodnie ze swoją nazwą ma on przede wszystkim wyróżniać je spośród innych okien w systemie. Posiada również dodatkową funkcję, mianowicie pozwala na przesuwanie okna po ekranie poprzez proste i intuicyjne przeciąganie. Pasek tytułu zawiera też takie elementy jak: ikona - oprócz efektu wizualnego ma ona także bardziej praktyczny sens: jednokrotne kliknięcie weń przyciskiem myszy powoduje pokazanie menu sterowania oknem, pozwalającego na zmianę jego rozmiarów i położenia, a także na zamknięcie okna (co można też zrobić poprzez dwukrotne kliknięcie w ikonę lub jednokrotne przyciśnięcie prawego przycisku myszy w dowolnym innym miejscu pasku tytułu) tytuł okna zawiera zwykle nazwę aplikacji, jeżeli jest to okno główne programu, lub inny znaczący napis przycisk minimalizacji redukuje okno do postaci przycisku na pasku zadań. Niektóre aplikacje zmieniają aczkolwiek jego działanie i sprawiają, że po kilknięciu w ten przycisk okno pojawia się jako ikona na zasobniku systemowym (ang. system tray), obok zegara. Dotyczy to najczęściej programów przeznaczonych do pracy w tle przycisk maksymalizacji rozszerza gabaryty okna tak, że zajmuje ono cały ekran. Ten przycisk może być jednak nieaktywny - jest tak szczególnie wtedy, kiedy okno w ogóle nie pozwala na zmianę swych rozmiarów. Warto też przypomnieć, że dwukrotne kliknięcie w pasek tytułu między ikoną a trójką przycisków także powoduje maksymalizację okna przycisk zamknięcia służy do zakończenia pracy z oknem i zamknięcia go, co w przypadku okna głównego wiąże się z zamknięciem całej aplikacji. Programy pracujące w tle często zmieniają znaczenie tego przycisku na odesłanie okna do zasobnika systemowego; wówczas muszą jednak zapewnić inny sposób zakończenia swej pracy pasek menu jest obecny najczęściej w głównych oknach programów i zazwyczaj zawiera wszystkie oferowane przez nie funkcje, pogrupowane w logiczne listy (to, na ile są one logiczne, zależy już jednak od umiejętności projektanta aplikacji :)) brzeg okna zamyka jego ramy ze wszystkich stron i w większości przypadków pozwala też na zmianę rozmiarów okna poprzez przeciąganie wybranej krawędzi. Niekiedy jednak okno ma ustalone stałe rozmiary i wówczas brzeg okna jest jego całkowicie statycznym elementem W tym przeglądzie składników okna należałoby jeszcze zwrócić uwagę na to, że w funkcjonowanie prawie każdego z nich, z wyjątkiem obszaru klienta, w jakiś sposób ingeruje system operacyjny. W przykładzie z poprzedniego rozdziału nie musieliśmy przecież pisać kodu odpowiedzialnego za zmianę wymiarów okna, a mimo to taka zmiana była jak najbardziej możliwa. Podobnie jest z przesuwaniem, maksymalizacją czy minimalizacją - zadania te bierze na siebie sam system Windows, pozwalając jednak programiście na wykonywanie przy ich okazji jakichś innych, własnych czynności.\n3 373 Po tym krótkim zaprzyjaźnieniu się z oknem i jego elementami możemy już zająć się właściwymi zadaniami, związanymi z tworzeniem okna, różnorodnymi manipulacjami na nim oraz reakcją na najważniejsze komunikaty o zdarzeniach. Temu wszystkiego będzie poświęcony niniejszy rozdział. Początki okna Zdajemy sobie chyba sprawę, że utworzenie własnego okna nie jest wcale tak proste jak wywołanie CreateWindowEx(). O nie, absolutnie nie jest tak różowo :) Najpierw należy przecież zarejestrować klasę okna (co wiążę się z napisaniem jego procedury zdarzeniowej), a dopiero potem możemy myśleć o wykreowaniu tego własnego kawałka interfejsu użytkownika, jakim jest niewątpliwie okno. Proces jego tworzenia składa się więc z dwóch etapów, którym musimy się stanowczo lepiej przyjrzeć. Niemal wszystko o klasie okna Jestem prawie pewien, że zadajesz sobie to pytanie: Dlaczego musimy rejestrować klasę okna? Czy nie lepiej byłoby, gdyby jego utworzenie sprowadzało się tylko do wywołania jednej funkcji, przyjmującej może więcej parametrów albo jedną strukturę? Tak byłoby przecież wygodniej, czyż nie? Rzeczywiście, pytania te są uzasadnione zwłaszcza teraz, gdy zajmujemy się tylko jednym głównym oknem aplikacji. Jednakże zdajemy sobie chyba sprawę, że nie wszystkie programy tak robią. Ba, większość tworzy kilka kopii swoich okien - weźmy choćby Eksplorator Windows czy niektóre bardziej zaawansowane edytory tekstu. Nie wspomnę już o tym, że kontrolki takie jak przyciski czy pola tekstowe również posiadają swe własne klasy (poznamy je wkrótce) i tym przypadku jest to ogromna korzyść dla każdej aplikacji, która nie musi się zajmować każdym szczegółem GUI z osobna; zrzuca ten obowiązek na system Windows właśnie za pomocą wbudowanych klas okien. A zatem klasy okien nie są wcale stworzone ku pognębieniu programisty, lecz raczej dla jego wygody. Niezależnie od tego, jak jest naprawdę, powinniśmy dokładnie omówić wszystkie cechy owych klas, przechowywane w strukturze WNDCLASSEX. I tym się zaraz zajmiemy; mam nadzieję, że pamiętasz, jakie pola zawiera ta struktura :) Ewentualnie możesz je sobie przypomnieć, zaglądając do poprzedniego rozdziału. Teraz jednak przejdźmy już do rzeczy. Dwa kluczowe pola Spośród wszystkich pól WNDCLASSEX bodaj najważniejsze są te dwa: lpszclassname i lpfnwndproc. Sądząc po ich nazwach w notacji węgierskiej, oba są wskaźnikami - ale na tym podobieństwa się kończą. Nazwa klasy okna lpszclassname przechowuje nazwę klasy w postaci stałego łańcucha znaków typu C, a więc zmiennej typu const char* (albo const wchar_t*), lub też, będąc w zgodzie z nazewnictwem nagłówków Windows, typu LPCTSTR. Nazwa ta powinna oddawać charakter przyszłych okien klasy - szczególnie role, jaką będą pełnić w programie. Dobrze też, aby nazwa ta była możliwie krótka. Procedura zdarzeniowa Drugim bardzo ważnym polem struktury WNDCLASSEX jest lpfnwndproc. Pole to ma zawierać wskaźnik do procedury zdarzeniowej, jaka będzie początkowo odpowiedzialna za reakcję na zdarzenia powstające w oknach klasy. Jest to więc zwykły\n4 374 wskaźnik na funkcję w C++, ze wszystkimi tego konsekwencjami. Typ WNDPROC, jakim legitymuje się to pole, jest zaś zdefiniowany jako: typedef LRESULT (* CALLBACK WNDPROC)(HWND, UINT, WPARAM, LPARAM); Funkcja, jaką przypiszemy do lpfnwndproc, musi się zatem ściśle zgadzać z prototypem procedury zdarzeniowej, który podaliśmy sobie w zeszłym rozdziale. Pod to wymaganie podpadają oczywiście właściwie zdefiniowane funkcje globalne, ale dobrze jest też pamiętać, iż procedurą zdarzeniową może być również statyczna metoda klasy. Wiedza o tym staje się bowiem użyteczna w momencie, gdy chcemy napisać obiektową otoczkę na funkcje Windows API dotyczące okien. Instancja aplikacji Nie mniej istotny niż te dwa pola jest także uchwyt hinstance. Identyfikuje on instancję programu, która zarejestrowała daną klasę okna. Można spytać: po co systemowi taka informacja? Otóż przy jej pomocy może on w odpowiednim czasie (po zakończeniu programu) wyrejestrować naszą klasę. Nie zmusza nas w ten sposób do wywoływania funkcji UnregisterClassEx(), która tym się zajmuje. Mimo to niektórzy przywołują ją tuż przed zwróceniem wyniku przez WinMain(), aby zachować pozory doskonałego porządku ;D Nie jest to jednak konieczne. Styl klasy okna Następne pole style określa niektóre dodatkowe ustawienia, które łącznie nazywamy stylem klasy okna. To pole jest kombinacją flag bitowych wybranych między innymi spośród tych przedstawionych w tabeli: flaga CS_DBLCLKS CS_DROPSHADOW CS_NOCLOSE CS_OWNDC CS_CLASSDC CS_HREDRAW CS_VREDRAW CS_SAVEBITS znaczenie Ustawienie tej flagi powoduje, że okno należące do klasy będzie otrzymywało komunikaty o dwukrotnych kliknięciach myszą, zachodzących w jego obrębie (zarówno w obszarze klienta, jak i poza nim). Bez tej flagi okno będzie mogło reagować tylko na pojedyncze kliknięcia przycisków myszy. Flaga ta, działająca póki co tylko w Windows XP, powoduje włączenie dla okien klasy wizualnego efektu polegającego na rzucaniu półprzezrzoczystego cienia - pod warunkiem, że użytkownik nie wyłączył tego typu efektów w Panelu Sterowania. Przy tej fladze włączonej okna należące do klasy mają nieaktywny przycisk zamknięcia. Zwykle muszą więc udostępniać inne sposoby zakończenia pracy. Flaga ta powoduje, że każde okno posiada swój własny, stały kontekst urządzenia. Jest to przydatne przy rysowaniu na powierzchni okna, do którego ten kontekst jest potrzebny; o rysowaniu powiemy sobie co nieco w tym rozdziale, a wyczerpująco w rozdziale o Windows GDI. Ta flaga, wykluczająca poprzednią, sprawia, że wszystkie klasy okna dzielą wspólny kontekst urządzenia. Włączenie tej opcji wymusza odrysowywanie całej zawartości okna po zmianie jego szerokości. Flaga podobna do poprzedniej, tyle że powoduje odrysowywanie całego obszaru klienta po zmianie wysokości okna. Ta opcja sprawia, że zachowywaniem wizualnej zawartości okna zajmuje się sam system Windows. Otóż dla każdego okna utrzymuje on dodatkową bitmapę, którą wykorzystuje w momencie odtwarzania\n5 375 flaga znaczenie wyglądu okna. Jego odrysowywaniem nie jest więc wtedy obarczona aplikacja, ale w zamian zostaje zajęta pewna część pamięci operacyjnej, potrzebna dla przechowywania wspomnianej bitmapy. Z tego względu styl CS_SAVEBITS działa efektywnie tylko dla małych okien. Tabela 26. Flagi bitowe stylów klasy okna Spora część stylów okna dotyczy kontroli jego wyglądu na ekranie, czyli procesu, który nazywamy tutaj odrysowywaniem. Polega on na wysyłaniu do okna komunikatu WM_PAINT w chwili, gdy ma ono pokazać konkretny fragment swego obszaru klienta. Procedura zdarzeniowa może wtedy obsłużyć ten komunikat i wykonać odpowiednie czynności, zazwyczaj przy użyciu interfejsu graficznego GDI. Rozwiązanie to sprawia, że system operacyjny nie musi składować fotografii bieżącego stanu każdego okna i oszczędza w ten sposób mnóstwo pamięci RAM. Dotyczy to aczkolwiek tylko tych okien, których klasy nie zawierają stylu CS_SAVEBITS. Co do samego odrysowywania, to na ten temat wypowiem się szerzej przy okazji prezentacji komunikatu WM_PAINT. Ikony i kursor Pola hicon, hiconsm i hcursor przechowują uchwyty do trzech ważnych dla okna obrazków. hicon i hiconsm określają odpowiednio: dużą i małą ikonę okna. Ta druga jest zwykle wyświetlana w jego lewym górnym rogu oraz na pasku zadań. Duża ikona pojawia się natomiast po wciśnięciu kombinacji klawiszy Alt+Tab, służącej przełączaniu się między programami. hicon powinno zawierać uchwyt do obrazka mającego wymiary co najmniej pikseli, zaś hiconsm musi wskazywać na ikonę o rozmiarze przynajmniej pikseli. W rzeczywistości obrazki te mogą być większe, a więc w praktyce obu polom przypisuje się często ten sam uchwyt do dużej ikony (32 32). Jest to jak najbardziej poprawne rozwiązanie. Ten sam skutek daje też wyzerowanie pola hiconsm. Pole hcursor utrzymuje z kolei uchwyt do obrazka kursora myszy. Kiedy wskaźnik komputerowego gryzonia zatrzyma się na oknie przynależnym tworzonej klasie, wówczas kursor przyjmie wygląd podanego tutaj obrazka. Może to być własna bitmapa, ale najczęściej stosuje się standardową strzałkę lub jeden z pozostałych kursorów systemowych. Wczytywanie obrazków ikon oraz kursorów nie jest wcale banalnym zadaniem i dlatego warto przedyskutować je dokładnie, co też uczynimy tutaj. Krótkie wprowadzenie do zasobów Ikony oraz kursory są dość specyficznymi rodzajami obrazków, gdyż są w zasadzie niezbędne do działania aplikacji w Windows. Dlatego też system operacyjny umożliwia przechowywanie ich w samym pliku wykonywalnym EXE w postaci tzw. zasobów (ang. resources). Zagadnienie zasobów (którymi mogą być nie tylko bitmapy) jest na tyle interesujące, że poświęcimy mu jeden z przyszłych rozdziałów. Na razie jednak powinieneś wiedzieć tylko, że każdy zasób programu jest identyfikowany poprzez unikalną liczbę całkowitą lub łańcuch znaków; dla wygody liczbom nadaje się w kodzie znaczące nazwy stałych.\n6 376 Identyfikatory zasobów są ustalane przez programistę piszącego tzw. skrypt zasobów (ang. resource script), który po kompilacji i linkowaniu staje się częścią gotowego programu, wraz z samymi zasobami. Program może teraz, w trakcie swego działania, sięgać do zapisanych w swoim pliku EXE zasobów i wyciągać z nich chociażby obrazki ikon czy kursorów. Wykorzystuje je potem na przykład przy rejestrowaniu klas okien. Do wczytywania tych obrazków z zasobów służą spotkane już wcześniej funkcje LoadIcon() i LoadCursor(). Istnieją wszakże również inne sposoby na uzyskiwanie takich bitmap - o nich też sobie powiemy. Ikony małe i duże Najprostszą drogą uzyskania uchwytu do ikony okna jest użycie funkcji LoadIcon(): HICON LoadIcon(HINSTANCE hinstance, LPCTSTR lpiconname); Żąda ona dwóch parametrów, z których pierwszy określa uchwyt instancji naszego programu; podajemy go, gdy chcemy wczytać ikonę z zasobów. Jeśli natomiast zadowalamy się jedną ze standardowych ikon systemu Windows (a tak będzie jeszcze przez jakiś czas), wpisujemy tutaj wartość NULL. Drugi parametr to identyfikator wczytywanego zasobu. Windows stosuje całkiem pomysłowy sposób, który pozwala przekazać tutaj zarówno liczbę, jak i napis w stylu C. Dla nas jednak ważniejsze jest to, że możemy tu podać także jedną ze stałych odpowiadających standardowym ikonom systemowym: stałe IDI_APPLICATION IDI_ASTERISK IDI_INFORMATION IDI_ERROR IDI_HAND IDI_EXCLAMATION IDI_WARNING ikona w Win 9x ikona w Win XP uwagi domyślna ikona aplikacji; tą ikoną są opatrzone pliki EXE, które nie mają w swoich zasobach żadnych innych ikon są to te same ikony, które spotkaliśmy przy okazji omawiania funkcji MessageBox() IDI_QUESTION IDI_WINLOGO w Windows XP logo systemu zostało zastąpione przez tą samą ikonę, której odpowiada stała IDI_APPLICATION Tabela 27. Standardowe ikony okien w Windows Wybór nie jest zbyt duży, ale dla potrzeb nauki Windows API okaże się chyba wystarczający :) Gdy zaś nauczysz się korzystać z zasobów (a może i wcześniej? ), wówczas upiększysz swoje okna dowolnymi ikonami. Kształt kursora Analogiczną do LoadIcon() funkcją, wczytującą obrazek kursora, jest LoadCursor(): HCURSOR LoadCursor(HINSTANCE hinstance, LPCTSTR lpcursorname);\n7 377 Takie samo znaczenie mają również jej parametry. W przypadku pierwszego z nich będziemy jednak częściej niż w LoadIcon() wpisywać NULL, ażeby skorzystać z jednego ze standardowych kursorów: stała nazwa kursora obrazek kursora uwagi IDC_ARROW standardowy i domyślny kursor wybór normalny Windows kursor ten pojawia się, gdy wykonywane jest jakieś IDC_WAIT zajęty pracochłonne zadanie, które nie pozwala na normalną pracę aplikacji ten kursor wskazuje na IDC_APPSTARTING wykonywanie jakiegoś zadania, praca w tle które nie zakłóca zbytnio użytkowania programu tym kursorem wskazujemy IDC_HELP element interfejsu użytkownika, wybór Pomocy na temat którego chcemy uzyskać pomoc kontekstową IDC_CROSS wybór precyzyjny może służyć jako celownik ;-) IDC_NO pojawia się przy przeciąganiu w niedostępny niedozwolone miejsce IDC_IBEAM wybór tekstowy wybór miejsca w polu tekstowym IDC_HAND IDC_UPARROW IDC_SIZEALL IDC_SIZENESW IDC_SIZENS IDC_SIZENWSE IDC_SIZEWE wybór łącza wybór alternatywny przenieś zmiana rozmiaru po przekątnej slashowej zmiana rozmiaru pionowego zmiana rozmiaru po przekątnej backslashowej zmiana rozmiaru poziomego pokazuje się, gdy przywiedziemy mysz nad hiperłącze ukazuje się nie tylko przy przenoszeniu, ale i przy zmianie rozmiarów we wszystkich czterech kierunkach (np. w edytorach 3D) kursory te pojawiają się, kiedy chcemy zmienić rozmiar okna Tabela 28. Standardowe kursory Windows (nazwy z Panelu Sterowania lub własne) Prawie zawsze wybierać będziemy zwykłą strzałkę, czyli wariant IDC_ARROW. Lepszy model Funkcje LoadIcon() i LoadCursor() mogą się słusznie wydawać ograniczone. Teoretycznie zostały one nawet zastąpione przez inną funkcję, LoadImage(): HANDLE LoadImage(HINSTANCE hinstance, // uchwyt instancji zasobów LPCTSTR lpszname, // nazwa zasobu lub pliku UINT utype, // typ obrazka int cxdesired, // docelowa szerokość\n8 378 int cydesired, UINT fuload); // docelowa wysokość // flagi wczytywania Już na pierwszy rzut oka wydaje się ona bardziej skomplikowana, a zatem musi oferować większe możliwości - i tak rzeczywiście jest. Dokładne omówienie tej funkcji nie jest nam jednak teraz potrzebne, jako że dokonamy go przy opisie Windows GDI. Skoncetrujemy się raczej na dwóch zagadnieniach: sposobie, w jaki LoadImage() zastępuje obie opisane wcześniej funkcje oraz wczytywaniu obrazków ikon i kursorów z plików na dysku. Dociekliwi mogą naturalnie zajrzeć do MSDN po kompletny opis funkcji LoadImage(). A więc - żeby wczytać ikonę i kursor dla klasy okna możemy użyć instrukcji podobnych do tych: KlasaOkna.hIcon = (HICON) LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, 0); KlasaOkna.hCursor = (HCURSOR) LoadImage(NULL, IDC_CURSOR, IMAGE_CURSOR, 0, 0, 0); Widzimy, że pierwsze dwa parametry LoadImage() są identyczne jak w przypadku LoadIcon() i LoadCursor(). Trzeci parametr określa typ wczytywanego obrazka, a użyte w nim stałe IMAGE_ICON i IMAGE_CURSOR oznaczają odpowiednio ikonę i obrazek kursora (jest jeszcze IMAGE_BITMAP, wskazująca na zwykłą bitmapę). Pozostałe parametry są zaś wyzerowane, zatem Windows przyjmie dla nich wartości domyślne. Na koniec, po wywołaniu funkcji LoadImage(), musimy jeszcze zrzutować wartość, którą ona zwróci. Jest to bowiem ogólny uchwyt typu HANDLE, natomiast my potrzebujemy bardziej szczegółowego rodzaju: uchwytu do ikony (HICON) oraz do kursora (HCURSOR). Odpowiednie rzutowanie załatwia więc tę drobną sprawę. Nietrudno zmiarkować, że użycie LoadImage() jest nieco bardziej kłopotliwe niż dwóch poznanych wcześniej funkcji. Możemy przeto zrezygnować z niego, gdy zależy nam tylko na wczytaniu ikony lub kursora z zasobów programu czy ze zbiorów systemowych. Jeśli jednak zamierzamy odczytać obrazek z pliku graficznego na dysku, wówczas nie mamy już takiego wyboru; zobaczmy zatem, jak należy wtedy postąpić. Oto instrukcja wczytująca ikonę okna z pliku dyskowego: KlasaOkna.hIcon = (HICON) LoadImage(NULL, "C:\_\_Windows\_\_ikona.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE); Nazwę tego pliku podajemy w drugim parametrze, a oprócz niej musimy jeszcze poinformować funkcję o tym, skąd chcemy uzyskać ikonę - robimy to poprzez flagę LR_LOADFROMFILE w ostatnim parametrze. Tło okna To co nazywamy potocznie tłem okna jest tak naprawdę tłem jego obszaru klienta, albo raczej sposobem jego wypełniania. W Windows GDI za graficzne wypełnianie jakiegoś kształtu odpowiada obiekt zwany pędzlem (ang. brush). Może on definiować nie tylko jednolity kolor, ale i dwubarwny deseń czy nawet kafelkowanie bitmapą. Wszystkie te sposoby wypełniania można zaś stosować do obszaru klienta okna: należy jedynie podać uchwyt do odpowiedniego pędzla w parametrze hbrbackground struktury WNDCLASSEX. Skąd jednak wziąć potrzebny pędzel? Zasadniczo są po temu trzy sposoby. Pierwszym z nich jest posłużenie się stałą, za którą kryje się jeden z kolorów systemowych Windows. Kolory te ustala użytkownik w Panelu Sterowania wedle własnych upodobań, a spośród nich najbardziej interesujący dla nas jest ten, który został wybrany dla wnętrza okien. Reprezentuje go stała COLOR_WINDOW; możemy więc użyć jej tak:\n9 379 KlasaOkna.hbrBackground = (HBRUSH) COLOR_WINDOW; Drugim nierzadko spotykanym sposobem jest wykorzystanie jednego z globalnych obiektów pędzli, które Windows utrzymuje dla wygody programisty. Uchwyt do któregoś z tych pędzli można uzyskać za pośrednictwem funkcji GetStockObject(): KlasaOkna.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); Powyższa linijka sprawi, że okno będzie wypełnione jednolitym kolorem białym - wskazuje na to parametr WHITE_BRUSH. Wszelako istnieją także inne pędzle do wyboru (wszystkie jednokolorowe) - przedstawia je poniższa tabelka: stała nazwa koloru kolor BLACK_BRUSH czarny DKGRAY_BRUSH ciemnoszary GRAY_BRUSH szary LTGRAY_BRUSH jasnoszary WHITE_BRUSH biały Tabela 29. Kolorowe pędzle dostępne poprzez funkcję GetStockObject() Nareszcie, właściwy pędzel dla wypełnienia okna możemy stworzyć sobie sami. Jest to najbardziej elastyczne rozwiązanie, jako że mamy przy nim dostęp do wszystkich możliwości pędzli, jakie oferuje Windows GDI - nie musimy chociażby ograniczać się do jednolitego koloru pędzla. Spójrzmy na przykład na okno wypełnione wzorem obrazków ściśle przylegających do siebie: Screen 57. Okno wypełnione sąsiadującymi kopiami bitmapy Efekt ten można osiągnąć w całkiem prosty sposób. Należy w tym celu stworzyć po prostu odpowiedni pędzel: // PatternWindow - okno wypełnione kafelkami bitmapy // (fragmenty funkcji WinMain()) HBITMAP hbitmapa; HBRUSH hpedzelokna; // tworzymy pędzel wypełnienia okna hbitmapa = (HBITMAP) LoadImage(NULL, "pattern.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); hpedzelokna = CreatePatternBrush(hBitmapa);\n10 380 Tworzymy go przy pomocy funkcji CreatePatternBrush(). Jest ona jedną z kilku funkcji Windows GDI służących temu celowi, które omówimy dokładnie przy okazji rozdziału poświęconego tej bibliotece. Funkcja żąda uchwytu do bitmapy, która ma być kafelkowana ; bitmapę tą wczytujemy znaną już metodą poprzez funkcję LoadImage(), podając jej nazwę pliku graficznego (plik ten jest dołączony do programu przykładowego). Mając zaś uchwyt do pędzla, przypisujemy go do składowej hbrbackground: KlasaOkna.hbrBackground = hpedzelokna; Dalej możemy już zwyczajnie zarejestrować klasę okna i stworzyć samo okno. Po zakończeniu pętli komunikatów, tuż przed zwróceniem wyniku funkcji WinMain(), musimy jeszcze pamiętać o usunięciu pędzla oraz skojarzonej z nim bitmapy: DeleteObject (hpedzelokna); DeleteObject (hbitmapa); Nie jest to trudne - wystarczy posłużyć się procedurą DeleteObject(), podając jej oba uchwyty. Pozostałe składowe Pozostały jeszcze trzy pola struktury WNDCLASSEX, a skoro zostawiliśmy je na koniec, to pewnie nie są zbyt ważne ;) Faktycznie, zwykle wpisuje się w nich zera. lpszmenuname jest identyfikatorem zasobu paska menu, które to menu będzie posiadało każde okno danej klasy. Otóż tak się składa, że menu jest jednym z rodzajów zasobów Windows, zapisywanym wraz z kodem aplikacji (ale poza nim) w pliku EXE. W polu lpszmenuname podajemy więc identyfikator tego zasobu; obowiązują tu takie same zasady, jak przy podawaniu podobnych identyfikatorów w funkcjach LoadImage(), LoadIcon() czy LoadCursor() - identyfikator może więc być łańcuchem znaków albo liczbą. Najczęściej aczkolwiek wpisujemy tu NULL, nawet jeśli docelowo okno ma posiadać jakiś pasek menu. Można go bowiem stworzyć innymi drogami. Ostatnie dwa pola - cbclsextra i cbwndextra - specyfikują ilość bajtów dodatkowej pamięci, jaką system Windows zaalokuje (odpowiednio) dla całej klasy i dla każdego jej okna. Niestety, trudno posądzić te pola o większą przydatność, skoro maksymalna ilość takiej pamięci to aż 40 bajtów (!). W dodatku dostęp do niej jest bardzo kłopotliwy, gdyż musi się odbywać wyłącznie poprzez funkcje SetClassLong[Ptr]() i SetWindowLong[Ptr](). Powody te wyjaśniają, dlaczego niemal zawsze w obu polach ustawia się wartość 0. Rejestracja klasy okna Po wypełnieniu struktury WNDCLASSEX możemy zarejestrować klasę okna, używając do tego funkcji RegisterClassEx(): ATOM RegisterClassEx(CONST WNDCLASSEX* lpwcx); Jak doskonale wiemy, przyjmuje ona jeden parametr - wskaźnik na naszą strukturę. W zamian zwraca zaś tzw. atom, który jest 16-bitową liczbą identyfikującą zarejestrowaną klasę. Atom ten możemy zachować w osobnej zmiennej i używać w wywołaniach tych funkcji, które żadają nazwy klasy okna (jak np. CreateWindowEx()). W zasadzie jednak nie jest to zbyt powszechna praktyka.\n11 381 Rezultatem zwracanym przez RegisterClassEx() można się aczkolwiek zainteresować także z innego powodu. Stosuje się bowiem do niego tradycyjna konwencja Windows API, na mocy której zero jest wynikiem świadczącym o błędzie. Do celów diagnostycznych możemy więc używać instrukcji if podobnej do tej: if (!RegisterClassEx(&KlasaOkna)) MessageBox (NULL, "Błąd podczas rejestracji klasy okna!", "Błąd", MB_OK MB_ICONERROR); return 1; } Wystąpienie błędu przy rejestracji okna wskazuje na niepoprawność jednej ze składowych WNDCLASSEX - najczęściej chodzi tu zapewne o któryś z uchwytów. Tworzenie okna właściwego Gdy zarejestrujemy klasę okna, mamy już za sobą pierwszy krok jego kreacji. Teraz możemy już wywołać CreateWindowEx() i podać jej ten tuzin wymaganych parametrów, w zamian cieszyć się stworzonym oknem i otrzymać uchwyt do niego. By tego dokonać trzeba oczywiście wiedzieć, jakie informacje podać funkcji w tych kilkunastu parametrach. Spójrzmy więc na nie. W tym momencie przydałoby się, abyś przypomniał sobie prototyp funkcji CreateWindowEx(). Nazwa klasy okna i uchwyt instancji programu Ponownie jedną z najważniejszych danych jest nazwa klasy okna; tym razem potrzebuje jej system, by powiązać tworzone okna z zarejestrowaną wcześniej klasą. Nazwę tej klasy podajemy w drugim parametrze, lpclassname. Warto już teraz wiedzieć (będzie nam to potrzebne przy okazji kontrolek), że nazwa ta nie musi odnosić się do klasy zdefiniowanej przez nas samych, lecz także do jednej z wbudowanych w system globalnych klas okien (kontrolek). Alternatywnie możemy też podać w lpclassname atom, który zwróciła w wyniku funkcja RegisterClassEx(). W parze z klasą okną idzie też uchwyt do instancji programu, który należy podać jako jedenasty (przedostatni) parametr CreateWindowEx(). Należy go podać, ponieważ w Windows klasy okna rejestrowane przez programistę są związane właśnie z instancjami programów; dzięki temu system unika kłopotów ze zdublowanymi nazwami tych klas. Tytuł okna Trzeci parametr, lpwindowname, nazywany tytułem okna, jest tak naprawdę tylko tekstem, który będzie w tym oknie wyświetlony albo i nie. W przypadku omawianych przez nas okien pojawi się on na pasku tytułu - pod warunkiem, że okno będzie takowy pasek posiadać (bo wcale nie musi!). Jeżeli zaś chodzi na przykład o kontrolki, to interpretacja napisu podanego w lpwindowname zależy ściśle od ich rodzaju. Tytuł (tekst) istniejącego okna można zmieniać za pomocą funkcji SetWindowText().\n12 382 Styl okna Czwarty z kolei parametr - dwstyle - to styl okna. Ma on bodaj największy wpływ na zewnętrzną aparycję okna, a częściowo także i na jego zachowanie. Wartość ta jest przy tym kombinacją flag bitowych, a zatem umożliwia ustawienie wielu różnorodnych aspektów okna. Zostały one zebrane w poniższej tabeli: grupa flagi nazwa stylu uwagi Jedyną cechą wyróżniającą okno WS_CHILD WS_CHILDWINDOW okno potomne potomne od zwykłego jest brak możliwości posiadania przez nie menu. WS_OVERLAPPED Trwałe okno to takie, które może być WS_TILED okno trwałe wyświetlane jako niemodalne. WS_POPUP Takie okno może być wyświetlane okno wyskakujące tylko jako modalne. Krawędź okna z takim stylem jest narysowana cienką linią i nie reaguje WS_BORDER stałe obramowanie na przeciąganie (nie można więc zmienić rozmiaru okna, ciągnąc za jego brzeg). Zmienne obramowanie okna jest WS_THICKFRAME zmienne narysowane grubą linią i pozwala na WS_SIZEBOX obramowanie zmianę rozmiaru okna poprzez przeciąganie krawędzi. Ustala obramowanie typowe dla okien WS_DLGRAME obramowanie okna dialogowych; okno z tym stylem nie dialogowego może mieć paska tytułu (stylu WS_CAPTION). WS_CAPTION Okno z tym stylem posiada widoczny pasek tytułu pasek tytułu. Styl ten powoduje obecność ikonki w lewym górnym rogu okna. Kliknięcie WS_SYSMENU menu sterujące na tą ikonkę powoduje pokazanie menu sterującego. By styl ten zadziałał, należy podać także flagę WS_CAPTION. WS_MAXIMIZEBOX Tworzy okno z obecnym przyciskiem przycisk maksymalizacji. maksymalizacji Flaga WS_SYSMENU jest również /przywracania wymagana. Tworzy okno z obecnym przyciskiem WS_MINIMIZEBOX przycisk minimalizacji. minimalizacji Flaga WS_SYSMENU jest również wymagana. Okno z tym stylem jest widoczne na WS_VISIBLE widoczne okno ekranie od razu po utworzeniu (nie trzeba stosować dlań funkcji ShowWindow()). rodzaj okna krawędź okna pasek tytułu począt kowy stan okna\n13 383 grupa flagi nazwa stylu uwagi WS_MAXIMIZE okno Po utworzeniu okno jest widoczne i zmaksymalizowane zmaksymalizowane. Okno z tym stylem jest z początku WS_ICONIC okno WS_MINIMIZE zredukowane do przycisku na pasku zminimalizowane zadań. Styl ten dezaktywuje okno - tak, że nie reaguje ono na działania użytkownika. Okno można uaktywnić z powrotem za pomocą funkcji WS_DISABLED nieaktywne okno EnableWindow(). paski przew ijania WS_HSCROLL WS_VSCROLL poziomy pasek przewijania pionowy pasek przewijania Tabela 30. Flagi bitowe stylu okna Styl ten stosuje się raczej do kontrolek, rzadko do normalnych okien. Tworzy okno z poziomym paskiem przewijania. Tworzy okno z pionowym paskiem przewijania. Jak widać na załączonym obrazku, możliwych flag jest naprawdę mnóstwo. Dają one prawie nieograniczone możliwości w budowaniu wizerunku i funkcjonowania okna, gdyż uwzględniają wszystkie jego cechy. Bez styli okno jest bowiem tylko gołym obszarem klienta, pozbawionym nawet obramowania, nie mówiąc już choćby o pasku tytułu. Potęga ta ma jednak swoją wadę: stworzenie przy jej pomocy sensownego okna wymaga podania przynajmniej kilku różnych styli, co prowadzi do rozbudowanych alternatyw bitowych. Poza tym trzeba jeszcze pamiętać właściwe nazwy poszczególnych flag. Na szczęście problemy te zostały rozwiązane przez samych twórców Windows API. Wprowadzili oni mianowicie dodatkowe makra, kombinujące po kilka styli, i nadali im krótsze nazwy. Makr tych możemy więc używać pojedynczo lub w połączeniu z innymi jeszcze stylami - zupełnie tak, jakby same były flagami bitowymi. Listę owych makr (nie jest ich zbyt dużo) przedstawia nam ta oto tabelka: makra złączone flagi uwagi WS_BORDER WS_POPUP WS_SYSMENU WS_POPUPWINDOW WS_OVERLAPPEDWINDOW WS_TILEDWINDOW WS_OVERLAPPED WS_CAPTION WS_SYSMENU WS_THICKFRAME WS_MINIMIZEBOX WS_MAXIMIZEBOX Tabela 31. Predefiniowane makra stylu okna Wraz z flagą WS_CAPTION makro to stanowi odpowiedni styl dla okien modalnych. Wariant właściwych dla okien głównych aplikacji, które mogą dopuszczać zmianę swego rozmiaru. Są one zazwyczaj bardzo wygodne, ponieważ nawet jeśli nie odpowiada nam któraś z flag, jakie zawierają, możemy ją wyłączyć np. w ten sposób: WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX // wyłącza przycisk maksymalizacji Oczywiście nic nie stoi też na przeszkodzie, byśmy sami definiowali sobie przydatne nam makra, jak choćby takie:\n14 384 // trwałe okno o stałym rozmiarze #define WS_FIXEDWINDOW (WS_OVERLAPPED WS_CAPTION WS_BORDER WS_SYSMENU WS_MINIMIZEDBOX) // trwałe okno na pełnym ekranie #define WS_FULLSCREENWINDOW (WS_OVERLAPPED WS_MAXIMIZE) Wszystko zależy bowiem od konkretnych potrzeb w pisanym programie. Rozszerzony styl okna Wraz z rozwojem systemu Windows pojawiły się nowe możliwości dostosowywania okien i kontroli ich zachowania. Te nowe opcje, nazywane rozszerzonym stylem okna (ang. extended window style), nie są niezbędne w każdej sytuacji. Spora część z nich ma zresztą dość specyficzne zastosowanie; niemniej jednak istnieje kilka flag, które mogą być niekiedy przydatne. Oto one: flaga nazwa stylu opis WS_EX_CONTEXTHELP WS_EX_TOOLWINDOW przycisk pomocy kontekstowej okno narzędziowe Flaga ta powoduje pojawienie się na pasku tytułu przycisku ze znakiem zapytania. Kliknięcie w niego uaktywnia tryb pomocy kontekstowej; kiedy teraz użytkownik kliknie gdzieś we wnętrzu okna, otrzyma ono specjalny komunikat WM_HELP. W reakcji na niego powinno zostać pokazane wyskakujące okno z objaśnieniem. Styl ten nie może występować razem z WS_MINIMIZEBOX lub WS_MAXIMIZEBOX. Tworzy okno pływającego paska narzędzi. Takie okno ma węższy pasek tytuły, a sam tytuł jest na nim pisany mniejszą czcionką. Poza tym takie okno nie jest nigdy pokazywane na pasku zadań. Screen 58. Okno z włączonym stylem WS_EX_TOOLWINDOW WS_EX_TOPMOST zawsze na wierzchu (ang. stay on top) Okno oznaczone tą flagą jest wyświetlane przed wszystkimi innymi oknami, nawet wtedy, gdy jest ono nieaktywne. Ten styl może być dodawany i usuwany również poprzez funkcję SetWindowPos(). Tabela 32. Flagi bitowe rozszerzonego stylu okna Kombinację tych flag (którą jest najczęściej po prostu NULL) podajemy w pierwszym parametrze funkcji CreateWindowEx(), dwexstyle. Obecność tego parametru jest zresztą jedyną różnicą między CreateWindowEx() a zwykłą CreateWindow(). Pozycja na ekranie i wymiary okna Cztery parametry funkcji CreateWindowEx(), począwszy od piątego aż do ósmego, określają rejon na ekranie monitora, który będzie (początkowo) zajmowało tworzone\n15 385 okno. Definiuje go pozycja lewego górnego rogu okna we współrzędnych ekranu, podawanych w parametrach x i y, oraz szerokość i wysokość okna - parametry nwidth i nheight. Ważka kwestia rozdzielczości Wszystkie te wielkości podajemy w pikselach. Sprawia to, że wizualny efekt, jaki wywiera okno, jest w dużym stopniu zależny od stosowanej u użytkownika rozdzielczości ekranu. Teoretycznie możemy ją programowo zmieniać, ale zachowanie takie jest wielce niepożądane w środowisku, gdzie naraz działa wiele aplikacji - jak w Windows. W zasadzie jednak nie jest to aż takim problemem, jako że wymiary okna powinny być w większości przypadków stałe i niezależne od rozdzielczości. Pozostaje jedynie sprawa umiejscowienia okna na ekranie - najczęściej chcemy bowiem, aby sytuowało się ono dokładnie pośrodku pulpitu. Aby to osiągnąć, musimy znać jego wymiary i posłużyć się odpowiednimi wzorami: ( ekranu okna ) ( ) x= w w y = h h ekranu w których literki w i h oznaczają odpowiednio szerokość i wysokość ekranu lub okna, zaś x i y - docelowe współrzędne okna na ekranie. I tu mamy kolejny problem, choć na szczęście jest on łatwo rozwiązywalny. Musimy przecież pobrać wymiary ekranu, czyli jego rozdzielczość, by móc wstawić je do powyższych formuł. Do tego celu należy posłużyć się funkcją GetSystemMetrics(): int GetSystemMetrics(int nindex); Funkcja ta może zwracać przeróżne systemowe wartości, związane głównie z wyświetlaniem. Rodzaj poszukiwanych danych podajemy w jej jedynym parametrze; nas interesują najbardziej wielkości SM_CXSCREEN oraz SM_CYSCREEN, oznaczające szerokość i wysokość ekranu pikselach. Jest to więc dokładnie to, o co nam teraz chodzi :) Stworzenie okna umiejscowionego na środku ekranu może zatem wyglądać w ten sposób: // zakładamy, że w uwidth i uheight mamy wymiary okna HWND hokno; hokno = CreateWindowEx( // (pomijamy nieistotne teraz parametry) (GetSystemMetrics(SM_CXSCREEN) - uwidth) / 2, (GetSystemMetrics(SM_CYSCREEN) - uheight) / 2, uwidth, uheight, // (j.w) ); Znając rozdzielczość ekranu możemy też uzależnić od niej szerokość i wysokość okna. Pamiętajmy jednakże, iż może to zburzyć nam ład ewentualnych kontrolek potomnych, umiejscowionych na oknie. Obszar klienta ma zawsze rację W praktyce (szczególnie programisty gier!) nierzadko objawia się jeszcze jeden problem związany z umiejscowieniem okna. Czasem bowiem posiadamy wymiary nie samego okna, lecz tylko jego obszaru klienta. Dzieje się tak na przykład wtedy, gdy chcemy pełnoekranowej grze, działającej w jakiejś stałej rozdzielczości, zapewnić możliwość okna 2 2\n16 386 uruchamiania się w także trybie okienkowym. Wówczas wymiary obszaru klienta okna gry muszą zgadzać się z tą ustaloną wcześniej rozdzielczością pełnoekranową. Jednak samo okno to przecież nie tylko obszar klienta: trzeba do niego dodać przynajmniej jakiś brzeg oraz pasek tytułu. Prawidziwe wymiary okna, które powinniśmy podać do CreateWindowEx(), będą więc większe; również pozycja okna musi zostać odpowiednio zmieniona. Jak podołać tym zadaniom? Otóż system Windows oferuje pewne rozwiązanie, którym jest funkcja AdjustWindowRectEx(): BOOL AdjustWindowRectEx(LPRECT lprect, DWORD dwstyle, BOOL bmenu, DWORD dwexstyle); Wymaga ona podania kilku potrzebnych informacji, wśród których są: styl okna, który należy umieścić w parametrze dwstyle (jest to ten sam styl, który zamierzamy za chwilę podać do CreateWindowEx(). Należy więc zapisać go w jakieś osobnej zmiennej i wykorzystać ją także tutaj) wartość boolowska (true lub false) określająca, czy okno posiada pasek menu rozszerzony styl okna (który także podamy zaraz dla CreateWindowEx()) W zasadzie jednak najważniejszy jest pierwszy parametr, w którym określamy prostokąt obszaru klienta okna. Jest to wskaźnik do specjalnej struktury RECT: struct RECT LONG left; LONG top; LONG right; LONG bottom }; Wyznacza ona prostokąt na ekranie w nieco inny sposób niż omawiane przez cały czas cztery parametry funkcji CreateWindowEx(). O ile bowiem pola left oraz top odpowiadają wartościom x i y - współrzędnych lewego górnego rogu prostokąta, o tyle right i bottom są koordynatami prawego dolnego wierzchołka. Aby obliczyć te składowe, musimy więc dokonać odpowiedniego sumowania: x + nwidth oraz y + nheight. Rysunek 8. Opis prostokąta na ekranie za pomocą pól struktury RECT\n17 387 Ostatecznie skorzystanie z funkcji AdjustWindowRectEx() powinno się przedstawiać mniej więcej tak: // zakładamy, że w zmiennych x, y, nclientwidth i nclientheight mamy // zapisaną pozycję (np. środek ekranu) oraz wymiary // obszaru klienta okna // wypełniamy strukturę RECT RECT rcokno; rcokno.left = x; rcokno.top = y; rcokno.right = x + nclientwidth; rcokno.bottom = y + nclientheight; // ustalamy styl i rozszerzony styl okna DWORD dwstyle = WS_OVERLAPPEDWINDOW; DWORD dwexstyle = NULL; // wywołujemy funkcję AdjustWindowRectEx() AdjustWindowRectEx (&rcokno, dwstyle, false, dwexstyle); No dobrze, ale co ta funkcja właściwie robi? Cóż, to dobre pytanie :) AdjustWindowRectEx() modyfikuje po prostu strukturę podaną jej w pierwszym parametrze w taki sposób, że po wywołaniu opisuje ona już nie obszar klienta okna, ale całe okno - wraz z jego obszarem pozaklienckim. Podczas dokonywania tych modyfikacji funkcja korzysta oczywiście z podanych jej styli oraz obecności lub nieobecności paska menu. Zatrzymajmy się na chwilę, gdyż w tym momencie w zmiennej rcokno mamy zapisaną charakterystykę przestrzenną (tak to nazwijmy ) całego naszego okna. Możemy zatem wywołać już funkcję CreateWindowEx() i utworzyć je: // tworzymy okno HWND hokno; hokno = CreateWindowEx(dwExStyle, "Klasa_okna", "Okno", dwstyle, rcokno.left, rcokno.top, rcokno.right - rcokno.left, rcokno.bottom - rcokno.top, NULL, NULL, hinstance, NULL); Podczas podawania parametrów dokonujemy też niezbędnego przeliczenia ze składowych RECT na współrzędne lewego górnego wierzchołka oraz szerokość i wysokość okna. Jako podsumowanie ukazanej techniki możesz przeczytać opis funkcji AdjustWindowRectEx() w MSDN. Uchwyt do okna nadrzędnego Dziewiąty parametr CreateWindowEx() jest uchwytem do okna nadrzędnego względem tego okna, które właśnie zamerzamy stworzyć. Podając tutaj właściwy uchwyt, umożliwiamy systemowi budowę poprawnej hierarchii okien.\n18 388 Gdy tworzymy okno nadrzędne (ang. top-level), czyli główne okno aplikacji, wówczas jego bezpośrednim i jedynym przodkiem jest tylko i wyłącznie pulpit. Możemy więc podać w parametrze hwndparent wartość uzyskaną z funkcji GetDesktopWindow() - jest to bowiem uchwyt do pulpitu właśnie. Nie ma jednak takiej potrzeby: CreateWindowEx() dopuszcza podanie w tym parametrze uchwytu pustego, czyli NULL; efekt będzie ten sam, a my nie musimy się zbyt wiele napisać :D W Windows 2000 oraz XP jako hwndparent możemy podać także specjalną stałą HWND_MESSAGE. Spowoduje to utworzenie tzw. okna obsługi komunikatów (ang. messageonly window), którego jedynym celem jest odbieranie i wysyłanie komunikatów. Takie okno nie jest widoczne na ekranie, ale umożliwia aplikacji (zwykle usłudze systemowej) normalną interakcję z systemem operacyjnym. Poprawne dobranie okna nadrzędnego jest szczególnie ważne przy tworzeniu kontrolek, czym się zajmiemy w jednym z przyszłych rozdziałów. Uchwyt do paska menu Parametr hmenu funkcji CreateWindowEx() reprezentuje pasek menu, jaki będzie posiadało kreowane okno. Przywilej posiadania takiego paska mają jedynie okna trwałe i wyskakujące, ponadto muszą one mieć także pasek tytułu. Jak pewnie doskonale wiemy, menu jest zestawem opcji ułożonych w grupy, które dają dostęp do wszystkich funkcji programu. Jest to więc twór dość skomplikowany, zajęcie się którym wymaga nieco więcej wysiłku niż tylko wywołania paru funkcji. Przekonamy się o tym w dalszej części kursu. Dodatkowy parametr Ostatni argument CreateWindowEx(), czyli lpparam, jest obecny tylko dla wygody programisty. Możemy w nim przekazać wskaźnik na dowolne dane, które okno ma otrzymać zaraz po swoich narodzinach. Dostanie go wraz z komunikatem WM_CREATE, wysyłanym jeszcze przed powrotem z funkcji CreateWindowEx(). Więcej informacji o tym parametrze możesz znaleźć przy opisie komunikatu WM_CREATE w niniejszym rozdziale. *** W ten sposób dotarliśmy do epilogu procesu tworzenia okna. Teraz powinieneś już na ten temat prawie wszystko albo przynajmniej pamiętać, co gdzie zostało tutaj opisane ;D W następnym podrozdziale zajmiemy się operacjami, jakie można przeprowadzać na utworzonym już oknie. Okna pod kontrolą Windows API oferuje całe mnóstwo narzędzi przeznaczonych do pracy z oknami. Utworzenie własnego okna to bowiem tylko początek jego misji - dalej na właściwości stworzonego obiektu ma duży wpływ zarówno programista, jak i użytkownik. Działania na oknach Z punktu widzenia programisty okna są tworami niemal całkowicie elastycznymi. Zmienić możemy każdy ich aspekt, posługując się do tego odpowiednimi funkcjami. Tym właśnie częściom WinAPI przyjrzymy się tutaj.\n19 389 Pokazywanie i ukrywanie Typowym działaniem na oknie jest jego pokazanie (uczynienie go widocznym) i ukrycie lub też zamknięcie. Sprawdźmy, jak możemy wykonać te działania. Ukazanie i ukrycie okna Dość nieoczekiwanie, zarówno do pokazywania, jak i do ukrywania okna, służy ta sama funkcja ShowWindow(): BOOL ShowWindow(HWND hwnd, int ncmdshow); Na pewno nie jest nam ona całkiem obca, jako że dość dokładnie opisaliśmy ją w poprzednim rozdziale - szczególnie stałe, jakie może przyjąć w drugim parametrze. Teraz więc przypomnimy tylko, że: pokazanie okna z zachowaniem jego rozmiarów i pozycji wymaga wykorzystania stałej SW_SHOW maksymalizacja okna wymaga skorzystania z opcji SW_MAXIMIZE SW_MINIMIZE minimalizuje okno SW_RESTORE przywraca okno zarówno ze stanu maksy-, jak i minimalizacji SW_HIDE ukrywa okno, i to tak skutecznie, że nie będzie nigdzie widoczne - nawet na pasku zadań Ostrożnie należy postępować ze stałą SW_HIDE, zwłaszcza jeśli ukrycie okna ma być spowodowane jakąś akcją użytkownika. Ukryte okno jest bowiem dla niego całkowicie niedostępne, zatem aby mógł on zobaczyć je ponownie, program musi oferować mechanizm przywołania schowanego okna znajdujący się w całkiem innym oknie. Warto byłoby przyjrzeć się opisowi funkcji ShowWindow() w MSDN. Sprawdzanie widoczności okna Używając funkcji ShowWindow() zmieniamy stan widoczności (ang. visibility state albo po prostu window state) okna. Pobranie tego stanu jest również możliwe; nie służy jednak do tego pojedyncza funkcja (która mogłaby zwrócić jakąś stałą wyliczeniową), lecz w sumie aż trzy odrębne wywołania: BOOL IsWindowVisible(HWND hwnd); BOOL IsIconic(HWND hwnd); BOOL IsZoomed(HWND hwnd); Ich postać jest identyczna: każdej funkcji podajemy uchwyt do sprawdzanego okna, a w zamian otrzymujemy wartość boolowską, wskazującą na obecność lub nieobecność danego stanu okna. I tak: IsWindowVisible() informuje nas o tym, czy okno jest widoczne, czy nie IsIconic() mówi, czy okno jest zminimalizowane IsZoomed() powiadamia o ewentualnej maksymalizacji okna Taki sposób pobierania stanu okna może nas aczkolwiek nie zadowalać. Nikt nam wówczas nie zabroni napisania sobie własnej funkcji, spełniającej to zadanie: enum WINDOWSTATE WS_HIDDEN, WS_NORMAL, WS_MAXIMIZED, WS_MINIMIZED }; WINDOWSTATE GetWindowState(HWND hwnd) // najpierw sprawdzamy, czy okno nie jest ukryte if (!IsWindowVisible(hWnd)) return WS_HIDDEN;\n20 390 } // dalej zajmujemy się maksymalizacją i minimalizacją if (IsIconic(hWnd)) return WS_MINIMIZED; else if (IsZoomed(hWnd)) return WS_MAXIMIZED; else return WS_NORMAL; Taka funkcja ma przynajmniej jedną drobną zaletę: lepiej sprawdza się w blokach switch niż trójka procedur Windows API. Pozycja i rozmiar Z wyglądem okna na ekranie wiąże się nie tylko fakt jego widoczności lub niewidoczności, lecz także jego pozycja oraz rozmiar. Wszystkie te wielkości możemy oczywiście zmieniać przy pomocy odpowiednich funkcji WinAPI. Zanim je poznamy, należy jeszcze wspomnieć o układzie odniesienia, jaki stosuje Windows podczas pozycjonowania okien. Otóż początek układu współrzędnych, wedle którego następuje ustawienie położenia okna, znajduje się zawsze w lewym górnym rogu okna nadrzędnego. Fakt ten nie ma specjalnego znaczenia dla głównych okien aplikacji, dla których nadrzędny jest tylko pulpit, szczelnie zakrywający cały ekran; kwestia ta nabierze jednak wymowy, gdy zaczniemy zajmować się oknami potomnymi (kontrolkami). Po wyjaśnieniu tej drobnej sprawy przejdziemy już do sposobów pobierania i ustawiania położenia oraz wielkości okna. Zmiana pozycji i rozmiaru Gdy chcemy jednocześnie zmienić zarówno umiejscowienie okna na ekranie, jak i jego szerokość i wysokość, wtedy najrozsądniejszym wyborem jest funkcja o dosyć mylącej nazwie MoveWindow(): BOOL MoveWindow(HWND hwnd, // uchwyt modyfikowanego okna int X, // nowa współrzędna pozioma int Y, // nowa współrzedna pionowa int nwidth, // nowa szerokość okna int nheight, // nowa wysokość okna BOOL brepaint); // czy odrysowywać zawartość okna? Podajemy w niej zarówno nowe współrzędne okna (o uchwycie wpisanym w pierwszym parametrze), jak i jego nowe wymiary - szerokość i wysokość. Cztery te wielkości zostaną więc bezwarunkowo zmienione. Piąty parametr brepaint określa, czy po dokonaniu operacji na oknie ma ono zostać odrysowane, a więc otrzymać komunikat WM_PAINT. Prawie zawsze chcemy, by tak się właśnie stało, bo wtedy na pewno wszystkie okna na ekranie będą wyglądały poprawnie. W parametrze brepaint podajemy więc wartość TRUE. Nieco inaczej postępujemy, kiedy zależy nam tylko zmianie na położenia okna albo tylko na zmianie jego rozmiaru. Wówczas powinniśmy bowiem skorzystać z bardziej elastycznej funkcji SetWindowPos(): BOOL SetWindowPos(HWND hwnd, HWND hwndinsertafter, int X, int Y, int cx, int cy, UINT uflags); // modyfikowane okna // przykrywające okno // nowa współ. pozioma // nowa współ. pionowa // nowa szerokość // nowa wysokość // flagi\n21 391 Właściwie to potrafi ona nie tylko przesuwać i skalować okno, ale także kontrolować przykrywanie go przez inne okna. Mowa tu o tzw. kolejności przesłaniania lub porządku Z (ang. z-order). Mechanizm ten odpowiada za warstwowe ułożenie okien w interfejsie użytkownika, w którym jedno okno może całkowicie lub częściowo zasłaniać inne. Nazwa porządek Z bierze się stąd, iż zjawisko to sugeruje istnienie trzeciej, wirtualnej pseudoosi współrzędnych Z: Rysunek 9. Porządek Z okien w systemie Windows Oczywiście ta oś tak naprawdę nie istnieje, gdyż nie możemy ustawić okna na określoną współrzedną Z. Możliwe jest jednak umiejscowienie go na niej w pozycji relatywnej do innego okna. W parametrze hwndinsertafter funkcji SetWindowPos() możemy mianowicie podać uchwyt okna, które zostanie umieszczone bezpośrednio przed tym modyfikowanym (podanym w hwnd) w porządku Z (będzie je przesłaniać). Oprócz tego dopuszczalne jest również podanie w tym parametrze jednej z kilku specjalnych wartości o następującym znaczeniu: stała HWND_BOTTOM HWND_TOP HWND_TOPMOST HWND_NOTOPMOST opis Umieszcza okno na spodzie kolejności przesłaniania. Modyfikowane okno będzie więc przykrywane przez wszystkie inne widoczne okna. Okno zostaje umiejscowione na szczycie porządku Z, przykrywając wszystkie pozostałe okno. Umiejscawia okno na szczycie kolejności przesłaniania, a ponadto czyni je oknem typu zawsze na wierzchu (ang. stay on top lub topmost). Takie okno nie jest przesłaniane przez żadne inne okna 111. Okno jest przesuwane za wszystkie okna typu zawsze na wierzchu, lecz przed wszystkimi innymi oknami. Jeżeli przemieszczane okno samo było oknem zawsze na wierzchu, traci ono tę cechę. Tabela 33. Stałe dla parametru hwndinsertafter funkcji SetWindowPos() Pozostałe cztery parametry funkcji SetWindowPos() są analogiczne dla argumentów MoveWindow() i specyfikują odpowiednio: nowe współrzędne (X i Y) przesuwanego okna oraz jego nowe wymiary (cx i cy). Na czym więc polega różnica między tą funkcją a poprzednią? Jest ona znacząca: SetWindowPos() pozwala na zdecydowanie, które z podanych jej parametrów (X i Y, cx i cy oraz hwndinsertafter) mają być faktycznie brane pod uwagę i zmieniane dla okna o uchwycie hwnd. W przeciwieństwie do MoveWindow() nie jesteśmy zmuszeni do zmiany zarówno pozycji, jak i rozmiaru okna - przeciwnie, możemy samodzielnie zadecydować o poczynionych modyfikacjach. 111 A dokładniej mówiąc: przez żadne okno, które samo nie jest typu zawsze na wierzchu.


Hungry Wolf Restaurant Time Out Pub & Grill, Windsor - recenzje restauracji - TripAdvisor\nRestauracja Kawiarnia w lokalizacji East Windsor\nWindsor OSTATNIO PRZEGLĄDANE Brak wyników wyszukiwania DOŁĄCZw:Wyszukaj Informacje o lokalizacji WindsorHoteleRestauracjeAtrakcjeLotyLinie lotniczeNajlepsze w 2017Centrum pomocyZaloguj się Dołącz Podróże Przeglądaj\nKanada Ontario Windsor Windsor Restauracje Hungry Wolf Restaurant Time Out Pub & Grill\nNr 81 wśród 647 Restauracje w lokalizacji Windsor $$ - $$$\nGrecka, Bar, Kanadyjska 3422 Walker Rd, Windsor, Ontario N8W 3S3, Kanada+1 519-250-0811Strona internetowa\nPokaż też MapaSatelitarna Aktualizacje mapy są wstrzymane. Przybliż, aby zobaczyć zaktualizowane informacje. Wyzeruj przybliżenie Trwa aktualizowanie mapy… Wróć do mapy Omówienie 4,0 Liczba recenzji: 39Doskonałe43%B. dobre35%Średnie10%Złe2%Okropne10%Teraz otwarteN11:00 - 00:00Pn - So11:00 - 02:00Wszystkie godziny KUCHNIE Grecka, Bar, Kanadyjska CENA $$ - $$$OCENY ObsługaJedzenieWartośćAtmosferaLOKALIZACJA 3422 Walker Rd, Windsor, Ontario N8W 3S3, KanadaWszystkie szczegóły Ulepsz to ogłoszenieCzy w tej restauracji można dokonać rezerwacji?Tak Nie Nie wiem Czy jest to pub?Tak Nie Nie wiem Czy jest to kanadyjska restauracja? Tak Nie Nie wiem Czy jest to amerykańska restauracja? Tak Nie Nie wiem Czy jest to śródziemnomorska restauracja? Tak Nie Nie wiem Czy ta restauracja jest odpowiednia dla dużych grup?Tak Nie Nie wiem Czy ta restauracja jest odpowiednia na lunch?Tak Nie Nie wiem Czy ta restauracja jest odpowiednia na kolację?Tak Nie Nie wiem Czy ta restauracja oferuje udogodnienia dla osób niepełnosprawnych?Tak Nie Nie wiem Czy ta restauracja oferuje dania dostępne w barach/pubach?Tak Nie Nie wiem Dziękujemy za pomoc! Zanim się wylogujesz, opisz swoje wrażenia. Recenzje (39)Oceny podróżnych Doskonałe10B. dobre8Średnie0Złe0Okropne1Typ podróżnegoRodzinyParyWyjazd w pojedynkęBiznesowaZnajomiOkres roku Mar–majCze–sieWrz–lisGru–lutJęzyk Wszystkie języki polski (19)angielski (39)Język polski (19)angielski (39)Zobacz opinie podróżnych: 1 z 10 wśród 19 recenzji\nTa recenzja została przetłumaczona maszynowo z języka angielskiego Co to jest? Aby można było uzyskać pomoc od jak największej liczby podróżników, ta recenzja zostanie automatycznie przetłumaczona na język polski; treść tłumaczenia może niedokładnie odpowiadać treści oryginału. Mamy nadzieję, że pomoże to w zaplanowaniu wycieczki. Wyświetlić tłumaczenia maszynowe? TakNieKristin ABelle River, Kanada5026Zrecenzowano 1 tydzień temu z urządzeń przenośnych Najlepsze gyro w mieście\nTa recenzja została przetłumaczona maszynowo z języka angielskiego Co to jest? Aby można było uzyskać pomoc od jak największej liczby podróżników, ta recenzja zostanie automatycznie przetłumaczona na język polski; treść tłumaczenia może niedokładnie odpowiadać treści oryginału. Mamy nadzieję, że pomoże to w zaplanowaniu wycieczki. Wyświetlić tłumaczenia maszynowe? TakNiejetsetbetLaSalle, Ontario, Canada82373Zrecenzowano 26 maja 2017 z urządzeń przenośnych smaczny posiłek to świetny stosunek jakości do cenyWięcej\nTa recenzja została przetłumaczona maszynowo z języka angielskiego Co to jest? Aby można było uzyskać pomoc od jak największej liczby podróżników, ta recenzja zostanie automatycznie przetłumaczona na język polski; treść tłumaczenia może niedokładnie odpowiadać treści oryginału. Mamy nadzieję, że pomoże to w zaplanowaniu wycieczki. Wyświetlić tłumaczenia maszynowe? TakNieSandra-AnthonyWindsor Essex Pelee Island, Kanada128Zrecenzowano 22 maja 2017 Dużo jedzenia\nTa recenzja została przetłumaczona maszynowo z języka angielskiego Co to jest? Aby można było uzyskać pomoc od jak największej liczby podróżników, ta recenzja zostanie automatycznie przetłumaczona na język polski; treść tłumaczenia może niedokładnie odpowiadać treści oryginału. Mamy nadzieję, że pomoże to w zaplanowaniu wycieczki. Wyświetlić tłumaczenia maszynowe? TakNieCraig BKingsville, Kanada336Zrecenzowano 18 marca 2017 z urządzeń przenośnych NiesamowiteWięcej\nTa recenzja została przetłumaczona maszynowo z języka angielskiego Co to jest? Aby można było uzyskać pomoc od jak największej liczby podróżników, ta recenzja zostanie automatycznie przetłumaczona na język polski; treść tłumaczenia może niedokładnie odpowiadać treści oryginału. Mamy nadzieję, że pomoże to w zaplanowaniu wycieczki. Wyświetlić tłumaczenia maszynowe? TakNie292normagWindsor104Zrecenzowano 3 lutego 2017 Jedzenie jest bardzo dobre i różnorodne\nTa recenzja została przetłumaczona maszynowo z języka angielskiego Co to jest? Aby można było uzyskać pomoc od jak największej liczby podróżników, ta recenzja zostanie automatycznie przetłumaczona na język polski; treść tłumaczenia może niedokładnie odpowiadać treści oryginału. Mamy nadzieję, że pomoże to w zaplanowaniu wycieczki. Wyświetlić tłumaczenia maszynowe? TakNiewgr60Windsor, Kanada177Zrecenzowano 4 grudnia 2016 Obiad-niespodziankę!Więcej\nTa recenzja została przetłumaczona maszynowo z języka angielskiego Co to jest? Aby można było uzyskać pomoc od jak największej liczby podróżników, ta recenzja zostanie automatycznie przetłumaczona na język polski; treść tłumaczenia może niedokładnie odpowiadać treści oryginału. Mamy nadzieję, że pomoże to w zaplanowaniu wycieczki. Wyświetlić tłumaczenia maszynowe? TakNieTracielynn222Ontario46160Zrecenzowano 15 września 2016 Najlepsze' gyros w mieścieWięcej\nTa recenzja została przetłumaczona maszynowo z języka angielskiego Co to jest? Aby można było uzyskać pomoc od jak największej liczby podróżników, ta recenzja zostanie automatycznie przetłumaczona na język polski; treść tłumaczenia może niedokładnie odpowiadać treści oryginału. Mamy nadzieję, że pomoże to w zaplanowaniu wycieczki. Wyświetlić tłumaczenia maszynowe? TakNieIvan M52Zrecenzowano 24 sierpnia 2016 Fantastyczne miejsceWięcej\nTa recenzja została przetłumaczona maszynowo z języka angielskiego Co to jest? Aby można było uzyskać pomoc od jak największej liczby podróżników, ta recenzja zostanie automatycznie przetłumaczona na język polski; treść tłumaczenia może niedokładnie odpowiadać treści oryginału. Mamy nadzieję, że pomoże to w zaplanowaniu wycieczki. Wyświetlić tłumaczenia maszynowe? TakNiejetsetbetLaSalle, Ontario, Canada82373Zrecenzowano 13 sierpnia 2016 z urządzeń przenośnych 2 wizyt w 1 tydzieńWięcej\nTa recenzja została przetłumaczona maszynowo z języka angielskiego Co to jest? Aby można było uzyskać pomoc od jak największej liczby podróżników, ta recenzja zostanie automatycznie przetłumaczona na język polski; treść tłumaczenia może niedokładnie odpowiadać treści oryginału. Mamy nadzieję, że pomoże to w zaplanowaniu wycieczki. Wyświetlić tłumaczenia maszynowe? TakNieTerry BWindsor, Kanada259Zrecenzowano 8 sierpnia 2016 Niezawodny i smaczne\nPoprzednieNastępne12Trwa aktualizowanie listy... W okolicy Pobliskie restauracjeApplebee'sLiczba recenzji: 92 w odległości 1,5 km Armando'sLiczba recenzji: 45 w odległości 0,56 km Brewin' Bros Beverage CoLiczba recenzji: 13 w odległości 1,15 km Pobliskie atrakcjeOlde Walkerville NeighborhoodLiczba recenzji: 145 w odległości 1,45 km Jackson ParkLiczba recenzji: 131 w odległości 4,35 km Coventry GardensLiczba recenzji: 63 w odległości 4,97 km Canadian Historical Aircraft AssociationLiczba recenzji: 32 w odległości 1,28 km Pytania i odpowiedziUzyskaj szybką odpowiedź od pracowników i klientów obiektu Hungry Wolf Restaurant Time Out Pub & Grill.Uwaga: pytanie zostanie opublikowane na stronie Pytania i odpowiedzi.Weryfikacja: Wskazówki dotyczące publikacjiPrześlij\nGrecka, Bar, Kanadyjska\n3422 Walker Rd, Windsor, Ontario N8W 3S3, Kanada Lokalizacja:\nOkolica: Devonshire Numer telefonu:


Sprawa z pięcioletniego urzędowania Izby Edukacyyney [Józef Lipiński] << KLIKAJ I CZYTAJ ONLINE\n00295 006422 20266172 na godz. na dobę w sumie\nSprawa z pięcioletniego urzędowania Izby Edukacyyney - ebook/epub\nSPRAWA Z PIECIOLETNIEGO URZĘDOWANIA IZBY EDUKACYYNEY, zdana przez Jozefa Lipinskiego, Sekretarza Jeneralnego teyże Izby. Na posiedzenia publicznem przy uroczystem rozwiązaniu przez JW. Ministra Spraw Wera. Izby Edukacyyney, a w prowadzeniu Dyrekcyi. na Dniu 7 Stycznia. 1812. Mówić o staraniu, które Rząd, które Magistratura od Niego ustanowiona podięła w celu wychowania publicznego, iest to mówić o tem, co naymocniey Publiczność Narodową zaymować i co ią nayczuley dotykać może. Ktoż bowiem z Obywatelów nie pokładał swego w przyszłem. Oyczyzny szczęściu? Kto z Polaków nie poświęcał w tych ostatnich zwłaszcza i trudnych dla niey' czasach, własnego i obecnego dobra słodkiey nadziei dalszey Narodu pomyślności i sławy? Izba Edukacyyna przeięta świętością obowiązków swoich, chlubnem siebie od Rządu wezwaniem do pieczy nad wychowanie m publicznem, do starań około ukształcenia wzrastającego Polaków Rodu i zapewnienia dalszych kraiu nadziei, kończąc pięcioletnie urzędowanie, a które na głos Oyczyzny, na zawołanie Narodowego Rządu, od pierwszych chwil wskrzeszenia iego, z gorliwości obywatelskiey przyięła; za naymilszą poczytuie powinność w obliczu powszechności zdać sprawę z usiłowań i czynów, dla dopełnienia tak ważnego celu podiętych; A ieżeli czasowym zaradzaiące potrzebom Rządowe uchwały dotykaiąc Obywateli, czule ich uwagę zwracaią; zaiste ta część opieki Rządowey, która ma za cel los przyszłych pokoleń tyle wyższą umysły zaymuie pewnie troskliwością, ile miłość potomstwa wszystkie inne przechodzi uczucia, Przebiegaiąc dzieie Narodu naszego, z chlubą przekonać się możemy, iż wychowanie młodzieży za nayważnieyszą potrzebę kraiu uznane, żadnemu innemu Oycow naszych nie ustępowała staraniu. Obrona kraiu i edukacya publiczna, zawsze gotowych do czynienia naychętnieyszych ofiar znaydowały Polaków. Dowodzą tey prawdy, nie tylko wspaniałe Królów nadania, ale i szczodre szczególnych obywatelów po całey Polsce ofiary, któremi obdarzali Instytucye wychowaniu poświecone, a dobra zakonu Jezuitów, w którego rękach była Instrukcya publiczna, choć w małey części od zguby zachowane, składaią ieszcze posag właściwy Edukacyi Publiczney i znaczną część iey funduszów (a). Wyrwawszy od zniszczenia zabezpieczyła ie przezorność obywatelska, w czasie naysmutnieyszym dzieiów naszych, a na zwaliskach Zakonu trudniącego się edukacyą, podniosła pierwszym dla obcych wzorem, Magistraturę nad wychowaniem przełożoną. Zdaiąc sprawę z dzisieyszego edukacyi publiczney stanu, wypada z samego rzeczy porządku wstecz nieco zwrócić uwagę, i choć w krótkości poprzedzaiących edukacyi dotknąć dzieiów. Kwitnęły nauki w Polsce, kwitnącey potęgą i wszelkiego rodzaiu chwalą; Imiona uczonych słynęły obok Imion woiowników naszych, wielu tg dwoistą łączyli sławę. Szukał Rodak wszędzie nauki i umieiętności, przywoził ie, a nakoniec znaydował ie u siebie w siedliskach, które im zbudował, i gdzie z niemnieyszym, iak gdziekolwiek bądź przebywały pożytkiem i sławą. Wtedy Narod nasz w równi idąc z innemi, nie ustępował żadnemu w oświeceniu, w posiadaniu nauk, iak nie ustępował w wziętości, potędze i obfitości. Ten stan, iakiegoż za ciągłym z wiekami postępem nie rokował owocu? gdyby nagle wzrost światła przerwanym nie został wprowadzeniem błędney i ciemney Instrukcyi publiczney. Początek nierządu i osłabienia potęgi zszedł się w dzieiach naszych w jedney epoce z początkiem upadku nauk. Wzrastały ciągłym postępem nierząd, klęski i niewiadomość, prowadząc do naywiększego, iakie Narod kiedy spotkać mogło nieszczęścia, światło iednak powszechne wieku przebiiało ciemności, znane było oświeceńszym prawdziwe nieszczęść źrzódło. Chwycili się gorliwie i zręcznie pierwszey sposobności wprowadzenia czystego światła, sposobności, którą los im podał w czasie naywiększych klęsk narodowych, iak gdyby dla założenia przy samym upadku, zawiązku przyszłego powstania, i dla ukształcenia wczesnego pokoleń, które Polaków odrodzić miały – Początek panowania Stasisława Augusta oznaczony był założeniem szkoły Rycerskiey, a Seym pierwszego podziału, Ustawą Magistratury nad wychowaniem przełożoney. Ustanowienie tey pamiętney Kommissyi, iey godne wdzięczności narodowey dzieła, stanowić będą w dzieiach naszych epokę powrotu nauk i oświecenia narodowego. Odebrana pod opiekę Rządową, wydobyta z ciemności przesądów, w którey od dwóch wieków zostawała Instrukcya publiczna, z przytłumieniem w narodzie wszelkich obficie od natury nadanych mu zdatności, spiesznym krokiem (b) zdążala do stopnia Instytutów koleynym wzrostem nauk udoskonalonych. Nagły tych szczęśliwych edukacyi odmian, w narodzie skutek okazał się, w mniemaniach, czynach i czuciach tego pokolenia, które poznawszy Rządowe przesądy, winę przodków i ich błędy, one poprawić i Oyczyznę od zguby, do którey ią tez błędy przywiodły, cnotą i poświęceniem się obywatelskiem bronić i zachować usiłowało. – Seym Konstytucyyny, w którego ustawach światło wieku w tak świetnym okazało się blasku, na którym prawa przyrodzone, prawidła sprawiedliwości i porządku, nie w mniemaniu tylko, ale w ustawach zaiaśniały, na którym miłość dobra publicznego z taką wyższością walczyła z dawnym zepsuciem; Seym ten i następne po nim smutne, lecz nieśmiertelną sławę Polakom po zgonie nawet ich Oyczyzny przynoszące dzieie, okazuią powszechny wzrost oświecenia, a uwaga nad tem, daie poznać widocznie, iak wielki, iak prosty wpływ edukacya publiczna, ma na los narodów. Od wystawienia iaki był stan, iaki los edukacyi w częściach podzielonego kraiu, uwalnia nas świadectwo obecnych nam dzieiów. Należy iednak wspomnieć o stanie edukacyi, w iakim ią znalazła Izba Edukacyyna w tych kraiach, w których obięła opiekę nad wychowaniem publicznem. Należy się Rządowi Pruskiemu tę oddadź sprawiedliwość, ii niebyło mniemaniem iego zasadzać władzy i iey bezpieczeństwa na niewiadomości podległego mu ludu; oświecenie nie tylko wyższych, ale i niższych klass stawało się przedmiotem powolnych starań iego zkierowanych do celu iego polityki. Rząd ten zakładaiąc wiele na stosowaniu edukacyi publiczney do dalszych tak względem mieszkańców, iak i kraiu swoich widoków, zasięgał względem środków rady uczonych swoich. Wysiani znaiomi z pracy dla edukacyi uczeni Meierotto i Gedyke, koleyno zwiedzaiąc ten kray, zastanawiali się nad planem, który od niego miał bydź przyięty. Lecz nim o czynach tego Rządu względem edukacyi powiemy, wspomnieć naprzód należy o tem, co iest zasadą wszelkich ustaw, i czem w każdem przedsięwzięciu naczelnie zaiąć się wypada to iest o funduszach. Winniśmy Rządowi temu zachowanie w całości zakładnych i pierwiastkowych edukacyi nadań i zapisów, których od celu swoiego nie odwrócił, ale raczey odosobnieniem tak funduszów, iako też i dochodów, do oddzielnych kass szkolnych wpływaincych, od wszelkiego wypadku zabezpieczyć usiłował. Fundusz posagowy edukacyi w tym kraiu tak z opłat z dóbr po-Jezuickich, na wieczna dzieria – węz warunkami prawem zabezpieczonymi w czasie Seymu roku 1775 Rozdanych, iako i z procentu summ po tymże Zakonie na dobrach obywatelskich lokowanych, wynosi rocznego dochodu złotych pol: 363, 555. gr: 29. Rząd przeszły przeznaczaiąc edukacyi spadki po zgasłych lub zniesionych Zakonach, toż zastępuiąc obowiązki dóbr duchownych na skarb zaiętych; wspieraiąc oraz fundusz edukacyyny w tych mieyscach, gdzie się niedostarczaiącym okazał, powiększył go summą na Departamenta podzieloną zł: pol: 359, 817. gr: 23. (c). Przydał ieszcze opłaty czwartey części rocznego dochodu z Probostw i Plebaniy od duchownych, one otrzymuiących.Że zaś dla przywiedzenia do zamierzonego od siebie stanu edukacyi, ten fundusz dostarczaiąicym, bydź nie uznał, oszczędzone na każdym etacie summy składaiąc na hipotekach dóbr Ziemskich corocznem procentów w summę obracaniem rosnące, z powolnym czasem na wzniesienie Instytutów w tym kraiu potrzebnych przeznaczał. Wszakże mimo powiększonych przychodów, wiele brakowało w tym kraiu do uzupełnienia w nim potrzebnych edukacyynych ustaw. Wzniesienie Liceum w Warszawie (d) i dwóch Korpusów Kadeckich, iest nayważnieyszem tego Rządu dziełem. Zaprowadził Gimnazyum Poznańskie i urządził nieco Płockie. Innym zaś wszystkim po całym kraiu zdawna będącym Szkołom, iako po smutnym stanie, w którym ie Izba Edukacyyna znalazła, wnosić należy, do czasu pewnie za – prowadzenia odmian trwać tytko dozwolił. Niektórym nawet, a mianowicie Szkołom szanownego Zgromadzenia XX. Piiarów, któremu dla iego narodowości i ducha obywatelskiego nie sprzyiał, zmnieyszywszy lub odiąwszy fundusze, upaśdź nie zabronił. Plan nauk w Szkołach od Rządu Pruskiego urządzonych, byłby zaiste pożytecznym, lecz tenże Rząd korzyść z starań swoich sam mnieysza uczynił, zaprowadzaiąc wszystkie nauki w ięzyku obcym dla Narodu kochaiącego własny, a który w wzgardzie i odrzuceniu narodowey mowy, dostrzegaiąe myśli i zamiaru Rządu, powziął powszechny wstręt do szkół od niego urządzonych, który okazywał się w zmnieyszeniu liczby uczniów, w miarę tey, iaka się za bytu dawnieyszego Polski we wszystkich szkołach okazywała. Urządzenie szkół w kraiu na prawym brzegu Wisły w Departamentach Płockim i Łomżyńskim tem zupełniey dalszemu zostawił czasowi, (e). Ustawa szkół Rycerskich zaprowadzona w duchu dal szych iego widoków, nayprościey do nich zmierzać zdawała się. – Dwie te szkoły w Kaliszu i Chełmnie początkowych nauk dla dzieci prawie od kolebki kosztem Rządowym wychowuiacych się mieszcząc z łona matek wziętą młodzież, służyć miały do przerwania w nowem pokoleniu tych wrażeń i pamiątek, które łączą ie ciągłym łańcuchem z poprzedzającym Oyców rodem; do zgaszenia w młodocianych sercach z mlekiem prawie wyssanych dla Narodu swego uczuć, zwracając ie do nowego Rządu, do zatarcia zwolna (ieżeli to bydź moie) cechy rodowitości. Czyli ten zamiar Rządu trafnie od niego był powziętym, czyli zamysł przeistoczenia Narodu iest podobnym, nie tu mieysce rozwagi. Pewną iest rzeczą, iż ten duch wydawał się we wszystkich edukacyynych tego Rządu ustyawach. Ten cel okazywał się nawet w zaprowadzeniu szkół dla ludu; w ustawie ze wszech miar chwalebney i pożyteczney, którey iednak uskutecznienie z tem większą przychodziło trudnością i oporem, że lud nie poymuiący ieszcze pożytku, zaczął od powzięcia wstrętu ku naukom, dawanym od Nauczycieli cudzoziemców. Nadszedł czas zmiany Rządowey; Zwycięzca Narodów zwalczywszy potęgę, która kray ten mocą tylko w podległości sobie dzierżyć zdołała, nim go oddał pod Rząd Króla iednomyślnym ślubem od Narodu pragnionego, poruczyl go tymczasowie pod Rząd własnych iego Obywateli. Jakiż inny przedmiot mogł bydź celem pierwszych i troskliwszych starań Rządu z rodaków złożonego, iak Edukacya publiczna? Jaka sprawa wśrod tak nagłych i gwałtownych kraiu potrzeb; w owym czasie wzmagania się sił Narodowych, dobiiania się udzielności i wskrzeszenia oyczystego Rządu, zdołała odwrócić baczność Kommissyi Rządzącey od troskliwego i nayrychleysze go zaradzenia opuszczoney, w pośród zmiany Rządowej, pieczy nad, wychowaniem publicznem. Nie spóźniła się Kommissya Rządząca; lecz pierwszą Uchwałą swoią utworzyła wsadzę nad Instrukcyą publiczną. Powołana do pieczy nad wychowaniem narodowey młodzieży Izba Edukacyyna, rozpocząwszy Urzędowanie w czasie woiennego zaburzenia widziała smutne skutki, iakie woyna ustawom nay pożyteczniejszym, a mianowicie wychowaniu publicznemu przynosi. Nim więc iąkiekolwiek poprawy przedsięwziąć mogła, naypierwsze iey trzeba było łożyć starania na wstrzymanie od upadku, a długie prace, na powrócenie Instytutów do stanu, w którym przed woyna zostawały; co było głównym iey ówczasowego od Rządu wezwania celem. Kto zna, iakiey spokoynąści, iak troskliwey Rządu opieki, iak regularnego funduszów wpływu Wymagaią wszelkie wychowaniu publicznemu poświęcone Ustawy; iak naymnieysze wzruszenie, niepewność i o los przyszły troskliwość, one wstrząsa i do upadku skłania; z iaką trudnością przychodzi ie podnieść, ożywić, co z klubów wyszło, w karby wprowadzić; ten łatwo poiąć zdoła, iaką przerwę w naukach i rozprzężenie Ustaw przynieść musiała sama zmiana Rządu, wzbudzając niespokoyność i niepewność dalszych starań i boiaźń odmian. Zabiegła Izba Edukacyyna upadkowi i stracie, ogłoszeniem przyiętego od siebie prawidła, utrzymania rzeczy w stanie, w iakim były, nim czas poda sposoby i wskaże potrzebę polepszenia; zwiastowaniem oraz Nauczycielom opieki Rządo – wey i zachęceniem ich do pełnienia gorliwego obowiązków swoich. Ale w czasie burzliwym zadane spokoynym ustawom ciosy, nie łatwo zagoić się daią. Poświęca woyna nayszanownieysze w pokoiu Inftytuta, przemiiaiącym, ale nagłym swoim potrzebom. Często gwałtowność wypadków, czasem nawet mnieysza na ów czas na nie uwaga ruynuie iednym razem długą pracą wzniesione i drogie w pokoiu ustanowienia. A ieżeli znakomitsze Instytuta Szkół wyższych wielką przez zabranie gmachów szkolnych na potrzeby woyskowe, szkodę i zruynowanie poniosły; coż mówić o rodzącey się ledwo w kraiu naszym Ustawie szkół dla Ludu? którey zupełnemu upadkowi, iak nayskorzey zaradzić należało. Kommissya Rządząca potwierdziwszy przychody, które edukacyi za Rządu przeszłego przeznaczone były, oddała ie pod zarządzenie Magistratury nad wychowaniem przełożoney. Uyrzała się Izba Edukacyyna z temi samemi sposobami, które służyły w spokoynych okolicznościach, w obowiązku wystarczania nowym i znacznieyszym kosztom. Edukacya wychodząc z rąk. Rządu obcego, wracała pod macierzyńską narodowey Zwierzchności opiekę, która dobrem iey zaiąć się troskliwiey czuła chęć i obowiązek. Należało od woyny zadane naprawić uszkodzenia, zachęcić i ożywić podupadłe Instytuta, podnieść zaniedbałe, brakuiące utworzyć. Szkoły do czasu od przeszłego Rządu oczekuiace przyrzeczonego podniesienia okolice szkół pozbawione, widziały czas, w którym zwiększem prawem od oyczystego Rządu spodziewać się mogły skutku życzeń swoich. Nauczyciele otwarte maiąc pole do tworzących się w rozmaitych Władzach kraiowych mieysc i Urzędów, opuszczać mogli szanowne i ważne dla kraiu publicznych nauczycieli, ale mniey zyskowne obowiązki, gdyby Zwierzchność Edukacyyna nie starała się była, przyzwoitą, zgodną z ich potrzebami, z zacnością stanu, a należną oszczędnością funduszów, opatrzyć ich nagrodą, i odwrócić ten niedostatek pierwszych potrzeb, który przy powiększoney wszech rzeczy drogości, w wielu mieyscach był Nauczycieli smutnym i gorszącym udziałem (f) Departament Bydgoski i Łomżyński ze Szkół wyższych zupełnie ogołoconemi były. Rząd przeszły mimo Gimnazyum w Białymstoku, zamyślał o podniesieniu Szkół wyższych w Seynach, tem więcey Izba Edukacyyna potrzebę tego widziała, iż obywatele wzdłuż Niemna zamieszkali, w ościennych Prusiech, lub w kraiach Panowaniu Rossyyskiemu podległych, nauk dla młodzieży swoiey szukać byli zniewolonemi. Korzystaiąc z gmachu klasztoru dawniey XX. Dominikanów, a iuż od Rządu zeszłego na Szkoły w części wyporzadzonego, po ukończeniu wewnętrznego przysposobienia, Izba Edukacyyna Szkołę Departamentową w Seynach podniosła (g), która na dniu 28 Lutego 1809 roku publicznie otworzoną została. Toruń miasto z liczby znacznieyszych w krain naszym, które kwitnące dawniey posiadało Szkoły, oyczyzna Kopernika i tylu uczonych, nie miało teraz Szkol, iakie należą mieyscu znakomitemu ludnością, przemysłem i handlem mieszkańców; z zadziwieniem znalazła Izba Edukacyyna w równem opuszczeniu nauki, iak i mieyscowe fundusze, tych część upadla, część na inny cel obrócona, a naywiększa od dawności zaległa. Nayiaśnieyszy Pan za przełożeniem Izby Edukacyyney Dekretem swoim wsparł fundusze Szkol Toruńskich; Izba Edukacyyna za przesianiem Rektora (A) i nowych Nauczycieli, te szkoły podniosła. Obywatele Departamentu Bydgoskiego żądali Szkol wyższych. Departament ten zaludniony w większey części mieszkańcami niemowiącemi ięzykiem Rządowym, wymagał większey względem nauk pieczołowitości i zaprowadzenia ich dla dobra samych Obywateli w ięzyku kraiowym. Szkody więc w Bydgoszczy za staraniem Prefekta i składką począkową Obywatelów, a za pozyskaniem przez Izbę Edukacyyna Dekretu J. K. Mci, przeznaczaiącego na wsparcie ich zł: pol: 13, 000 rocznie, w roku ieszcze 1809 zafundowane zostały. W Łomży należało podnieść upadłe Szkoły lecz założenie tam stolicy Departamentu, sprawiło, zaięcie gmachów szkolnych naumieszenie Magistratur kraiowych. Izba Edukacyyna przeniosła szkoły stamtąd do Szczucina w ludnieyszą okolicę, opatruiąc ie znacznieyszym funduszem i pomnożeniem Nauczycielów (i). Ludnieysze nad inne mnieysze miasta naszę, maiące licznie w okolicy mieszkaiących obywateli, pograniczne miasto Wschowa, mieszcząc z dawna obszerny gmach szkolny, niegdyś licznym służący szkołom, zasługiwało na wyższe, niźli początkowe, iak dotąd szkoły. Dogadzaiąc i potrzebie i usilnemu w okolicy osiadłych Obywatelów żądaniu, Szkoły Wydziałowe w tem mieście na dniu 1 Stycznia 1811r. są otworzone. Instytut szczególnemu celowi i dobroczynności przez JX. Kosmowskiego dla dobra familii iego i ubogich, w Trzemesznie założony i uposażony, staiąc się razem dla okolicznych mieszkańców Instytutem publicznym, szczególnieyszey wzywał opieki; fundusze iego zawikłane i podupadłe, a nauki zaniedbane, przestały były odpowiadać zamiarowi fundatora i użyteczności publiczney. Fundusz zatem wyiaśniony, urządzony i starównieyszemu dozorowi poruczony, a nauki z zaprowadzeniem inszych Nauczycielów na nowo prawic podniesione zostały. W tych, iak i dawniey zaprowadzonych szkołach, powracając Izba Edukacyyna Nauki ięzykowi oyczystemu, zdatnych Rodaków do katedr szkolnych, na mieysca według potrzeby wezwała. Szkoły mianowicie Rycerskie powierzone bydź musiały rodowitym Polakom, którzyby ducha narodowego i miłość Oyczyzny, w serca młodzieży przelać mogli. Nie chciała iednak utracić dla kraiu szacownych i biegłych w naukach cudzoziemców, których ra – czey dla niego pozyskać należało. Cieszyć się może nabyciem wielu zacnych Nauczycielów, którzy ufni szacuiącemu zasługi Narodowi, nie opuszczaiac przyiętych obowiązków, talenta i prace swoie, przyspiosobioney poświęcili Oyczyźnie, przykładaiąc się nawet mimo trudności, iaka iest w poźnieyszym wieku, do nabycia narodowey mowy. (jj) Lecz nieobecne tylko, ale i przyszłe przewidywać i opatrywać należało potrzeby. Widziała Izba Edukacyyna, do iakiego celu wszystkie kierować powinna była starania, i iak wielkim było dla niey obowiązkiem zdążać do tego, aby z czasem młodzież Polska, w własnym kraiu te wszystkie znaydowała nauki, których nabycia w obcym szukać zniewoloną była. Wcześnie zatem znakomitszey zdatności młodzież na przyszłych Nauczycielów do wszystkich nauk sposobić przedsięwzięła. W tym celu ile iey fundusze dozwoliły, trzech młodych Nauczycielów na matematykę, botanikę i rysunki do Paryża, iednego na mineralogiią do sławnego W ernera w akademii Freybergskiey, iednego na chemiią do Berlina wysłać pospieszyła (k). Te mianowicie ostatnie nauki chemii i górnictwa na osobliwszą zasługują troskliwość. Obficie od natury ziemi naszey nadane bogactwa, a które dobycia swego oczekuią, wzbudzać powinny staranie Magistratury nad oświeceniem przełożoney do doskonalenia ziomków w umieiętnościach, które ukryte wewnątrz ziemi płody poznawać i na korzyść kraiową obracać nauczaią. Przy pomnażaniu się woyska naszego, widziała Izba Edukacyyna potrzebę opatrzenia go usposobionemi Lekarzami, a zatem założenia w Warszawie szkoły, w któreyby się Rodacy; do tey posługi współobywatelom i woysku sposobić mogli. Szczupłość funduszów wystawiała do przedsięwzięcia tego niemałą trudność; ułatwiła ią gorliwość zacnych w tey stolicy Lekarzów, którzy obywatelskie usługi swoie w kształceniu młodzieży dla dobra Oyczyzny i ludzkości, Izbie Edukacyyney oświadczyli, i te dotąd gorliwie bez inney pełnili nagrody, ciesząc się tą, ktora z szacunku i wdzięczności współ-obywatelów i z własnego świadectwa, z dopełnienia szlachetnego czynu pochodzi. (l). Z tey Izba Edukacyyna korzystaiąc ofiary, dwa domy do funduszu Edukacyynego należące dawnych szkół po-Jezuickich, temu postanowieniu przeznaczywszy, po otrzymaniu od J. K. Mci funduszu na koszta pierwszego założenia (m), szkołę tg na dniu 9 Października 1809 otworzyła. Zostawione od Rządu przeszłego dwie Szkoły Rycerskie, poruczone zostały od Kommissyi Rządzącej Kommendantowi Jeneralnemu, co się tycze woyskowości; co się zaś ściąga do funduszów i przepisu nauk, oddane wspólnemu Kommendanta, wraz z Izbą Edukacyyną staraniu. Te szkoły za czasów Rządu przeszłego przeznaczone wszelkiey beż jróżnicy młodzieży, stały się teraz iedynie szkołami dla dzieci zasłużonych, a dla Oyczyzny zubożałych obywatelów. Tak Rząd dogadzaiąc potrzebie kształcenia młodych woyskowych, połączył razem obowiązek naytkliwszey nagrody poległym, lub dla kraiu z maiątku wyzutym; dzieci ich, stały się dziećmi Oyczyzny. Ta przeznaczaiąc ie do broni, do stanu ich oyców, korzysta z podanego im w dziedzictwie męztwa i przywiązania do kraiu.\n<a href="http://cyfroteka.pl/ebooki/Sprawa_z_piecioletniego_urzedowania_Izby_Edukacyyney-ebookRO/p02028575i020" target="_blank" title="Sprawa z pięcioletniego urzędowania Izby Edukacyyney [Józef Lipiński] - KLIKAJ I CZYTAJ ONLINE" > <img src="http://cyfroteka.pl/images/BRD.png" style="border:none;background:none transparent;box-shadow:none;-webkit-box-shadow:none;-webkit-border-radius:0;border-radius:0;" alt="Sprawa z pięcioletniego urzędowania Izby Edukacyyney [Józef Lipiński] - KLIKAJ I CZYTAJ ONLINE"/></a>


Przed nami Noc Muzeów 2022. Co zobaczyć z 14 ma 15 maja? - Głos Nauczycielski\nPrzed nami Noc Muzeów 2022. Co zobaczyć z 14 ma 15 maja?\nW nocy z soboty na niedzielę, z 14 na 15 maja, otworzą się drzwi muzeów, instytucji kulturalnych i publicznych, a także uczelni, instytutów naukowych i centrów nauki. Udział w tych wydarzeniach jest bezpłatny lub kosztuje symboliczną złotówkę. Naukowcy, animatorzy i popularyzatorzy nauki w wielu polskich miastach przygotowali w tym dniu pokazy, prezentacje, warsztaty i gry dla szerokiej publiczności.\nNioc Muzeów 2022\nPodobnie, jak w latach poprzednich w Nocy Muzeów nie biorą udziału tylko muzea czy miejsca kojarzone z kulturą, ale też te nieoczywiste i często na co dzień niedostępne. W sobotę Warszawie będzie można np. wybrać się na spacer po ruinach Radiostacji Babice w Lesie Bemowskim czy zwiedzić zakamarki kina Iluzjon.\nMuzeum Historii Polski przygotowało wyjątkową niespodziankę na tegoroczną Noc Muzeów! Pierwsze zwiedzanie powstającej siedziby MHP na warszawskiej Cytadeli.\n➡ Szczegóły na stronie internetowej MHP: https://t.co/NI0r49wh24 pic.twitter.com/ZXj3wHulHV\n— MuzeumHistoriiPolski (@MuzHistPolski) May 11, 2022\nMAMY PROGRAM tegorocznej Nocy Muzeów w Warszawie! Koniecznie sprawdźcie jakie atrakcje, wydarzenia i trasy dla Was przygotowaliśmy: https://t.co/Wo4UNSZTkp\nTo z kim i gdzie się widzimy w najbliższa sobotnią noc? @kulturalnawawa @AldonaMachnow1 #NocMuzeów #NocMuzeów2022 pic.twitter.com/b9MGMmuhQV\n— Warszawa (@warszawa) May 10, 2022\n🌒🌙 Już w najbliższą sobotę kolejna #NocMuzeów, która w @warszawa organizowana jest od 2004 r. My będziemy w niej uczestniczyć po raz 8.\n📋 Zaplanujcie trasę i miejsca, które chcielibyście tego wyjątkowego wieczoru odwiedzić. Harmonogram znajdziecie na 👉https://t.co/XlBtcJhJA6. pic.twitter.com/aY8NQZowiw\n— POLIN Museum (@polinmuseum) May 9, 2022\nW Muzeum Narodowym w Warszawie będzie można zobaczyć wystawy czasowe oraz 14 prac Marca Chagalla.\n🌙 Zapraszamy na #NocMuzeów w @Muzeum_Narodowe w Warszawie❗ 🌙\nW Gmachu Głównym #MNW będzie można zobaczyć nowo otwarte wystawy “Chagall” i ”Stan rzeczy”. Dostępne dla zwiedzających będą także wszystkie galerie stałe i przestrzeń edukacyjna dla dzieci: https://t.co/UurXzP2YAn pic.twitter.com/XhR1zwsiNZ\n🌠 🏛 W najbliższą sobotę – 14 maja – na dziedzińcu #MKiDN odbędzie się #RomantycznaNocMuzeów❗\nGoście Centrum Nauki Kopernik w Warszawie będą mogli przetestować nietypowe instrumenty na nowej wystawie muzycznej GraMY-Wygramy, posłuchać transformatorów Tesli w Teatrze Wysokich Napięć, a także obejrzeć świetlny pokaz z udziałem mimów, zaprogramować robota i podziwiać wiosenne gwiazdozbiory w Planetarium.\nZwiedzanie zabytkowego gmachu MEiN, galeria znanych naukowców, zajęcia z robotyki, warsztaty w "Naukobusie" i busie programu "Być jak Ignacy" to tylko wybrane propozycje przygotowane dla uczestników tegorocznej edycji #NocMuzeow.\n▶ Szczegóły: https://t.co/SJg0gg2kkU pic.twitter.com/xdmQA9LaK6\n— Ministerstwo Edukacji i Nauki (@MEIN_GOV_PL) May 11, 2022\nWieczorem i nocą z piątku na sobotę ponad 50 jednostek muzealnych zaprosi krakowian oraz gości do poznawania bogatych zbiorów i udziału w różnych interesujących wydarzeniach. https://t.co/KwMGwme4xM#Krakow #muzea #nocmuzeów pic.twitter.com/WqPJiFwklo\n— Rada Miasta Krakowa (@Radamiasta) May 13, 2022\nNoc Muzeów będzie się odbywać w całej Polsce. Warto śledzić strony urzędów miejskich, urzędów dzielnic oraz muzeów i placówek kulturalnych.


Porzywienie czy pożywienie? - JakSięPisze.pl\nPorzywienie czy pożywienie?\nJeden komentarz do “Porzywienie czy pożywienie”?\nCelem dla którego powstała niniejsza publikacja było merytoryczne omówienie zagadnienia poprawnej pisowni, poprzez odpowiedź na pytanie: piszemy porzywienie czy pożywienie? W serwisie JakSięPisze skupiamy się przede wszystkim na wyjaśnianiu jaka jest porzywienie definicja, jak również przedstawiamy wyczerpujące informacje co do tego jaka jest dla porzywienie zasada pisowni. Naszym czytelnikom dajemy również możliwość konsultacji online udzielanej przez naszych redaktorów w sekcji komentarzy, znajdującej się pod każdym opracowaniem. Sprawnie funkcjonująca wyszukiwarka słów oraz narzędzie do sprawdzania pisowni (korekta językowa długiego tekstu) to dodatkowe funkcjonalności pomocne w codziennej pracy z językiem polskim. Dzięki temu w razie jakichkolwiek wątpliwości co do tego jak piszemy porzywienie albo po prostu szukając porzywienie słownik nasz serwis to pewny wybór, w którym znalezienie satysfakcjonującej odpowiedzi graniczy z pewnością. Wysoką użyteczność oferujemy również chcącym sprawdzić dłuższy tekst lub mającym wątpliwości wymagające konsultacji ze specjalistą z naszej redakcji.


Utworzony kod PIN można w każdej chwili zmienić lub usunąć. Aby zwiększyć zabezpieczenia, można zaznaczyć opcję losowości Randomize Keypad w obszarze DOSTĘP Z KODEM PIN, aby otrzymywać nowy kod klawiszowy przy każdym logowaniu do skarbca.\nUtworzony kod PIN działa tylko na danym urządzeniu. Nie można logować się do skarbca z różnych urządzeń za pomocą tego samego kodu PIN. Na przykład w razie utworzenia kodu PIN na urządzeniu z systemem Android nie można za pomocą tego samego kodu PIN odblokować skarbca na urządzeniu z systemem iOS lub innym urządzeniu z systemem Android.\nNa stronie Utwórz kod PIN wpisz hasło skarbca, a następnie stuknij opcję Prześlij.\nWpisz ponownie 4-cyfrowy kod PIN w celu potwierdzenia. Po potwierdzeniu kodu PIN ustawienia w obszarze DOSTĘP Z KODEM PIN zostaną włączone na stronie Skarbiec.


Pitera: wydruki ze służbowych kart - do wtorku\nDodano: 13 grudnia 2007, 18:44 22\nDo wtorku wszystkie ministerstwa maja wysłać do Kancelarii Premiera wydruki ze służbowych kart kredytowych ministrów, wiceministrów i dyrektorów generalnych – dowiedział się „Wprost”. Następnie ujawni je pełnomocnik rządu ds. walki z korupcją Julia Pitera.\nNa pomysł ujawnienia zakupów, jakie z państwowych pieniędzy robili politycy i wysocy rangą urzędnicy ministerstw, wpadła minister ds. przeciwdziałania korupcji Julia Pitera. Zaczęło się gdy media ujawniły, że Tomasz Nowakowski, szef UKiE, służbową kartą kredytową płacił za perfumy, mydełka, płyty muzyczne i krawaty. W miniony wtorek premier Donald Tusk odwołał Nowakowskiego z funkcji.\nAlbion IP 15 grudnia 2007, 12:00\nNALEŻY ZAJĄĆ UWAGĘ OBYWATELI NIEWIELKIMI KWOTAMI JAKIE WYDALI URZĘDNICY PiS BY NARÓD NIE PATRZAŁ NA RĘCE PLATFORMIE, JAK KRĘCĄ LODY.\nBARDZO MĄDRZE, TAK TRZYMAĆ, NIECH GŁUPI NARÓD TRACI.\nZAPOMNIELI CO TO BYŁY AFERAŁY Z TUSKOWEGO KLD.\nKristjan IP 14 grudnia 2007, 14:14\nPOliberalowie, tworza kolejny etat urzedniczy, ktory powiela to co ma robic CBA...czy nie dziwne, tworza wlasna policje polityczna do hamowania prac Kaminskiego...Kto jeszcze dalej ufa platfusom w ich walke o dobro Polski, w ich brak pazernosci na wladze, w ich przyjazne podejscie do oponontow politycznych to przykro mi to stwierdzic, ale nalezy nazwac idiota...\nchomik IP 14 grudnia 2007, 12:53\nna wydrukach zobaczymy \_"tanie i moje państwo - Jarka kaczki\_". Super niech wyborcy PiS-u dowiedzą się jak żyli za państwowe pieniądze ich wybrańcy hahahaha\nmiś IP 14 grudnia 2007, 12:29\nPiSiakom strach dupę ścisnął, że ktoś wreszcie sprawdzi ile gorzały i kondomów kupowali za państwowe pieniądze\nLuzeer IP 14 grudnia 2007, 11:39\nJulka Krzywonos wraz z Bronkiem Jamajką i Hania Bufetową zaproponowali zmianę nazwy naszego państwa. Na cześć ich boga Donka zaproponowali, by od tej pory Polskę nazywać - TUSKMENTUSTANEN. Ponoć wszyscy w PO szaleją ze szczęścia!


Zestawy Sportowe Unisex | Roly\nZestawy Sportowe Unisex\nStrój sportowy unisex, z wstawkami z oddychającej siatki. Miła w ...\nStrój sportowy unisex, z wstawkami z oddychającej siatki. Miła w dotyku, oddychająca i szybkoschnąca tkanina.\nW Roly stawiamy na najlepszy kobiecy sportowy wygląd.\nCoraz więcej dziewcząt uprawia dyscypliny sportowe, które były do tej pory zarezerwowane tylko dla mężczyzn. Tak jak coraz więcej jest sportów, które ludzie obu płci ćwiczą razem. Eksperci twierdzą, że kobiety nie mają tyle siły w mięśniach co mężczyźni, ale z kolei nie osiągają oni techniki, która charakteryzuje płeć żeńską. Pokrewność płci jest faktem, który staje się zauważalny w niektórych krajach. dyscypliny. Wyraźny przykład mamy w ćwiczeniach takich jak jazda konna, piłka nożna czy piłka halowa, koszykówka, tenis, pływanie i oczywiście lekkoatletyka.\nEwolucja kreuje tendencje\nCzasy się zmieniają, a wraz z nimi koncepcja komfortu . Podczas używania tekstyliów musimy wziąć pod uwagę komfort i ruch. Zdolność adaptacyjna staje się protagonistą najnowszych kolekcji sportowych. Cóż, z wyjątkiem sportów, takich jak szachy, w których tylko ćwiczysz umysł, reszta wymaga najnowocześniejszych wykończeń, aby zapewnić dobrą wydajność fizyczną.\nNie widzimy już białych bandaży u sportowców. Teraz moda sprawia, że są one w kolorach, a nie tylko to, kinesiotaping oprócz krzykliwych kolorów, cechuje się wsparciem dla mięśni i stawów naszego ciała. Fizjoterapeuta zamknięty w elastycznej taśmie. Cała innowacja.\nOd zwykłego bandażu do Kinesiotapingu. Od szycia po klejenie.\nZmieniają się czasy i zestawy odzieży sportowej unisex ewoluują. W dzisiejszych czasach kobiety i mężczyźni wymagają, oprócz sprzętu wykonanego z wytrzymałych materiałów, odzieży sportowej dostosowanej w sposób proporcjonalny i harmonijny. Właśnie dlatego produkujemy ubrania sportowe typu unisex, które idealnie dopasowują się i uwydatniają proporcjonalne ciało kobiety i mężczyzny.\nRoly stawia na twój ulubiony sport.\n17:07:22 Typ: Brak wyników wyszukiwania Katalog Oferty


Co to jest umowa deweloperska? - ErykPeplinski.pl\nUmowa deweloperska – ogólne założenia\nUmowa deweloperska jest dokumentem podpisywanym między deweloperem a nabywcą mieszkania (zawierają ją osoby fizyczne). Podpisywana jest po to, by ustalić wszystkie szczegóły transakcji, a także doprecyzować wszystkie informacje na temat lokalu oraz praw i obowiązków dewelopera i kupującego.\nBywa mylona z umową przedwstępną, jednak niesłusznie, ponieważ umowa przedwstępna to coś innego.\nWarto wiedzieć! Umowę przedwstępną, nazywaną także przedwstępną deweloperską, podpisuje się zwykle wtedy, gdy transakcja dotyczy lokalu w budynku, który jeszcze nie został oddany do użytku. Jest ona pośrednim krokiem, który prowadzi do zawarcia umowy deweloperskiej. Zawiera się przede wszystkim wtedy, gdy nabywcy nie chcą podpisywać jeszcze ostatecznej umowy (lub nie mogą sobie na to pozwolić). Umowa przedwstępna nie jest obowiązkowa – często sami deweloperzy z niej rezygnują i przechodzą od razy do podpisania właściwej umowy deweloperskiej.\nUmowa deweloperska dotyczy zawsze lokali mieszkalnych, a także innych powierzchni, które nie zostały wyodrębnione jako osobne pomieszczenia. W umowie deweloperskiej mogą znaleźć się więc zapisy o komórkach lokatorskich, garażach, ogródkach przy mieszkaniach na parterze, miejscach parkingowych, czy postojowych (pod warunkiem, że te powierzchnie nie mają własnych ksiąg wieczystych i są traktowane jako całość z mieszkaniem).\nNajważniejsze informacje o umowie deweloperskiej\nW umowie deweloperskiej przede wszystkim zwróć uwagę na informacje o mieszkaniu – jego powierzchnię i cenę. Dotyczy to zarówno samego lokalu, jak i powierzchni do niego przynależących – ogródka, tarasu, balkonu, miejsca parkingowego, garażu czy komórki lokatorskiej. Przeczytaj punkty, które mówią o tym, czy deweloper może zmienić ich wielkość i jakie mogą być tego konsekwencje.\nKoniecznie zapoznaj się też z terminami zakończenia prac budowlanych, oddawania mieszkań do użytku, przeniesienia praw własności (sprawdź też, czy w umowie zawarto zapisy o tym, jak taki odbiór przebiega).\nKoszty utrzymania mieszkania i części wspólnych – np. jak będziesz rozliczać się za media i jak będą ustalane koszty utrzymania części wspólnych.\nInne opłaty, takie jak podatek od nieruchomości, opłaty za użytkowanie wieczyste, wynagrodzenie dla zarządcy budynku lub dla dewelopera za zarządzanie nieruchomością.\nDostęp do drogi publicznej – jak zostanie zapewniony przez dewelopera,\nHipotekę nieruchomości – czy jest ona obciążona,\nSkutki niewywiązania się z umowy przez dewelopera lub kupującego.\nJeśli planujesz zakup własnego M i zastanawiasz się, jak przebiega odbiór mieszkania, odwiedź stronę odbiorymieszkan.info.


Jak zabezpieczyć i przetwarzać dane osobowe? Jak ocenić ryzyko? Co to są dane biometryczne i profilowanie? W jaki sposób zgłosić naruszenie bezpieczeństwa?\nTo tylko niektóre tematy Konwentu Ochrony Danych Osobowych i Informacji 2016. Jego uczestnicy po raz pierwszy wezmą udział w #DataProtectionMIXER.\nJak przetwarzać dane osobowe? Zgoda dziecka, dane biometryczne.\nJak zabezpieczyć dane osobowe i ocenić ryzyko?\nInspektor ochrony danych. Wyzwania dla ABI przed 25 maja 2016 roku.


« Rosnące problemy zdrowotne\nJak unikać poważnych chorób, czyli profilaktyka medyczna »\nRak piersi jest tym, który atakuje niezwykle często, dlatego też jest bardzo groźny. Wykrywany jest często za późno, dlatego też kobiety umierają. Jest jednak nowa nadzieja dla kobiet dotkniętych tym nowotworem. Przede wszystkim prowadzone niedawno badania nad tym właśnie nowotworem ujawniły, że są cztery różne typy raka. Jest to przełomowe, bowiem odkryto także, że należy je leczyć na cztery różniące się od siebie sposoby. Badania te były niezwykle wnikliwe i wykazały, że niektóre odmiany raka piersi można leczyć przy użyciu dostępnych już teraz lekarstw, które jednak są stosowane w odniesieniu do innych nowotworów. Jednocześnie w zakresie konkretnych typów raka piersi wykrywane są nowe metody leczenia, dzięki czemu jest większa nadzieja na to, że kolejne nowotwory piersi będzie można zwalczać lepiej, szybciej, a także skuteczniej. Ten postęp jest naprawdę potrzebny dzisiejszej medycynie ze względu na to, że rak piersi jest tak groźny i zbiera co roku tak duże żniwo. Dzięki tym badaniom można z nim efektywniej walczyć.\nEfekty diety szwedzkiej 1000 kalorii 27 lutego 2014\nZ uwagi na to, że dieta szwedzka 1000 kalorii mimo niewielkiej zawartości kalorycznej jest bardzo pożywana i nie pozwala na drażniące uczucie głodu, jest to rodzaj kuracji odchudzającej raczej bezbolesnej …