LEKCJA 43: Elementy steruj�ce i zarz�dzanie programem. ________________________________________________________________ Jak sterowa� prac� aplikacji. Jak umieszcza� elementy graficzne-steruj�ce w oknie aplikacji. Najcz�ciej stosowane funkcje API Windows. ________________________________________________________________ Elementy steruj�ce prac� aplikacji w Windows (ang. controls) s� r�wnie� swoistymi okienkami (tyle, �e potomnymi - Child Window wobec g��wnego okna aplikacji - Parent Window). Do utworzenia takiego specjalnego okna r�wnie� mo�na u�y� funkcji CreateWindow(). Je�li okno ma sta� si� nie g��wnym oknem aplikacji, lecz oknem steruj�cym przebiegiem programu, funkcja wymaga podania nast�puj�cych argument�w: - rodzaj klasy steruj�cej (ang. control class) - rodzaj elementu steruj�cego (ang. control style) Typowe rodzaje element�w (obiekt�w) staruj�cych w �rodowisku Windows: BUTTON - klawisz rozkazu, prostok�tne okno typu Child, reprezentuj�ce przycisk, kt�ry u�ytkownik mo�e w��czy�; przycisk mo�e by� opatrzony etykiet� (text label). COMBOBOX - okienko dialogowe kombinowane. Jest z�o�eniem klasy EDIT i LISTBOX; LISTBOX - oknienko z list� (zwykle element sk�adowy okienka dialogowego typu Combo Box. STATIC - pole statyczne (bez prawa edycji). Niewielkie okno zawieraj�ce tekst lub grafik�; s�u�y z regu�y do oznaczania innych okien steruj�cych. SCROLLBAR - pasek przewijania (pionowy - Vertical Scroll Bar; poziomy - Horizontal Scroll Bar). Style klawiszy steruj�cych (Button Styles): BS_PUSHBUTTON - Klawisz. Okno steruj�ce wysy�a, po ka�dym wyborze klawisza (klikni�cie), wiadomo�� do okna macie�ystego (Parent Window). BS_RADIOBUTTON - Okr�g�y prze��cznik dzia�aj�cy zwykle na zasadzie @tylko jeden z grupy". BS_CHECKBOX - - prostok�tny prze��cznik [X] w��czaj�cy (aktywna) lub wy��czaj�cy (nieaktywna) opcj�. Dzia�a niezale�nie od pozosta�ych. Inne style okre�laj� np. spos�b edycji tekstu (ES_LEFT, ES_MULTILINE, itp.) Szczeg�y - patrz system Help - Windows API. Oto przyk�ad utworzenia okna elementu steruj�cego typu "Klawisz" (BUTTON to nazwa typu): hControlWnd = CreateWindow ("BUTTON", " Napis_na_Klawiszu ", BS_PUSHBUTTON |WS_CHILD | WS_VISIBLE, 10, 20, 30, 40, hWnd, ID_Elem, hInstance, 0); Identyfikator ID_Elem jest potrzebny, gdy w jednym oknie znajduje si� kilka element�w steruj�cych - pozwala na ich rozpoznawanie w programie. Spos�b przekazywania informacji o klikni�ciu klawisza przypomn� na przyk�adzie okienka komunikat�w: if(IDOK==MessageBox(0, "", "", MB_OK)) ... IDOK to predefiniowany w Windows identyfikator klawisza [OK]. Oto kr�tkie wyja�nienie pozosta�ych element�w: 10, 10, 30, 20, - wsp�rz�dne. x, y, szeroko��, wysoko�� hWnd, - oznacznik okna macie�ystego Przesuwanie i zmiana wielko�ci elementu steruj�cego. Funkcja MoveWindow() przesuwa okno we wskazane miejsce: MoveWindow(hKlawisz, 10, 10, 20, 30, TRUE); Poniewa� okno elementu steruj�cego ma zadane wzgl�dne wsp�rz�dne w oknie macie�ystym, gdy okno macierzyste zostanie przesuni�te - element steruj�cy b�dzie przesuni�ty automatycznie. R�wnie� po zmianie rozmiar�w okna macie�ystego okno elementu steruj�cego zmienia po�o�enie, zawsze jednakowe wzgl�dem lewego g�rnego rogu. Usuwanie okna steruj�cego Okienko elementu steruj�cego mo�emy usun�� (jak i ka�de inne okna) przy pomocy funkcji: DestroyWindow(hKlawisz); Przekazywanie informacji do- i z- okna elementu steruj�cego Zdarzenie w oknie elementu steruj�cego - np. klikni�cie klawisza - powoduje wygenerowanie komunikatu WM_COMMAND. Towarzysz�ce komunikatowi parametry przenosz� istotne informacje: wParam - identyfikator elementu steruj�cego, lParam - dla wci�ni�tego klawisza b�dzie to BN_CLICKED. Niekt�re komunikaty Windows mog� by� kierowane do okna elementu steruj�cego i wymusza� pewne operacje. Dla przyk�adu komunikat WM_GETTEXTLENGTH przes�any do okienka edycyjnego typu Text Edit Box (element steruj�cy klasy EDIT) jest ��daniem podania d�ugo�ci tekstu wpisanego w�a�nie do okienka. Aby Windows wygenerowa�y komunikat i przes�a�y go do naszego elementu steruj�cego - musimy "poprosi�" przy pomocy funkcji SendMessage() (Wy�lijKomunikat): DlugTekstu = SendMessage(hEditWnd, WM_GETTEXTLENGHT, 0, 0); gdzie: hEditWnd jest identyfikatorem elementu - okienka edycyjnego [???]Robi na "szaro'? ________________________________________________________________ Podobnie jak opcje w menu - klawisze tak�e mog� zosta� udost�pnione (ang. enable), b�d� zablokowane (ang. disable). Je�li hKlawisz b�dzie identyfikatorem elementu steruj�cego, mo�na go udost�pni� (1), b�d� zablokowa� (0) przy pomocy funkcji: EnableWindow(hKlawisz, 0); EnableWindow(hKlawisz, 1); ________________________________________________________________ Typowy projekt dla �rodowiska Windows sk�ada si� z kilku (czasem kilkunastu) plik�w: .H, .MNU, .DLG, .RC, .DEF, .PRJ, .ICO, .BMP, itp. Kompilator zasob�w generuje na podstawie tego "sk�adu" ko�cowy plik aplikacji. ------------------Plik MEDYT-01.H------------------------------- #define szAppName "MEDYT-01" #define ID_EDIT 200 ------------------Plik g��wny: MEDYT-01.CPP--------------------- #include <windows.h> #include "EDIT.H" #pragma argused HWND hEditWnd; long FAR PASCAL WndProc (HWND, unsigned, WORD, LONG) ; int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { WNDCLASS wndClass; MSG msg; HWND hWnd; RECT rect; if ( !hPrevInstance ) { wndClass.style= CS_HREDRAW | CS_VREDRAW ; wndClass.lpfnWndProc= WndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra= 0; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(NULL, szAppName); wndClass.hCursor= LoadCursor(NULL, IDC_CROSS); wndClass.hbrBackground= GetStockObject(WHITE_BRUSH ); wndClass.lpszMenuName= NULL; wndClass.lpszClassName= szAppName; if (!RegisterClass(&wndClass)) return 0; } hWnd = CreateWindow(szAppName, "MEDYT-01", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInstance, 0); GetClientRect(hWnd, (LPRECT) &rect); hEditWnd = CreateWindow ("Edit",NULL, WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0, 0,(rect. right - rect. left), (rect. bottom - rect. top),hWnd,IDC_EDIT, hIstance,NULL); if( ! hEditWnd ) { DestroyWindow(hWnd); return 0; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg ); DispatchMessage(&msg ); } return 0; } long FAR PASCAL WndProc (HWND hWnd, unsigned Message, WORD wParam, LONG lParam) { switch(Message) { case ID_EDIT: if(HIWORD(lParam)==EN_ERRSPACE) /* starsze s�owo lParam zawiera w�a�ciwe dla okna edycyjnego wiadomo�ci, je�eli jest to EN_ERRSPACE - okno steruj�ce nie mo�e alokowa� dodatkowego obszaru pami�ci */ { MessageBox (GetFocus(), "Brak pamieci", "MEDYT-01", MB_ICONSTOP | MB_OK); } break; case WM_SETFOCUS: SetFocus(hEditWnd); break; /* Pierwsze dwa parametry funkcji MoveWindow s� ustawione na zero, dzi�ki temu po zastosowaniu tej funkcji nie zmieni si� wzajemne po�o�enie obu okien, a jedynie uaktualnianiu ulegnie okno steruj�ce. */ case WM_SIZE: MoveWindows(hEditWnd, 0, 0, LOWORD(lParam)); HIWORD(lParam), TRUE); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd,Message,wParam,lParam)); } return 0; } Jak sterowa� prac� aplikacji. Jak umieszcza� elementy graficzne-steruj�ce w oknie aplikacji. Najcz�ciej stosowane funkcje API Windows. ________________________________________________________________ Elementy steruj�ce prac� aplikacji w Windows (ang. controls) s� r�wnie� swoistymi okienkami (tyle, �e potomnymi - Child Window wobec g��wnego okna aplikacji - Parent Window). Do utworzenia takiego specjalnego okna r�wnie� mo�na u�y� funkcji CreateWindow(). Je�li okno ma sta� si� nie g��wnym oknem aplikacji, lecz oknem steruj�cym przebiegiem programu, funkcja wymaga podania nast�puj�cych argument�w: - rodzaj klasy steruj�cej (ang. control class) - rodzaj elementu steruj�cego (ang. control style) Typowe rodzaje element�w (obiekt�w) staruj�cych w ...
lazarusp22