DZWON

Są tacy, którzy czytają te wiadomości przed tobą.
Subskrybuj, aby otrzymywać świeże artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać Dzwon
Bez spamu

Findwindow
Getwindow
GetWindowText
SetWindowText
Iswindow
Movewindow
IsWindowVisible
Włącz okno
IsWindowEnabled
WindowFromPoint
Pokaż okno
Zamknij okno
SetWindowPos
Getclasslong
Setclasslong
GetWindowLong
SetWindowLong
GetDesktopWindow
Getparent

Funkcja FindWindow

funkcja FindWindow (className, WindowName: PChar): HWND;
Funkcja zwraca uchwyt okna, który spełnia żądanie (0 - jeśli nie znaleziono takiego okna).

Nazwa klasy Nazwa klasy używana do wyszukiwania we WSZYSTKICH oknach systemowych. Windowname Tytuł okna

Jeden z parametrów może być równy zero, wówczas wyszukiwanie jest przeprowadzane przez inny parametr.
Przykład:

Funkcja Getwindow

funkcja GetWindow (Wnd: HWND; Param): HWND
Funkcja zwraca uchwyt okna spełniający żądanie.

Wnd Deskryptor okna początkowego Param Przyjmuje jedną z następujących stałych wartości: gw_Owner Uchwyt okna przodka jest zwracany (0 - jeśli nie ma przodka). gwHWNDFirst Zwraca uchwyt pierwszego okna (względem Wnd). gw_HWNDNext Zwraca uchwyt następnego okna (okna są skanowane bez powtarzania, tj. Jeśli nie zmieniłeś parametru Wnd funkcji, uchwyty nie są ponownie zwracane) gw_Child Zwraca uchwyt pierwszego okna potomnego.

Przykład:

Funkcja GetWindowText

funkcja GetWindowText (hWnd: HWND; lpString: PChar; nMaxCount: Integer): Integer;
Funkcja zwraca tekst okna. Dla formularza będzie to tytuł, dla przycisku - napis na przycisku.

hWnd Uchwyt do okna, którego tekst chcesz uzyskać. lpString Zmienna, w której zostanie umieszczony wynik nMaxCount

Maksymalna długość tekstu, jeśli tekst jest dłuższy, wówczas jest odcinany.


Przykład:

Funkcja iswindow

funkcja IsWindow (hWnd: HWND): BOOL; Zwraca wartość True, jeśli okno z określonym uchwytem istnieje, w przeciwnym razie False.

Hwnd Deskryptor pożądanego okna

Funkcja movewindow

MoveWindow (hWnd: HWND; X, Y, nWidth, nHeight: Integer; bRepaint: BOOL): BOOL; Przesuwa okno do nowej pozycji.

hWnd Uchwyt do przenoszonego okna. X, Y, nWidth, nHeight Odpowiednio: nowe współrzędne X, Y; nowa szerokość, wysokość. b Odśwież Wartość logiczna wskazująca, czy okno zostanie ponownie przerysowane.

Funkcja jest widoczna

funkcja IsWindowVisible (hWnd: HWND): BOOL;
Zwraca wartość True, jeśli dane okno jest widoczne.

hWnd Klamka okienna.

Funkcja EnableWindow

funkcja EnableWindow (hWnd: HWND; bEnable: BOOL): BOOL;
Ustawia dostępność okna (okno nie jest dostępne, jeśli nie reaguje na zdarzenia myszy, klawiatury itp.). Właściwość Analog in Delphi Komponenty włączone. EnableWindow zwraca True, jeśli wszystko poszło dobrze, a False inaczej.

hWnd Klamka okienna. b Włącz Wartość logiczna wskazująca dostępność okna.


Przykład:

Funkcja IsWindowEnabled

funkcja IsWindowEnabled (hWnd: HWND): BOOL;
Zwraca określone okno: Prawda, jeśli okno jest dostępne, w przeciwnym razie False.

hWnd Klamka okienna.

Funkcja WindowFromPoint

WindowFromPoint (punkt: TPoint): HWND;
Zwraca uchwyt okna znajdującego się w tym punkcie ekranu.

Punkt Punkt współrzędnych typu ekranu Tpoint(definicja typu patrz poniżej)

Funkcjonować

rodzaj TPoint \u003d Rekord x: Longint; y: Longint; koniec;

Funkcja ShowWindow

funkcja ShowWindow (hWnd: HWND; nCmdShow: Integer): BOOL; Pokazuje lub ukrywa okno.

hWnd Deskryptor pożądanego okna nCmdShow Stała definiująca, co będzie zrobione z oknem: SW_HIDE SW_SHOWNORMALSW_NORMAL SW_SHOWMINIMIZED SW_SHOWMAXIMIZED SW_MAXIMIZE SW_SHOWNOACTIVATE SW_SHOW SW_MINIMIZE SW_SHOWMINNOACTIVE SW_SHOWNA SW_RESTORE SW_SHOWDEFAULT SW_MAX


Przykład:

Funkcja zamykania okna

funkcja CloseWindow (hWnd: HWND): BOOL; stdcall;
Zamyka okno

hWnd Uchwyt do okna, aby zamknąć.

SetWindowPos

funkcja SetWindowPos (hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; stdcall;
Ustawia okno w nowej pozycji

hWnd Wyszukiwarka okien hWndInsertAfter Uchwyt okna, przed którym znajduje się na liście Zamówienie Z. zostanie wstawione okno hWndlub jedną z następujących stałych: HWND_BOTTOM Umieść okno na dole listy Z-Order HWND_TOP Umieść okno u góry listy Z-Order. X, Y, cx, cy

W związku z tym nowy horyzont. , vert. pozycja okna ( X, Y), a także nową szerokość
i wysokość ( cx, cy)

uFlagi Jeden lub więcej (oddzielone LUB) następujących stałych: SWP_NOSIZE Nie zmieniaj rozmiaru okna po przeniesieniu ( cx, cy ignorowane) SWP_NOZORDER Nie zmieniaj położenia okna na liście Z-Order SWP_SHOWWINDOW Po przeniesieniu okno będzie widoczne SWP_HIDEWINDOW Ukryj okno po przeprowadzce SWP_NOACTIVATE Nie przesuwaj okna po przeniesieniu SWP_NOMOVE Nie przesuwaj okna (ignorowane X, Y)

Funkcja GetClassLong

funkcja GetClassLong (hWnd: HWND; nIndex: Integer): Integer;
Ta funkcja zwraca 32-bitową liczbę całkowitą pobraną z określonego pola rekordu. TWndClassEx określone okno.

hWnd Klamka okienna nIndeks Stała, która określa, co zostanie zwrócone. Musi być jednym z następujących: GCL_MENUNAME Zwraca wskaźnik do łańcucha zawierającego nazwę menu klasy zdefiniowanej w pliku zasobów powiązanym z jakimś programem. GCL_HBRBACKGROUND Zwraca uchwyt (HBRUSH) pędzla tła skojarzonego z klasą GCL_HCURSOR Zwraca uchwyt (HCURSOR) kursora skojarzonego z klasą GCL_HICON Zwraca deskryptor (HICON) ikony powiązanej z klasą GCL_HMODULE Zwraca deskryptor procesu (HMODULE), który zarejestrował klasę. GCL_CBWNDEXTRA Zwraca rozmiar pamięci (w bajtach) przydzielonej do przechowywania dodatkowych danych tego okna. Opis korzystania z tej pamięci, patrz opis funkcji GCL_CBCLSEXTRA Zwraca rozmiar pamięci (w bajtach) przydzielonej do przechowywania dodatkowych DANYCH KLASY GCL_WNDPROC Pobiera adres procedury okna powiązanej z klasą. GCL_STYLE Zwraca styl klasy (obecność określonego stylu jest sprawdzana za pomocą operacji bitowej I przy użyciu stałych typu cs_XXX) GCL_HICONSM

Uwaga: w przypadku, gdy funkcja zwraca wskaźnik, konieczne jest rzutowanie typu (liczba całkowita -\u003e

Funkcja ustawiona klasowo

funkcja SetClassLong (hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Integer; Funkcja funkcji parowania. Ustawia odpowiednie pole w żądanym polu.
Funkcja zwraca starą wartość pola, aby można ją było później poprawić lub zwracane jest zero, jeśli coś poszło nie tak.

hWnd Klamka okienna nIndeks Jedna ze stałych GCL_XXX funkcji. W zależności od wartości tego pola żądane pole zostanie zmienione.

Uwaga Wskaźnik pisać Liczba całkowita.

Funkcja GetWindowLong

funkcja GetWindowLong (hWnd: HWND; nIndex: Integer): Longint; Zwraca informacje o oknie jako 32-bitową liczbę całkowitą.

hWnd Klamka okienna nIndeks Stała, która określa, co zostanie zwrócone. Musi być jednym z następujących:
GWL_WNDPROC Zwraca adres procedury okna powiązanej z tym oknem. Otrzymany adres (po konwersji odpowiedniego typu) może być wykorzystany w funkcji Callwindowproc. Ta wartość jest zwykle używana, jeśli chcą zastąpić istniejącą procedurę okna własną, podczas gdy aby nie stracić funkcjonalności okna, zwykle używają Callwindowproc. GWL_HINSTANCE Zwraca deskryptor aplikacji określony podczas tworzenia okna przez funkcję. CreateWindowEx. GWL_HWNDPARENT Zwraca uchwyt (HWND) okna nadrzędnego GWL_STYLE Zwraca styl okna. Konkretne wartości stylu są rozpoznawane za pomocą operacji bitowych. I i stałe WS_XXX GWL_EXSTYLE Zwraca styl rozszerzonego okna. Konkretne wartości stylu są rozpoznawane za pomocą operacji bitowych. I i stałe WS_EX_XXX GWL_USERDATA Zwraca 32-bitową liczbę całkowitą związaną z oknem (jest to ostatni parametr w wywołaniu CreateWindow lub CreateWindowEx) GWL_ID Zwraca identyfikator okna (nie ma to nic wspólnego z uchwytem okna!) Określonym przez parametr hMenu dla okien potomnych podczas wywoływania CreateWindow lub CreateWindowEx

Uwaga: w przypadku gdy funkcja zwraca wskaźnik, wymagane jest rzutowanie typu (liczba całkowita -\u003e wskaźnik). Możesz to zrobić w następujący sposób:

Funkcja setwindowlongong

funkcja SetWindowLong (hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint;
Sparuj z funkcją. Zmienia atrybuty określonego okna.
Funkcja zwraca starą wartość właściwości, jeśli wywołanie zakończyło się pomyślnie lub w przeciwnym razie zero.

hWnd Klamka okienna nIndeks Stała definiująca, która właściwość zostanie zmieniona. Musi być jedną ze stałych GWL_XXX z opisu funkcji dwNewLong Nowa wartość właściwości zdefiniowana przez stałą nIndeks

Uwaga: podczas ustawiania pól indeksu konieczne jest rzutowanie typu Wskaźnik pisać Liczba całkowita.

Funkcja GetDesktopWindow

funkcja GetDesktopWindow: HWND
Funkcja zwraca uchwyt do okna Pulpit. Brak parametrów

Getparent

funkcja GetParent (hWnd: HWND): HWND;
Pobiera uchwyt okna nadrzędnego dla okna hWnd.

hWnd Klamka okienna

Korzystając z WinAPI, możesz tworzyć różne procedury okien, okna dialogowe, programy, a nawet gry. To, powiedzmy, biblioteka jest podstawowa w opanowaniu programowania, MFC, ponieważ te interfejsy są dodatkami do tej biblioteki. Po opanowaniu z łatwością stworzysz formularze i zrozumiesz, jak to się dzieje.

Nie zostaniemy wprowadzeni do teorii. Zacznijmy od tego, jak stworzyć ten projekt w MVS, a na końcu artykułu przyjrzymy się prostemu przykładowi.

Więc. Najpierw otwarte Studio wizualne, następnie kliknij kartę „Plik”, a następnie „Utwórz projekt”:

Następnie z rozwijanej listy Visual C ++ wybierz Win32, pojawi się „Projekt Win32”. Klikamy na to:
Wprowadź nazwę projektu, wskaż ścieżkę i kliknij „OK”. Dalej zostanie napisane: „Witamy w kreatorze aplikacji Win32”. Kliknij. Domyślnie napis „Pusty projekt” nie ma znacznika wyboru. Musimy go zainstalować i upewnić się, że mamy „Typ aplikacji” - aplikację Windows. Jeśli wszystko jest w porządku, kliknij - „Zakończ”.

Powinniśmy mieć taki pusty projekt:

Cóż, teraz zacznijmy pisać prosty program, który tradycyjnie wyświetli napis: „Witaj, świecie !!!”.

Oczywiście do projektu należy dodać plik typu „name” .cpp. Klikamy „Pliki kodu źródłowego” prawym przyciskiem myszy, z rozwijanej listy wybierz zakładkę - „Dodaj”, a następnie „Utwórz element ...”. W rezultacie powinniśmy mieć następujące okno:

Wybierz „Plik C ++”, wprowadź nazwę, kliknij „Dodaj”. Następnie otwieramy ten plik i wklejamy do niego następujący kod (szczegóły poniżej):

#zawierać // plik nagłówkowy zawierający funkcje API // Główna funkcja jest analogiem int main () w aplikacji konsolowej: int WINAPI WinMain (HINSTANCE hInstance, // uchwyt instancji aplikacji HINSTANCE hPrevInstance, // LPSTR lpCmdLine nie jest używany w Win32, // potrzebny do uruchomienie okna w trybie wiersza poleceń int nCmdShow) // tryb wyświetlania okna (// Funkcja wyświetlania okna z przyciskiem OK na ekranie (o parametrach później) MessageBox (NULL, L „Witaj świecie !!!”, L ”Procedura okna ", MB_OK); zwraca NULL; // zwraca wartość funkcji)

Wynik powinien wyglądać następująco:

Teraz zajmiemy się bardziej szczegółowo kodem programu.

W pierwszym wierszu dołączamy plik nagłówkowy windows.h. Zawiera wszystkie niezbędne funkcje „z góry”. Tutaj wszystko jest jasne.

W 4-7 linii mamy opis funkcji int WINAPI WinMain ().

Kwalifikator WINAPI jest zawsze potrzebny dla funkcji WinMain. Zapamiętaj to. WinMain to nazwa funkcji. Ma cztery parametry. Pierwszym z nich jest HINSTANCE hInstance ( wiersz 4) hInstance jest uchwytem do instancji okna (jest to kod do procedury okna, identyfikator, za pomocą którego system operacyjny odróżnia ją od innych okien). Dzięki niemu możesz uzyskać dostęp do okna w trakcie pracy nad innymi funkcjami (więcej na ten temat później), zmienić coś w ustawieniach okna. HINSTANCE jest jednym z wielu typów danych zdefiniowanych w WinAPI, takim samym jak na przykład int. A pozycja HINSTANCE hInstance mówi nam, że tworzymy nową zmienną HINSTANCE o nazwie hInstance.

Później porozmawiamy o typach danych, więc przechodzimy do następnego parametru: HINSTANCE hPrevInstance ( wiersz 5) Jak napisano w komentarzach, nie jest on używany w Win32, ponieważ został stworzony dla systemu bitowego 3.x, z poprzedniego wynika, że \u200b\u200bjest to uchwyt do instancji okna. Następnie mamy zmienną typu LPSTR ( wiersz 6) o nazwie lpCmdLine. Jest używany, jeśli uruchomimy okno wiersz poleceń z listą parametrów. Bardzo egzotyczny sposób, więc nie będziemy się nad tym zatrzymywać.

I ostatni parametr: liczba całkowita określa sposób wyświetlania okna. Potrzebny do funkcji ShowWindow, która zostanie opisana później. Na przykład, dzięki niemu możemy rozszerzyć okno do pełnego ekranu, uczynić go określoną wysokością, przezroczystą lub nad resztą.

Przejdź do MessageBox () ( wiersz 10) Ma cztery parametry i jest potrzebny na przykład do wyświetlania komunikatów o błędach. W tym przypadku użyliśmy go do wyświetlenia komunikatu. Zasadniczo opis funkcji jest następujący:

Int MessageBox (HWND hWnd, // uchwyt do okna nadrzędnego LPCTSTR lpText, // wskaźnik do linii z komunikatem LPCTSTR lpCaption, // wskaźnik do linii z tekstem nagłówka UINT uType); // flagi do wyświetlania przycisków, stylu ikon itp.

W naszym przypadku pierwszemu parametrowi przypisano zero. Wynika to z faktu, że nie mamy okien nadrzędnych (nie jest uruchamiany przez żaden program).

Następnie mamy dwie zmienne typu LPCTSTR: lpText i lpCaption. Pierwsze raporty zawierają informacje, które zostaną wyświetlone w oknie w formie tekstowej. Drugi raportuje, co zostanie napisane w tekście tytułu okna. To jest analog char * str, ale nadal nie. Aby tekst był wyświetlany poprawnie, musisz umieścić literę L przed linią ( Unicode linia).

Ostatnim typem danych jest UINT, 32-bitowa liczba całkowita bez znaku. Oznacza to, że analog bez znaku int. Do tego parametru można przekazać niektóre wartości (o nich później), dzięki czemu można zmienić wygląd przycisku. W naszym przypadku - jest to MB_OK - oznacza, że \u200b\u200bokno tworzy przycisk z napisem „OK” i odpowiednią akcją po naciśnięciu (zamknięcie aplikacji).

W linia 11zwracamy wartość funkcji, ponieważ nie jest ona typu void.

Tak więc istnieje już ogólna idea WinAPI. Ciąg dalszy w następnych sekcjach.

W końcu! W końcu! Dzisiaj zaczniemy tworzyć pełnoprawne okno systemu Windows. Do widzenia nieszczęsna konsola !!!

W tym momencie powinieneś już mieć dobrą znajomość składni C ++, umieć pracować z gałęziami i pętlami oraz dobrze rozumieć, jak działają funkcje. Jeśli opanowałeś bitwę morską, możesz założyć, że nauczyłeś się tego wszystkiego.

Węgierski formularz zgłoszeniowy

Cały kod, który spotkamy w WinAPI, jest napisany w języku węgierskim. To taka konwencja kodowania.

W takim przypadku początkowa litera typu jest umieszczana przed nazwą zmiennej. Wszystkie słowa w nazwach zmiennych i funkcji zaczynają się od dużej litery.

Oto kilka prefiksów:

b jest zmienną typu bool.
l jest zmienną typu long integer.
w - od słowa (słowa) - 16 bitów. Wpisz zmienną bez znaku krótkie.
dw - od podwójnego słowa (podwójne słowo) - 32 bity. Zmienna typu bez znaku długa.
sz - ciąg zakończony zerem. Po prostu zwykła linia, której ciągle używaliśmy.
p lub lp - wskaźnik (ze wskaźnika). lp (z długiego wskaźnika) - te wskaźniki minęły z przeszłości. Teraz pp i p oznaczają to samo.
h - deskryptor (z uchwytu).

Na przykład wskaźnik zostanie wywołany w następujący sposób:

void * pData;

Ten formularz zgłoszeniowy jest używany przez Microsoft. Wielu krytykuje ten sposób nazywania zmiennych. Ale takie rzeczy (umowy kodowania) w dużych firmach są niezbędne.

Przypomnę, że stałe identyfikatory zwykle składają się tylko z wielkich liter: WM_DESTROY. WM_DESTOY wynosi 2, stała jest definiowana przez zdefiniuj.

Ponadto winAPI używa wielu przesłoniętych typów. Tutaj na tej stronie - http://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx, można znaleźć opisy wszystkich typów systemu Windows (w języku angielskim).

I jeszcze jedna rzecz, której nie zrozumieliśmy. Wskaźniki są często ustawione na NULL. Rozważ to tylko 0, a wskaźniki ustawione na NULL (zero) nie wskazują żadnego elementu pamięci.

Windows API (WinAPI)

Wszystkie programy dla systemu Windows używają specjalnego interfejsu programowania WinAPI. Jest to zestaw funkcji i struktur C, które sprawiają, że Twój program jest zgodny z systemem Windows.

Interfejs API systemu Windows ma świetne funkcje do pracy z systemem operacyjnym. Można nawet powiedzieć - nieograniczone.

Nie weźmiemy pod uwagę nawet jednego procentu wszystkich funkcji WinAPI. Początkowo chciałem wziąć więcej materiału, ale zajęłoby to zbyt wiele czasu, a gdybyśmy utknęli w bagnie WinAPI, dostalibyśmy się do DirectX "i dostalibyśmy się za kilka lat. Opis WinAPI weźmie dwie lekcje (w tym tę). W nich rozważymy ramy aplikacji w ramach Windows

Program dla systemu Windows, podobnie jak program dla systemu DOS, ma główną funkcję. Ta funkcja nazywa się tutaj WinMain.

Funkcja WinMain

Program dla systemu Windows składa się z następujących części (wszystko to dzieje się w programie WinMain):

Utwórz i zarejestruj klasę okna. Nie mylić z klasami C ++. WinAPI jest napisane w C, nie ma klas w naszym zwykłym znaczeniu tego słowa.
Tworzenie okna programu.
Główna pętla, w której przetwarzane są wiadomości.
Przetwarzanie komunikatów programu w procedurze okna. Procedura okna jest normalną funkcją.
Te cztery punkty są podstawą programu Windows. Podczas tej i następnej lekcji szczegółowo to wszystko przeanalizujemy. Jeśli pomylisz się w opisie programu, wróć do tych punktów.

Teraz przeanalizujemy to wszystko szczegółowo:

WinAPI: struktura WNDCLASS

Przede wszystkim musisz utworzyć i wypełnić zmienną strukturalną WNDCLASS, a następnie zarejestrować na jej podstawie klasę okna.

Oto jak wygląda ta struktura:

kod c ++ typedef struct (styl UINT; // styl okna WNDPROC lpfnWndProc; // wskaźnik do procedury okna int cbClsExtra; // dodatkowe bajty po klasie. Zawsze umieszczaj 0 int cbWndExtra; // dodatkowe bajty po wystąpieniu okna. Zawsze ustawiaj 0 HINSTANCE hInstance; / / instancja aplikacji Przekazana jako parametr do WinMain HICON hIcon; // ikona aplikacji HCURSOR hCursor; // kursor aplikacji HBRUSH hbrBackground; // kolor tła LPCTSTR lpszMenuName; // nazwa menu LPCTSTR lpszClassName; // nazwa klasy) WNDCLASS, * PWNDCLASS ;

Struktura WNDCLASS programu WinAPI określa podstawowe właściwości tworzonego okna: ikony, typ kursora myszy, czy okno ma menu, do której aplikacji będzie należeć ...

Po wypełnieniu tej struktury możesz zarejestrować klasę okna na jej podstawie. Tu nie chodzi o klasy jak w C ++. Możemy raczej założyć, że klasa okna jest takim szablonem, zarejestrowałeś go w systemie, a teraz możesz utworzyć kilka okien na podstawie tego szablonu. Wszystkie te okna będą miały właściwości zdefiniowane w zmiennej struktury WNDCLASS.

WinAPI: funkcja CreateWindow

Po zarejestrowaniu klasy okna, główne okno aplikacji jest tworzone na jej podstawie (teraz uruchomiliśmy drugi punkt). Odbywa się to za pomocą funkcji CreateWindow. Ma następujący prototyp:

kod c ++ HWND CreateWindow (LPCTSTR lpClassName, // nazwa klasy LPCTSTR lpWindowName, // nazwa okna (wyświetlana w tytule) DWORD dwStyle, // styl okna int x, // współrzędna pozioma od lewej krawędzi ekranu int y, // współrzędna pionowa od górna krawędź ekranu int nWidth, // szerokość okna int nHeight, // wysokość okna HWND hWndParent, // okno nadrzędne HMENU hMenu, // uchwyt menu HINSTANCE hInstance, // instancja aplikacji LPVOID lpParam // parametr; zawsze ustawiany NULL);

Jeśli podstawowe właściwości okna są ustawione w klasie okna (struktura WNDCLASS), tutaj są bardziej szczegółowe dla każdego okna: rozmiar okna, współrzędne ...

Ta funkcja zwraca uchwyt okna. Za pomocą deskryptora można uzyskać dostęp do okna, jest to w przybliżeniu to samo co identyfikator.

Należy pamiętać, że istnieje wiele nowych typów. W rzeczywistości wszystkie są stare, po prostu zastąpione. Na przykład: HWND jest nadpisaniem typu HANDLE, co z kolei jest nadpisaniem PVOID, które z kolei jest nadpisaniem void *. Jak głęboko zakopana jest prawda! Ale nadal typ HWND jest wskaźnikiem do unieważnienia.

Okno składa się z kilku części. W prawie każdym programie zobaczysz: tytuł okna, menu systemowe (jeśli klikniesz ikonę aplikacji w lewej górnej części okna), trzy przyciski systemowe do pracy z oknem: minimalizuj, rozwiń do pełnego ekranu i zamknij. Ponadto prawie zawsze w aplikacji znajduje się menu. To tylko ostatni na pewno nie będziemy. I oczywiście większość okna zajmują tzw. Obszar klienta, w którym zwykle pracuje użytkownik.

Chodzi o tryb okienkowy. Przez dłuższy czas będziemy ćwiczyć z DiectX w oknie - nie będziemy używać trybu pełnoekranowego.

Obsługa wiadomości

Główną różnicą między wszystkimi naszymi poprzednimi programami od programów dla systemu Windows jest przetwarzanie wiadomości.

Na przykład, gdy użytkownik naciska klawisz na klawiaturze, generowany jest komunikat, że klawisz został naciśnięty. Ta wiadomość dociera do aplikacji, która była aktywna, gdy użytkownik nacisnął klawisz.

Tutaj mamy zdarzenie (zdarzenie) - klawisz został naciśnięty.

Zdarzeniem może być: przesunięcie kursora myszy, zmiana punktu skupienia aplikacji, naciśnięcie klawisza klawiatury, zamknięcie okna. Wiele wydarzeń. Bardzo! W systemie operacyjnym może wystąpić kilkadziesiąt zdarzeń na sekundę.

Tak więc, gdy wystąpi zdarzenie, system operacyjny wyświetla komunikat: naciśnięto określony klawisz, zmieniono współrzędne kursora myszy, otworzono nowe okno.

Wiadomości mogą być tworzone zarówno przez system operacyjny, jak i różne aplikacje.

Wiadomość jest strukturą i wygląda następująco:

kod c ++ typedef struct tagMSG (HWND hwnd; // okno, które otrzyma ten komunikat komunikat UINT; // kod komunikatu WPARAM wParam; // parametr LPARAM lParam; // parametr czasu DWORD; // czas, kiedy komunikat POINT pt; // współrzędne kursor myszy) MSG;

Zauważ, jak typedef przedefiniowuje struktury.

Aby utworzyć tę strukturę, możesz użyć następującego kodu:

kod c ++ msg.messgae \u003d\u003d 2; // te dwie linie są równoważne, ponieważ msg.message \u003d\u003d WM_DESTROY; // Stała WM_DESTROY wynosi dwa

Tutaj pole zawierające kod wiadomości (nazwa wiadomości jest porównywana ze stałą WM_DESTROY. WM pochodzi z Windows Message (wiadomość Windows). WM_DESTROY to wiadomość, która jest generowana, gdy okno jest zamknięte (zniszcz - zniszcz).

Kody komunikatów są definiowane za pomocą stałych i mają prefiks WM_: WM_CLOSE, WM_CREATE itp.

W strukturze MSG znajduje się typ HWND - z klamki okna (klamka okna lub klamka okna). Jest to coś, co „opisuje” okno. Jest to coś w rodzaju identyfikatora (nazwa okna).

Zapamiętaj to słowo - uchwyt (deskryptor, deskryptor). W systemie Windows ta koncepcja jest używana bardzo często. Prawie wszystkie typy systemu Windows zaczynające się na H to deskryptory: deskryptor ikon, deskryptor czcionek, deskryptor instancji aplikacji. Jest ich trzydzieści, o ile pamiętam.

Wszystkie interakcje między aplikacjami w systemie Windows są przeprowadzane przy użyciu tych samych deskryptorów okien (HWND).

Istnieje jeszcze jeden ważny deskryptor - deskryptor aplikacji (HINSTANCE - pierwszy parametr WinMain) - jest to unikalny identyfikator aplikacji, dzięki któremu system operacyjny nie będzie mógł mieszać dwóch różnych programów. To jest jak kod kreskowy. Sprawdzimy to później.

Za każdym razem, gdy użytkownik wykonuje jakąś akcję, komunikat jest tworzony i wypełniany: ustawiany jest uchwyt okna, który powinien otrzymać komunikat, identyfikator wiadomości jest ustawiany, parametry są wypełniane, czas (bieżący) jest wypełniany i wyświetlane są współrzędne kursora myszy (patrz struktura).

Następnie ten komunikat jest umieszczany w kolejce komunikatów systemu operacyjnego. Gdy kolejka dotrze do naszej wiadomości, jest wysyłana do pożądanego okna (system Windows wie, do którego okna wysłać każdą wiadomość dzięki deskryptorom). Gdy wiadomość dotrze do aplikacji, jest umieszczana w kolejce komunikatów aplikacji. Gdy tylko dotrze do kolejki, jest przetwarzana.

Spójrz, między momentem, w którym użytkownik wykonał akcję (wystąpiło zdarzenie i komunikat został wygenerowany), a momentem, gdy program zareagował na tę akcję (komunikat został przetworzony przez program), zdarzy się wiele zdarzeń. Rzeczywiście, zarówno w kolejce komunikatów systemu Windows, jak i w kolejce komunikatów aplikacji może być wiele wiadomości. W pierwszym przypadku możemy mówić o setkach, w drugim przypadku co najmniej kilku.

Procedura okna (WndProc)

Kontynuujemy od momentu, gdy wiadomość znajdzie się w kolejce komunikatów aplikacji. Gdy tylko tura do niego dotrze, jest przetwarzana. Aby przetwarzać komunikaty, każdy program musi mieć specjalną funkcję - procedurę okna. Zwykle nazywa się to WndProc (od Window Window). Wywołanie procedury okna znajduje się w głównej pętli programu i jest wykonywane przy każdej iteracji pętli.

Wiadomości (w postaci zmiennych strukturalnych MSG) wpadają dana funkcja jako parametry: deskryptor okna, identyfikator komunikatu i dwa parametry. Zauważ, że pola czasu i pt nie są przekazywane do procedury okna. Oznacza to, że wiadomość jest już „przeanalizowana”.

Wewnątrz procedury okna znajduje się gałąź przełącznika, w której sprawdzany jest identyfikator komunikatu. Oto przykład prostej procedury okna (jest w pełni działająca):

kod c ++ // na razie nie zwracaj uwagi na HRESULT i __stdcall. Rozważymy je później HRESULT __stdcall WndProc (HWND hWnd, komunikat UINT, WPARAM wParam, LPARAM lParam) (przełącznik (komunikat) (case WM_PAINT: // kod przetwarzania komunikatu WM_PAINT return 0; case WM_DESTROY: // kod przetwarzania komunikatu WM_DESTROY return 0; ) // moduł obsługi wszystkich innych wiadomości)

A ostatni to cykl główny. On jest bardzo prosty. Każda iteracja pętli sprawdza kolejkę komunikatów aplikacji. Jeśli w kolejce wiadomości znajduje się komunikat, jest on wyciągany z kolejki. Następnie w treści pętli wywoływana jest procedura okna w celu przetworzenia komunikatu pobranego z kolejki.

To na ogół wszystko na dziś. Widać już, że program pod WinAPI jest znacznie bardziej skomplikowany niż program pod DOS. Jak napisałem powyżej, w następnej lekcji przeanalizujemy kod działającego programu.

W ramach ćwiczenia utwórz nowy projekt. W oknie Nowy projekt wybierz szablon - Win32Project (do tej pory wybraliśmy aplikację konsoli Win32). W jednym z poniższych okien nie zaznaczaj pola wyboru Pusty projekt, a IDE wygeneruje program pusty.

Jeśli uważnie przyjrzysz się kodowi pliku nazwa_projektu.cpp, znajdziesz wszystkie rzeczy, które omawialiśmy: zmienną strukturalną MSG, wypełniającą strukturę WNDCLASS, tworząc okno z funkcją CreateWindow, główną pętlą programu. Ponadto w pliku zdefiniowano funkcję WndProc. Przetwarza kilka komunikatów w gałęziach przełącznika: WM_COMMAND, WM_PAINT, WM_DESTROY. Znajdź wszystko w pliku.

Oprócz tego, co zbadaliśmy, program zawiera wiele dodatkowego kodu. W następnym numerze rozważymy kod programu, w którym wszystko, co zbędne, zostanie wycięte. Będzie to znacznie prostsze i bardziej zrozumiałe niż to, co generuje IDE.

C WinAPI to podstawowy zestaw interfejsów programistycznych Microsoft (API) dostępnych w systemach operacyjnych. Wczesna wersja Nazywał się Win32 API.

Wprowadzenie

C WinAPI to interfejs programowania aplikacji służący do tworzenia aplikacji Windows. Aby rozpocząć, początkujący użytkownik musi pobrać zestaw Windows SDK, wcześniej znany jako Platform SDK.

Zawiera pliki nagłówkowe, biblioteki, próbki, dokumentację i narzędzia używane do tworzenia aplikacji. API dla języków programowania C i C ++. Jest to najbardziej bezpośredni sposób tworzenia aplikacji w systemie operacyjnym przez firmę.

C WinAPI można podzielić na kilka obszarów:

    podstawowe usługi;

    bezpieczeństwo;

  • interfejs użytkownika;

    multimedia;

    powłoka systemu Windows

    usługi sieciowe.

Podstawowe usługi zapewniają dostęp do podstawowych zasobów. Należą do nich funkcje C WinAPI, systemy plików, urządzenia, procesy, wątki, rejestr i obsługa błędów. Obszar bezpieczeństwa zapewnia interfejsy, obiekty i inne elementy programowania do uwierzytelniania, autoryzacji, kryptografii i innych zadań związanych z bezpieczeństwem. Podsystem graficzny zapewnia funkcjonalność umożliwiającą przesyłanie treści graficznych do monitorów, drukarek i innych urządzeń wyjściowych. Interfejs użytkownika zapewnia funkcje tworzenia okien i kontrolek.

Komponent multimedialny zapewnia narzędzia do pracy z urządzeniami wideo, audio i wejściowymi. Funkcje interfejsu powłoki umożliwiają aplikacjom dostęp do funkcji zapewnianych przez powłokę systemu operacyjnego. Usługi sieciowe zapewniają dostęp do możliwości sieciowych systemu Windows.

składniki

Tworząc WinAPI C, należy wziąć pod uwagę podstawowe funkcje interfejsu API Windows, które można zamówić w siedmiu kategoriach. Rozważmy każdy z nich bardziej szczegółowo.

Podstawowe usługi zapewniają dostęp do podstawowych zasobów systemowych dostępnych w systemie Windows. Przykłady: system plików, urządzenia peryferyjne, procesy, dostęp do rejestru i system zarządzania wyjątkami. Funkcje te są przechowywane w plikach kernel.exe, krnl286.exe lub krnl386.exe dla systemów 16-bitowych oraz kernel32.dll i advapi32.dll dla systemów 32-bitowych.

Interfejs graficzny zapewnia dostęp do zasobów do wyświetlania na monitorach, drukarkach i innych urządzeniach peryferyjnych. Jest przechowywany w pliku gdi.exe w systemach 16-bitowych i gdi32.dll w systemach 32-bitowych.

Interfejs użytkownika odpowiada za przeglądanie podstawowych elementów, takich jak przyciski i paski przewijania, zarządzanie nimi, uzyskiwanie informacji o klawiaturze i myszy oraz powiązanych funkcjach. Funkcje te są przechowywane w user.exe w systemach 16-bitowych i user32.dll comctl32.dll w systemach 32-bitowych. Od XP formanty zostały zgrupowane w comctl32.dll.

Ogólne okna dialogowe - wyświetlaj dane do otwierania i zapisywania plików, wybierania koloru i czcionki. Znajdują się one w pliku comdlg.dll w systemach 16-bitowych i comdlg32.dll w systemach 32-bitowych.

Windows Shell to składnik WinAPI, który umożliwia aplikacjom dostęp do funkcji zapewnianych przez powłokę systemu operacyjnego.

Usługi sieciowe zapewniają dostęp do różnych możliwości sieciowych systemu operacyjnego. Jego podskładniki obejmują NetBIOS, Winsock, RPC. W starszych wersjach - NetDDE.

Wersje

Win16, Win32 i Win32 to standardowe zestawy składników, które pozwalają oprogramowaniu na korzystanie z funkcji różnych systemów operacyjnych Windows.

Win32, następca Win16, został wprowadzony w 1993 roku w 32-bitowych produktach Windows, takich jak Windows NT, 2000, 95. To interfejs oprogramowania zaimplementowane przez trzy biblioteki oprogramowania: Kernel32.dll, User32.dll i GDI32.dll2. Te same funkcje Win32 są dostępne we wszystkich produktach Windows i, w zależności od produktu, użycie niektórych funkcji może spowodować błąd konserwacji.

Funkcje Win32 obejmują współdziałanie programów, zarządzanie procesami, sieci komputerowe, pliki, drukarki, serwery i porty komunikacyjne.

Specyfikacja

C WinAPI to abstrakcyjna specyfikacja interfejsu programistycznego dla systemu operacyjnego systemy Windows. Składa się z deklaracji funkcji, związków, struktur, typów danych, makr, stałych i innych elementów programowania. WinAPI jest opisany jako główny i znajduje się w nagłówkach Windows C. Oficjalna implementacja funkcji WinAPI znajduje się w bibliotekach dynamicznych (DLL): na przykład kernel32.dll, user32.dll, gdi32.dll lub shell32.dll w katalogu systemowym. Istnieją implementacje interfejsu API systemu Windows przez inne firmy: przede wszystkim projekt Wine i projekt ReactOS.

Interfejs API systemu Windows jest obiektem dynamicznym. Liczba funkcji stale rośnie nowa wersja System operacyjny i nowe dodatki Service Pack. Istnieją również ważne różnice między wersjami serwera a wersjami systemu operacyjnego dla komputerów stacjonarnych. Niektóre funkcje nie są oficjalnie udokumentowane.

Pelles c

Pelles C to darmowy program i najlepszy kompilator C oraz zintegrowane środowisko programistyczne (IDE) dla języka programowania C. Obsługuje 32-bitowy system Windows (x86) i 64-bitowy system Windows (x64). Implementuje zarówno standardy C99, jak i C11. Pelles C ma wbudowany edytor zasobów, bitmapę, edytor ikon i kursorów oraz edytor zrzutów szesnastkowych. Został opracowany przez szwedzkiego programistę Pelle Orinius. Nazwa kompilatora nosi imię jego autora. Jest dostarczany z zestawem SDK, dzięki czemu programista może natychmiast rozpocząć tworzenie aplikacji bez dalszej instalacji.

Błąd architektury docelowej

Aby tworzyć programy Windows API, musisz włączyć rozszerzenia Microsoft. Domyślnie są one wyłączone, dlatego kompilator generuje następujący komunikat o błędzie, który służy jako przykład C WinAPI ze zepsutą strukturą: błąd krytyczny # 1014: #error: „Brak architektury docelowej”. Aby włączyć rozszerzenia Microsoft, przejdź do ustawień projektu i wybierz kartę „Kompilator”. Na tej karcie aktywuj pole wyboru „Włącz rozszerzenia Microsoft”.

MSDN

Jest to centralny portal do tworzenia systemu Windows. To ogromny zbiór materiałów związanych z tworzeniem aplikacji przy użyciu narzędzi Microsoft. Jest to najbardziej wszechstronna baza wraz z dokumentacją programistyczną i listą interfejsów API systemu Windows.

Korzystanie z DLL w WinAPI C.

Wspólna biblioteka sterująca zapewnia dostęp do zaawansowanych funkcji systemu operacyjnego, takich jak paski stanu, paski postępu, paski narzędzi i karty. Te polecenia znajdują się w bibliotece commctrl.dll w systemach 16-bitowych i comctl32.dll i są zgrupowane z interfejsem użytkownika.

DLL jest formatem biblioteki dołączanej dynamicznie, służącym do przechowywania kilku kodów i procedur programy Windows. Pliki DLL zostały utworzone w taki sposób, że kilka programów mogło jednocześnie korzystać z ich informacji, pomagając oszczędzać pamięć. Pozwala użytkownikowi edytować kodowanie kilku aplikacji jednocześnie bez ich zmieniania. Biblioteki DLL można konwertować na statyczne za pomocą narzędzia MSIL Disassembler lub DLL dla Lib 3.00.

WinAPI jako interfejs programowania aplikacji dla systemu Windows oferuje wiele zaawansowanych funkcji, które pozwalają tworzyć własne programy, od prostego przetwarzania plików do budowy interfejsu graficznego do programowania sterowników urządzeń niskiego poziomu.

Przed rozpoczęciem programowania w WinAPI należy skonfigurować środowisko dla kodu w systemie Windows. Ponieważ tak nie jest dystrybucja systemu Linux, nie ma wbudowanego kompilatora do tworzenia aplikacji. Rozważ następujące opcje kompilowania kodu:


Dostępny jest zestaw deweloperski dla systemu Windows, który zawiera dokumentację i narzędzia umożliwiające programistom tworzenie oprogramowania przy użyciu interfejsu API i powiązanych technologii.

Interfejs API programowania aplikacji systemu Windows (interfejs programowania aplikacji) to interfejs programowania systemu w trybie użytkownika dla rodziny systemów operacyjnych Windows. Przed wydaniem 64-bitowych wersji systemu Windows interfejs programowania dla 32-bitowych wersji systemów operacyjnych Windows był nazywany Win32 API, dzięki czemu można go było odróżnić od oryginalnej wersji 16-bitowej. wersje systemu Windows API (który służył jako interfejs programowania dla początkowych 16-bitowych wersji systemu Windows).

Windows API składa się z kilku tysięcy wywoływanych funkcji, które są podzielone na następujące główne kategorie:

  • Usługi podstawowe
  • Usługi składowe
  • Usługi interfejsu użytkownika
  • Usługi graficzne i multimedialne (usługi graficzne i multimedialne).
  • Wiadomości i współpraca (Wiadomości i współpraca).
  • Networking
  • Usługi internetowe

Opis interfejsu WindowsAPI można znaleźć w dokumentacji zestawu programistycznego - WindowsSoftwareDevelopmentKit (SDK). Ta dokumentacja jest dostępna na stronie www.msdn.microsoft.com. Jest również uwzględniony na wszystkich poziomach subskrypcji w MicrosoftDeveloperNetwork (MSDN) zaprojektowanej dla programistów.

Microsoft .NET Framework składa się z biblioteki klas o nazwie Framework Class Library (FCL) i środowiska wykonawczego kodu zarządzanego - Common Language Runtime (CLR). CLR ma funkcje terminowej kompilacji, sprawdzania typu, wyrzucania elementów bezużytecznych i bezpieczeństwa dostępu do kodu. Oferując te funkcje, CLR zapewnia środowisko programistyczne, które poprawia wydajność programisty i zmniejsza liczbę typowych błędów programistycznych.

CLR jest zaimplementowany jako klasyczny serwer COM, którego kod znajduje się w standardowej bibliotece DLL systemu Windows, zaprojektowanej do pracy w trybie użytkownika. Praktycznie wszystkie komponenty .NET Framework są implementowane jako standardowe okna Biblioteki DLL trybu użytkownika nałożone na niezarządzane funkcje Windows API. (Żaden ze składników .NET Framework nie działa w trybie jądra.) Relacje między tymi komponentami pokazano na rysunku.

Usługi, funkcje i standardowe programy.

Niektóre terminy w dokumentacji użytkownika i oprogramowania Windows mają różne znaczenie w różnych kontekstach. Na przykład usługa słów może odnosić się do standardowej procedury wywoływanej w systemie operacyjnym, sterowniku urządzenia lub procesie serwowania. Co dokładnie oznaczają te lub te terminy, pokazano na poniższej liście:

  • Funkcje Windows API. Udokumentowane, zwane procedurami w WindowsAPI. Na przykład CreateProcess, CreateFile i GetMessage.
  • Natywne usługi systemowe (lub wywołania systemowe). Nieudokumentowane podstawowe usługi w systemie operacyjnym, które są wywoływane podczas pracy w trybie użytkownika. Na przykład NtCreateUserProcess jest usługą wewnętrzną wywoływaną przez funkcję Windows CreateProcess w celu utworzenia nowego procesu.
  • Funkcje obsługi jądra (lub procedury). Procedury w systemie operacyjnym Windows, które można wywoływać tylko z trybu jądra. Na przykład ExAllocatePoolWithTag to procedura wywoływana przez sterowniki urządzeń w celu alokacji pamięci z dynamicznie przydzielanych obszarów systemu Windows (zwanych pulami).
  • Usługi Windows Procesy uruchomione przez Service Control Manager (Windowsservicecontrolmanager). Na przykład usługa Menedżera zadań zaczyna się jako proces w trybie użytkownika, który obsługuje polecenie at (podobnie jak w UNIX at lub cron).
  • Biblioteki DLL (biblioteki z linkami dynamicznymi - biblioteki z linkami dynamicznymi). Zestaw wywoływanych procedur, które są połączone razem jako plik binarny, który może być dynamicznie ładowany przez aplikacje korzystające z tych procedur. Przykłady obejmują Msvcrt.dll (biblioteka wykonawcza dla aplikacji napisanych w C) i Kernel32.dll (jedna z bibliotek podsystemu API Windows). Pliki DLL są szeroko stosowane przez komponenty i aplikacje Windowsktóre działają w trybie użytkownika. Przewagą bibliotek DLL w stosunku do bibliotek statycznych jest to, że mogą być używane jednocześnie przez kilka aplikacji, a system Windows zapewnia, że \u200b\u200btylko jedna kopia kodu biblioteki DLL jest dostępna w pamięci dla aplikacji, które mają łącza do tej biblioteki. Należy zauważyć, że niewykonywalne zestawy .NET są kompilowane jako biblioteki DLL, ale bez eksportowanych procedur. CLR analizuje skompilowane metadane w celu uzyskania dostępu do odpowiednich typów i elementów klas.

Historia Win32 API.

Co ciekawe, Win32 nie był planowany jako interfejs programowania początkowego dla systemu, który w tym czasie nosił nazwę Windows NT. Ponieważ projekt Windows NT został uruchomiony jako zamiennik OS / 2 w wersji 2, oryginalnym interfejsem programowania był 32-bitowy OS / 2 PresentationManagerAPI. Ale rok po uruchomieniu projektu nastąpił start, który trafił do sprzedaży Microsoft Windows 3.0 W rezultacie Microsoft zmienił kierunek i uczynił Windows NT przyszłym zamiennikiem rodziny produktów Windows, a nie zamiennikiem OS / 2. W związku z tym konieczne było opracowanie specyfikacji dla Windows API - wcześniej w Windows 3.0 API istniało tylko w postaci interfejsu 16-bitowego.

Chociaż planowano wprowadzić wiele nowych funkcji w interfejsie API systemu Windows, które nie były dostępne w systemie Windows 3.1, Microsoft zdecydował, aby nowy interfejs API był jak najbardziej zgodny z nazwami, semantyką i typami danych używanymi w 16-bitowym interfejsie API systemu Windows, aby zmniejszyć obciążenie związane z migracją istniejącego 16-bitowego systemu Windows Aplikacje w systemie Windows NT. To faktycznie tłumaczy fakt, że wiele nazw funkcji i interfejsów może wydawać się niespójnych: było to konieczne, aby zapewnić kompatybilność nowe okna Interfejs API ze starym 16-bitowym interfejsem Windows API.

DZWON

Są tacy, którzy czytają te wiadomości przed tobą.
Subskrybuj, aby otrzymywać świeże artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać Dzwon
Bez spamu