05 Stosowanie kontrolek tekstowych


Rozdział 5
Stosowanie kontrolek tekstowych
Wyświetlanie informacji i komunikatów w oknach dialogowych
Manipulowanie tekstem w czasie pracy programu
Zatwierdzanie wprowadzanych danych
Rozszerzanie użyteczności kontrolek za pomocą podklas
Przez wiele lat przed pojawieniem się systemu Windows i jego graficznego interfejsu
komputery miały ograniczone możliwości wyświetlania tekstu. Tekst był prezentowany w
maksymalnie 80 liniach, po 80 znaków. Królowały monitory wyświetlające litery złożone z
pojedynczych pikseli, w zielonym kolorze na czarnym tle. Istniała również odmiana
posługująca się kolorem bursztynowym. W przeciwieństwie do tego, co niektórzy sądzą, nie
wyszły one całkiem z użycia. Dzieje się tak dlatego, ponieważ znakomita większość
informacji wprowadzanych do komputera i z niego wyprowadzanych występuje w formie
tekstu, co pozwala przedłużyć żywot aplikacjom pracującym w trybie tekstowym. Niezależnie
od trybu, aplikacje pobierające informacje tekstowe i wyświetlające je w tym samym
formacie, wciąż są potrzebne.
W oknach dialogowych teksty informacyjne wyświetlane są za pośrednictwem sta-
tycznych pól tekstowych, a teksty wprowadzane do komputera pobierane za pomocą pól
edycyjnych.
Stosowanie statycznych pól tekstowych
Gdybyśmy zapytali kogoś, ile słów wart jest jeden obraz, odpowiedź brzmiałaby
prawdopodobnie "tysiąc". Ale gdyby dwojgu ludziom pokazać ten sam obraz, prosząc o
określenie jednym słowem jego treści, padłyby zapewne określenia odmienne. Słowa są więc
najlepszym sposobem przekazywania informacji, pozwalającym na dokładne ich
precyzowanie. Ścisłość informacji pożądana jest na przykład w przypadku okien dialogowych.
Tekst wykorzystywany jest w nich jako opis kontrolek, opcji, a czasem nawet służy do
wyświetlania pewnych treści informacyjnych, takich jak zastrzeżenia praw autorskich.


102 Poznaj Visual C++ 6
Formatowanie tekstów w oknach dialogowych
Gdy zachodzi potrzeba umieszczenia prostego tekstu wewnątrz okna dialogowego, posłużyć się
możemy statycznym polem tekstowym. Każde takie pole zawierać może do 255 znaków. Poprzez użycie
znaków nakazujących \n wymuszać możemy przejście do nowej linii, tekst może być wyrównany do
lewej lub prawej strony bądź wypośrodkowa-ny. Stosowanie stylów umożliwia nam umieszczanie wokół
pól tekstowych ramek o różnym wyglądzie. Użycie statycznych pól tekstowych przy odrobinie
pomysłowości, pozwala na konstruowanie wyrafinowanych okien dialogowych, jak na rysunku 5.1.
MourtainJourney
The (oothilb with theił genlle stopes Point to
grandeut yet to come Whete mountains lear
theit towering heads;
Ascend in splendioin ali theit owi. Theif forms
arę mirrored in the depths of watets blue. that
[ound them lie. And ali arę meiged where
lushing slieams crash out their mulic to the
sky.
Rysunek 5.1. Przykład statycznego pola tekstowego
Łączenie statycznych pól tekstowych z polami edycji
Najpowszechniejszym zastosowaniem statycznych pól tekstowych w oknach dialogowych jest
użycie ich do opisu pól edycji. Pola edycji są obiektami, które umożliwiają użytkownikowi
wprowadzanie informacji. Statyczne pola tekstowe umieszczane są tuż obok pól edycji, gdyż te ostatnie
nie posiadają opisujących je nagłówków.
Jeśli statyczne pole tekstowe umieścimy przed polem edycji, umożliwi nam to utworzenie skrótu
klawiaturowego do tegoż pola. Skrót ten występuje w postaci mnemoniki zawartej w treści pola
tekstowego. Mnemonika pozwala na szybszy dostęp do kontrolki, poprzez wciśnięcie jednego klawisza.
Litera, która pełni tę rolę, jest określona poprzez poprzedzenie jej znakiem & w nagłówku kontrolki. Na
przykład, nagłówek zapisany Fo-ot&ball określa literę "b" lub "B" jako mnemonikę dla danego obiektu.
W nagłówku tym, litera "b" zostanie podkreślona: Football. Każda mnemonika powinna być w danym
oknie dialogowym niepowtarzalna. Czy tak jest, sprawdzić możemy wybierając pozycję Check
Mnemonics z menu skrótów w edytorze zasobów.
Statyczne pole tekstowe nie może być obiektem aktywnym, więc użycie wskazanego skrótu
klawiaturowego powoduje uaktywnienie następnego obiektu według porządku tabulacji. Gdy pole edycji
staje się aktywne, automatycznie umieszczony zostaje w nim kursor, w gotowości na przyjęcie danych.


Stosowanie kontrolek tekstowych 103
Działanie mnemonik
Jeśli zostanie użyta mnemonika obiektu, który nie jest dostępny, aktywną staje się kontrolka następna w
kolejności tabulacji. Zmienić to zachowanie programu można poprzez utworzenie podklasy dla
statycznego pola tekstowego.
PATRZ TAKŻE
O tworzeniu pól edycji można przeczytać dalej w tym rozdziale.
Zmiana zawartości statycznego pola tekstowego w czasie pracy programu
Statyczne pole tekstowe może okazać się przydatne, gdy chcemy wyświetlić komunikat.
Na przykład, użytkownik posługujący się aplikacją sieciową, mógłby obserwować okno
dialogowe stanu podające liczbę użytkowników aktualnie korzystających z danej aplikacji lub
systemu. Statyczne pole tekstowe idealnie nadaje się do takiego zastosowania. Zważywszy
jednak, że liczba aktywnych użytkowników może ulegać zmianie, zawartość pola tekstowego
również musi się zmieniać podczas pracy programu. Teraz zajmiemy się tworzeniem
informacyjnych okien dialogowych, w których pola tekstowe wykorzystamy do wyświetlania
takich informacji, jak nazwa komputera, imię użytkownika oraz ilość pamięci, całkowitej i
wolnej.
Zaczniemy od utworzenia w AppWizard nowego projektu w oparciu o okno dialogowe o
nazwie Sysinfo.
Kiedy szkielet nowej aplikacji mamy już gotowy, musimy do jego okna dialogowego
dodać osiem statycznych pól tekstowych oraz jeden przycisk sterujący.
Umieszczanie statycznych pól tekstowych w oknie dialogowym
1. W edytorze zasobów otwórz okno dialogowe IDD_SYSINFO_DIALOG. Kliknij napis
TODO: Place Dialog Controls Herę, a następnie usuń go za pomocą klawisza Delete.
2. Na pasku narzędziowym Controls wybierz symbol statycznego pola tekstowego, a
następnie nanieś cztery takie pola na szablon okna dialogowego. Umieść je po lewej
stronie okna, jak na rysunku 5.2.
3. Zmień nagłówki pól tekstowych, wzorując się na rysunku 5.2.
4. Z paska narzędziowego Controls wybierz pozycję statycznego pola tekstowego, następnie
umieść takie pole po prawej stronie Computer Name.
5. Zmień identyfikator nowego pola, wpisując IDC_COMPUTER_NAME.
6. Umieść po prawej stronie Total Memory kolejne statyczne pole tekstowe.


104 Poznaj Visual C++ 6
7. Nowemu polu tekstowemu nadaj identyfikator IDC_TOTAL_MEMORY.
8. Z prawej strony Free Memory umieść następne pole tekstowe.
9. Jako jego identyfikator ID wpisz IDC_FREE_MEMORY.
10. Umieść na szablonie jeszcze jedno statyczne pole tekstowe, po prawej stronie Memory
Load.
11. Wpisz IDC_MEMORY_LOAD jako jego identyfikator.
12. Zaznacz wszystkie cztery dodane pola, klikając je kolejno i przytrzymując klawisz CtrI. Z
pola edycji zwierającego nagłówek Caption usuń wpis Static. Kliknij kartę Styles, a na
niej zaznacz opcję Sunken.
13. Wybierz z paska narzędziowego Controls symbol przycisku wciskanego i umieść na
szablonie jeden taki przycisk, w prawym dolnym rogu okna dialogowego.
14. Nadaj mu identyfikator: IDC_REFRESH, a jako nagłówek wpisz Refresh. Okno
powinno wyglądać jak na rysunku 5.2.
OK


^Computef
Name' flotal
Memory:
;Free Memory:
Memory Load:
Cancel
Reftesh






Rysunek 5.2. Układ okna dialogowego Sysinfo
Cztery pola tekstowe, w prawej kolumnie będą wyświetlały informacje o komputerze,
odświeżane za każdym kuknięciem Refresh. Aby jednak umożliwić aplikacji odświeżanie,
należy obiektom kontrolnym przypisać zmienne, co uczynimy według poniższej procedury.
IDC_STATIC jest identyfikatorem specjalnym
Domyślnie każdemu statycznemu polu tekstowemu przypisywany jest jednakowy identyfikator:
IDC_STATIC. Jest to specjalny identyfikator o wartości -l. Chcąc przypisać zmienną oknu
tekstowemu, trzeba jego wartość zmienić.
Przypisanie zmiennych statycznym polom tekstowym za pomocą CIassWizard
1. Naciśnij CtrI+W lub wybierz pozycję CIassWizard z menu View, by uruchomić to
narzędzie.
2. Kliknij kartę Member Variables.


Stosowanie kontrolek tekstowych 105
3. W oknie listy rozwijanej CIass Name wybierz klasę okna dialogowego; w naszym przykładzie
CSysinfoDIg.
4. Z listy Control ID wybierz identyfikator statycznego pola tekstowego IDC_COMPUTER_NAME.
Kliknij Add Variable, co wywoła okno dialogowe Add Member Variable. Okno to możesz
wywołać również poprzez dwukrotne kliknięcie identyfikatora z listy.
5. Upewnij się, że w oknie listy rozwijanej Category widnieje wpis Value, a w oknie Variable Type
znajduje się CString.
6. W polu nazwy zmiennej, czyli Member Variable Name, wpisz m_strComputerName,
następnie kliknij OK.
7. Z listy identyfikatorów wybierz IDC_TOTAL_MEMORY i kliknij Add Variable.
8. W polu Member Variable Name wpisz m_strTotalMemory. Kliknij OK.
9. Wybierz identyfikator IDC_FREE_MEMORY, kliknij Add Variable.
10. Wpisz m_strFreeMemory jako nazwę zmiennej, a następnie kliknij OK.
11. Wybierz z listy IDC_MEMORY_LOAD i naciśnij Add Variable.
12. Nowej zmiennej nadaj nazwę m_strMemoryLoad, po czym kliknij OK.
13. Na koniec kliknij OK w oknie CIassWizard.
Musimy jeszcze dodać funkcję obsługi komunikatu BN_CLICKED dla przycisku IDC_REFRESH.
Procedura jest identyczna z wykonaną w punkcie "Dodanie funkcji obsługi kliknięcia przycisku",
zawartym w rozdziale 4. W jej wyniku otrzymamy nową funkcję składową OnRefresh (). Jej działanie
polegać będzie na odnawianiu zawartości zmiennych przypisanych do kolejnych statycznych pól
tekstowych. Aby uzyskać takie działanie, musimy dopisać kod zawarty na listingu 5.1.
Listing 5.1. LST05_1.CPP zmiana zawartości statycznych pól tekstowych podczas pracy
programu
1 void CSysinfoDIg::OnRefresh()
2 (
3 // TODO: Tutaj umieść kod funkcji obsługi
4 II ** Zmienne użyte do pobrania nazwy komputera
5 TCHAR szBuffer[256] ;
6 DWORD dwSize = 256;
7
8 // ** Pobranie od systemu Windows nazwy komputera
9 GetComputerName(szBuffer, sdwSize); O
10
11 // ** Przekazanie nazwy komputera do składowej zmiennej


12
13 m_strComputerName = szBuffer;
14
15 // ** Umieszczenie struktury służącej pobraniu danych o pamięci
16 MEMORYSTATUS mem_stat; @
17
18 // ** Sprawdzenie aktualnego stanu pamięci
19 GlobalMemoryStatus(&mem stat) ;
20
21 // ** Przekazanie danych dotyczących pamięci do odpowiednich
22 II** zmiennych składowych
23 m_strTotalMemory.Format("%ld KB", @
24 mem_stat.dwTotalPhys / 1024);
25 m_strFreeMemory.Format("%ld KB",
26 meni_s t at.dwAvai.lPh y s / 1024) ;
27 m_strMemoryLoad.Format("%d %%",
28 mem_stat.dwMemoryLoad);
29
30 //. ** Uaktualnienie danych do wyświetlenia w polach tekstowych
31 UpdateData(FALSE);
32 }
O Nazwa komputera zostaje pobrana przez funkcję GetComputerName () i zapisana w zmiennej typu s
t r.
Struktura MEMORYSTATUS przechowuje szczegóły dotyczące fizycznej oraz wirtualnej pamięci
komputera.
Zmienna znakowa użyta zostaje do sformułowania komunikatów dotyczących pamięci komputera,
które następnie zostaną wyświetlone w oknie dialogowym.
W liniach 5 i 6 zostały zadeklarowane dwie zmienne lokalne, a następnie w linii 9 przypisane do funkcji
GetComputerName O jako jej argumenty. Tymi argumentami będą:
bufor znakowy, w którym funkcja przechowuje nazwę komputera oraz adres zmiennej DWORD,
określającej maksymalną wielkość bufora znakowego. Zmienna reprezentująca bufor została
zadeklarowana w linii 5 przy użyciu makra TCHAR. Makro to jest wykorzystywane podczas pisania
aplikacji kompatybilnych z zestawami znaków ANSI oraz Uni-code. Zestaw znaków Unicode używa
dwóch bajtów dla reprezentacji każdego znaku i jest standardem używanym do kodowania wszelkich
możliwych znaków narodowych.
W linii 13 zawartość bufora znakowego przekazywana jest do zmiennej m_str-ComputerName,
przypisanej do statycznego pola tekstowego IDC_COMPUTER_NAME.


Stosowanie kontrolek tekstowych 107
Użyteczne funkcje systemowe
Oprócz funkcji GetComputerName (), wykorzystać można również funkcję Get-UserName () dla
pobrania imienia lub nazwiska użytkownika, a także funkcję Get-VersionEx () w celu określenia
systemu operacyjnego, w którym działa aplikacja.
W ramach struktury MEMORYSTATUS zostaje zadeklarowana w linii 16 zmienna mem_stat.
Wszystkie elementy składowe struktury MEMORYSTATUS są pokazane na listingu 5.2. W linii 19 adres
zmiennej mem_stat zostaje podany funkcji GlobalMemorySta-tus (), która zapisuje w zmiennych
struktury bieżące dane dotyczące pamięci komputera. Użyta w liniach 23, 25 i 27 funkcja CString::
Format () służy do wyodrębnienia ze zmiennych mem_stat informacji, które z kolei posłużą do
uaktualniania zawartości zmiennych klasy CString, przypisanych do statycznych pól tekstowych,
wyświetlających dane dotyczące pamięci komputera.
Odwołanie do funkcji UpdateData () odbywa się w linii 31 z parametrem FALSE, by odświeżyć treść
wszystkich czterech statycznych pól tekstowych.
Po skompilowaniu i uruchomieniu programu każde kliknięcie przycisku Refresh powodować
będzie odświeżenie informacji. Spróbujmy zatem uruchomić kilka innych aplikacji, a klikając Refresh
zaobserwować zmiany zachodzące w polach tekstowych, odnoszących się do pamięci komputera. Nasze
okno dialogowe powinno wyglądać jak na rysunku 5.3.
Zastanawiającym może być, dlaczego wartość wyświetlana w polu tekstowym Memo-ry Load,
identyfikującym obciążenie pamięci, nie zwiększa się w miarę uruchamiania kolejnych aplikacji. Otóż
dzieje się tak dlatego, ponieważ pole wyświetla dane dotyczące sumy pamięci fizycznej oraz wirtualnej,
która występuje w postaci pliku używanego jako część pamięci.
Listing 5.2. LST05_2.CPP - struktura MEMORYSTATUS
1 typedef struct _MEMORYSTATUS (
2 DWORD dwLength;
3 DWORD dwMemoryLoad;
4 DWORD dwTotalPhys;
5 DWORD dwAvailPhys;
6
7 DWORD dwAvailPageFile;
8 DWORD dwTotalVirtual;
9 DWORD dwAvailVirtual;
10 } MEMORYSTATUS;


108 Poznaj Visual C++ 6
Pamięć wirtualna
Aby aplikacje w systemie Windows mogły korzystać z większej ilości pamięci, niż wynosi jej
fizyczna wielkość, pewna część dysku zostaje wykorzystana jako pamięć dodatkowa. Ta część
pamięci nazywana jest pamięcią wirtualną.







Computer Name: i1'1*1-2
TolalMemory: ,65052 KF
FieeMemory: [13588 KB""
Memory Load: l53 ^





Rysunek 5.3. Okno wyświetlające dane dotyczące komputera
PATRZ TAKŻE
ł O tym, jak tworzyć aplikacje o architekturze okna dialogowego mówimy w rozdziale 3. 4 Więcej informacji
na temat projektowania okien dialogowych jest w rozdziale 3. * Pomoc w zakresie dodawania funkcji obsługi
znajduje się w rozdziale 3.
Używanie pól edycji
Ile liter i cyfr jest wprowadzanych do komputerów na całym świecie każdego dnia? Jak wielu ludzi
dokonuje operacji wprowadzania danych bankowych czy też zamówień? Ile by ich nie było, w znacznej
wielkości w środowisku Windows odbywa się to za pomocą pól edycji.
Pola edycji służą do wprowadzania tekstu i w odpowiedzi wyświetlania go na ekranie. Litery, cyfry
oraz zwykłe znaki pisarskie, które widnieją na klawiaturze komputera, mogą być wprowadzone i
wyświetlone właśnie w polu edycji. Pola te posiadają pewne możliwości w zakresie formatowania
wprowadzonego tekstu. Na przykład, część lub całość tekstu widniejącego w polu edycji może zostać
zaznaczona za pomocą myszy lub klawiatury, po czym może być wycięta lub skopiowana do innego pola
edycji. Dodatkowo, możemy skorzystać z menu skrótów, z którego mamy dostęp do takich czynności
jak: Undo (cofnięcie operacji), Cut (wycięcie zaznaczonego fragmentu wraz ze skopiowaniem do
schowka), Copy (skopiowanie fragmentu do schowka). Pastę (wklejenie fragmentu przechowywanego
w schowku), Delete (usunięcie danego fragmentu, oraz Select Ali (zaznaczenie całości tekstu).


Stosowanie kontrolek tekstowych 109
Ograniczenie pojemności jednoliniowych pól edycji
Pojemność jednoliniowych pól edycji jest ograniczona do maksymalnie 32 kB, co oznacza możliwość
umieszczenia w nim około 32 000 znaków.
Do dyspozycji mamy różne użyteczne style, które możemy przypisywać polom edycji. Styl
Password powoduje ukrycie tekstu wprowadzonego przez użytkownika, zwykle zastępując wszystkie
wprowadzone znaki symbolem gwiazdki (*). Style Uppercase oraz Lowercase automatycznie
zamieniają wszystkie umieszczone w polu edycji znaki według ustalonego trybu. Z kolei styl Number
nie dopuszcza do wpisywania w polu edycji znaków, które nie są cyframi. Styl nie zezwala również na
użycie znaku kropki (.).
Kolejne punkty rozdziału będą mówić o tym, jak możemy spożytkować obiekty edycyjne. Najpierw
jednak musimy utworzyć nowy projekt. Użyjemy zatem znanego nam już narzędzia AppWizard, by
utworzyć projekt w oparciu o architekturę okna dialogowego. Nowemu projektowi nadamy nazwę Edits.
PATRZ TAKŻE
Szczegółowy opis tworzenia projektów znajduje się w rozdziale 3.
Umieszczenie pól edycji
Podobnie jak w przypadku pozostałych kontrolek pola edycji umieścimy na szablonie okna
dialogowego, otwartym w edytorze zasobów. Po wykonaniu tych poleceń powinniśmy otrzymać okno
dialogowe podobne do widocznego na rysunku 5.4.
Dodanie pól edycji do pola dialogowego
1. Otwórz w edytorze zasobów okno dialogowe IDD_EDITS_DIALOG. Usuń widniejący pośrodku napis,
zaznaczając go, a następnie naciskając klawisz Delete.
2. Z paska narzędziowego Controls wybierz symbol statycznego pola tekstowego, następnie umieść
takie pole w lewym górnym rogu okna dialogowego, jak na rysunku 5.4.
3. Upewniwszy się, że zaznaczyłeś dodane okno, kliknij prawym klawiszem myszy, a z otwartego menu
skrótów wybierz pozycję Properties. Otwarte zostanie okno dialogowe Text Properties, które za
pomocą pinezki w lewym górnym rogu możesz przypiąć, tak że będzie otwarte przez cały czas.
4. Jako nagłówek wpisz w polu Caption: &First.
5. Z paska narzędziowego Controls wybierz symbol pola edycji, a następnie umieść takie pole po prawej
stronie First.
6. W polu ID otwartego okna Properties wpisz identyfikator nowego pola edycji: IDC_ EDIT FIRST.


110 Poznaj Visual C++ 6
7. Po wybraniu z paska Control symbolu przycisku, umieść jeden przycisk po prawej stronie dodanego
przed chwilą pola edycji. Jego położenie widać na rysunku 5.4.
8. Wpisz IDC_GET_TEXT jako identyfikator, a jako nagłówek przycisku wpisz Get Text.
9. Z paska Controls wybierz statyczne pole tekstowe i umieść je poniżej okna First.
10. Wprowadź &Second jako jego nazwę.
11. Umieść nowe pole edycji po prawej stronie Second.
12. Ponownie wybierz symbol pola edycji i umieść nowe pole edycji po prawej stronie ostatnio
dodanego.
13. Wpisz lDC_EDZT_SHOwjako identyfikator, a na karcie Styks zaznacz opcję Read-oniy.
14. Rozciągnij ostatnio dodane pole edycji, aby całe okno dialogowe wyglądało jak na rysunku 5.4.
OK


; First
Edit
Cance)



; Second
Edit






Rysunek 5.4. Końcowy wygląd okna dialogowego Edits
Skróty klawiaturowe do pól edycji
Jeśli chcemy wykorzystać mnemonikę do utworzenia skrótu do pola edycji, pole to musi być następne
w kolejności tabulacji po statycznym polu tekstowym, w którym musimy umieścić żądaną
mnemonikę.
Okno dialogowe Edits pokazuje działanie mnemonik użytych w statycznych polach tekstowych.
Możemy więc przetestować działanie tego mechanizmu, naciskając Ctri+T lub wybierając pozycję Test
z menu Layout. Gdy uruchomimy tryb testowy, naciśnięcie kombinacji Alt+F powinno spowodować
ustawienie kursora w polu edycji po prawej stronie First. Podobnie naciśnięcie Alt+S powinno wywołać
pojawienie się kursora w polu edycji Second.
PATRZ TAKŻE
Szczegóły dotyczące tworzenia projektów w oparciu o okno dialogowe znajdują się w rozdziale 1.


Stosowanie kontrolek tekstowych 111
Umieszczanie i pobieranie tekstu z pola edycji
W przypadku pól edycji stanowiących element okna dialogowego wprowadzony do nich tekst
pobierany jest na żądanie, najczęściej na skutek kliknięcia przycisku OK. W tym momencie tekst jest
pobierany z pola edycji i przechowany wewnątrz programu lub zapisany na przykład w bazie danych.
Użyjemy teraz narzędzia CIassWizard, by przypisać zmienną klasy CString do pola edycji. Narzędzie to
deklaruje zmienną oraz wywołuje makra, które umożliwiają obsługę wymiany danych pomiędzy
zmiennymi i polami edycji.
Przypisanie za pomocą CIassWizard zmiennej klasy CString polu edycji
1. Naciśnij CtrI+W lub wybierz odpowiednią pozycję z menu View, by uruchomić CIassWizard.
2. Wybierz kartę Member Variables.
3. Z listy rozwijanej Ciass Name wybierz klasę okna dialogowego: CEditDIg.
4. Na liście identyfikatorów Control ID zaznacz identyfikator IDC_EDIT_FIRST.
5. Kliknij Add Variable. Otwarte zostanie okno dialogowe Add Member Variable.
Podwójne kliknięcie identyfikatora z listy wywoła ten sam efekt.
6. Upewnij się, że wybraną pozycją na liście rozwijanej Category jest Value, a Variable Type wskazuje
CString.
7. W polu Member Variable Name wpisz nazwę zmiennej: m_strFirst, a później kliknij OK.
8. W polu Maximum Characters, znajdującym się u dołu okna dialogowego CIassWizard wpisz liczbę
15. Parametr ten ogranicza długość łańcucha znakowego akceptowanego przez pole edycji.
9. Kliknij OK, by zamknąć CIassWizard.
Przycisk Get Text będzie służył do: pobierania łańcucha znakowego z pola edycji First,
odwracania tego łańcucha, a następnie wyświetlania go w nowej formie z powrotem w polu edycji. Aby
jednak osiągnąć taki efekt, musimy jeszcze dodać funkcję obsługi komunikatu BN_CLICKED dla
przycisku IDC_GET_TEXT. Posłużyć się możemy wielokrotnie już wykorzystywaną procedurą, opisaną w
rozdziale 4.
Nowej funkcji powinniśmy nadać nazwę OnGetText(), a kod uzupełnić w sposób pokazany na
listingu 5.3.
Listing 5.3. LST05_3.CPP - umieszczanie i pobieranie tekstu z pola edycji
1 void CEditsDlg::OnGetText()
2 (
3 // TODO: Tutaj wpisz zawartość funkcji
4 // ** pobranie danych z.pola edycji


112_____________________________________Poznaj Visual C++6
5 UpdateData() ;
6
7 // ** Sprawdzenie, czy został wpisany tekst S if (m_strFirst.IsEmpty() == FALSE) O
9 {
10 // ** Wyświetlenie wprowadzonego tekstu
11 MessageBox (m strFirst) ;
12
13 // ** Odwrócenie kolejności znaków w łańcuchu
14 m_strFirst.MakeReverse(); @
15
16 // ** Przepisanie danych ze zmienne-] do pola edycji
17
18 UpdateData(FALSE);
19 }
20 }
O Sprawdzenie, czy w polu edycji dokonano wpisu.
@ Kolejność znaków zawartych w zmiennej zostaje odwrócona.
Odwrócony tekst zostaje umieszczony w polu edycji.
Wywołanie funkcji UpdateData () w linii 5 następuje z parametrem FALSE, co powoduje przekazanie
treści z pole edycji do zmiennej m_strFirst. W linii 8 funkcja isEmp-ty() klasy CString zwraca FALSE,
jeśli zmienna m_strFirst nie jest pusta. W linii 13 MakeReverse (), funkcja składowa CString, po prostu
odwraca kolejność znaków łańcucha stanowiącego treść tekstu wpisanego w polu edycji. Dalej następuje
ponowne wywołanie funkcji UpdateData (), z argumentem FALSE, co powoduje przekazanie łańcucha
znakowego w formie odwróconej z powrotem do pola edycji.
Ustalanie reakcji na komunikaty powiadamiające, dotyczące pól edycji
Mechanizmy opisane powyżej pozwalają na pobieranie tekstu po jego wprowadzeniu.
Jeśli jednak wykorzystamy funkcje obsługi komunikatów, które wysyłane są za każdym
razem, gdy tekst w polu edycji ulega zmianie, możliwe się staje pobieranie tekstu już w trakcie
jego wprowadzania. System Windows posługuje się ośmioma komunikatami po-
wiadamiającymi, dotyczącymi pól edycji. Są one wymienione w tabeli 5.1. Przykładowo,
komunikat EN_CHANGE zostaje wysłany po każdej zmianie tekstu wewnątrz pola edycji.


Stosowanie kontrolek tekstowych 113 Tabela 5.1. Komunikaty
powiadamiające dotyczące pól edycji
Komunikat Znaczenie
EN_CHANGE Wysyłany, gdy tekst został zmieniony po jego wyświetleniu EN_UPDATE
Wysyłany, gdy tekst został zmieniony przed wyświetleniem EN_SETFOCUS Wysyłany, gdy
pole edycji staje się obiektem bieżącym EN_KI LLFOCUS Wysyłany, gdy pole edycji
przestaje być obiektem bieżącym EN_MAXTEXT Wysyłany, gdy wprowadzony tekst był za
długi i został obcięty
EN_HSCROLL Wysyłany, gdy użytkownik użył paska przewijania poziomego (tylko w
przypadku pól wieloliniowych)
EN_VSCROLL Wysyłany, gdy użytkownik użył paska przewijania pionowego (tylko w
przypadku pól wieloliniowych)
EN_ERRSPACE Wysyłany, gdy nie można było przydzielić pamięci
Dopiszemy teraz funkcję obsługi komunikatu EN_CHANGE dla pola edycji Second. Dzięki temu tekst
będzie pobierany z pola Second, a następnie wypisywany w polu po prawej stronie Second. Będzie to
sprawiało wrażenie wypełniania dwóch okien jednocześnie. Posłużymy się narzędziem CIassWizard dla
utworzenia nowej funkcji obsługi komunikatu.
Funkcje tego rodzaju były dotąd dodawane przy użyciu okna dialogowego New Win-dows
Message and Event Handler. Jak każda szanująca się aplikacja dla Windows, również Developer
Studio, umożliwia osiągnięcie danego wyniku za pomocą różnych metod. CIassWizard może być w tym
wypadku narzędziem wygodniejszym, albowiem nie jest ograniczony do działań z komunikatami i nie
wymaga otwierania szablonu okna dialogowego.
Utworzenie funkcji obsługi komunikatu przy użyciu CIassWizard
1. Naciśnij CtrI+W lub wybierz pozycję CIassWizard z menu View, aby wywołać to narzędzie.
2. Wybierz kartę Message Maps.
3. Z listy Ciass Name wybierz pozycję CEditDIg.
4. Zaznacz identyfikator IDC_EDIT_SECOND, widoczny na liście Control IDs.
5. Wybierz komunikat EN_CHANGE spośród komunikatów wypisanych na liście Messages.
6. Kliknij Add Function.
7. W oknie dialogowym Add Member Function kliknij OK, aby zaakceptować nazwę nowej funkcji
składowej: OnChangeEditSecond. Okno dialogowe CIassWizard powinno wyglądać jak na
rysunku 5.5.


114 Poznaj Visual C++ 6
8. Kliknij Edit Code, aby przejść do edycji treści nowej funkcji.
Dysponujemy zatem szkieletem nowej funkcji OnChangeEditSecondO; musimy teraz dopisać kod z
listingu 5.4. Nowa funkcja będzie wywoływana za każdym razem, gdy użytkownik dokona zmian tekstu
wprowadzonego w polu edycji IDC_EDIT_SECOND, włączając w to kasowanie i wstawianie znaków.
MFC CIaisWiMid
Message
Maps Project

MemberVatiabl
e

Automatio
n Oass
nam

Adivei;
Events j e:

Ctednb



AddClaa.., '



Edits
C:\".\EdJts\E
cBsO Objęci
IDs:

d
la.h.
C:^...\Edite\EditsDlg
.cp

CEdit
sDlg
P
vłessa
aes
EN
ERR

SPA
CE
ROL
L
FOC
US
TEX
T
FOC
US
ATE
' -H -i" ,''-.':1:,1

d
I











Oelete
Function


CEditsDlg
IDC EDIT
FJRS1
IDC EDIT
SWv, IDC
GET TEXT
IDCANCEL
IDOK
'lemberfuncti
ore;

^ S





Edit Code




EN
HSC
EN
KILL
E N
MAX
EN
SET
EMU
PD ;'' i
'
::1:::







V DoOataEmshange



^-




W OnGetTent ONJDCGEUE:XT:Bt. W
OnInBDialog ON.WMJNITDIALOG
W OnPaint ON WM PAINT
3esciiption: Indicales Ihe display is
upddted aftef te

'LCLICKED t
changes

.




:: | OK ] Cancel j

Rysunek 5.5. Wygląd okna dialogowego CIassWizard po dodaniu funkcji obsługi komunikatu
EN CHANGE
Listing 5.4. LST05_4.CPP - przechwytywanie komunikatu EN_CHANGE





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CEditsDlg::OnChangeEditSecond() {
// TODO: Jeśli to jest kontrolka RICHEDIT,
// n-ie wyśle ona tego komunikatu
II dopóki nie zastąpisz funkcji CDialog::OnInitDialog (),
II aby wysłać .komunikat EM_SETEVENTMASK
II do kontrolki z flagą. ENM_CHANGE ORed
II do maski IParam.
II TODO: dodaj tu własny kod obsługi komunikatu
II ** Pobranie wskaźnika do każdego obiektu pól edycji CEdit* pEdit =
(CEdit*)GetDIgItem(IDC_EDIT_SECOND); O CEdit* pEditShow =
(CEdit*)GetDIgItem(IDC_EDIT_SHOW);


Stosowanie kontrolek tekstowych 115
16 // ** Deklaracja zmiennej przechowującej wprowadzony tekst
17 CString strText;
18
19 // ** Pobranie tekstu z pola edycji Second
20 pEdit->GetWindowText(strText);
21
22 // ** Zmiana zawartości pola edycji IDC_EDIT_SHOW
23 pEditShow->SetWindowText(strText);
24 }
O Przydzielenie wskaźnika każdemu polu edycji.
Pobranie zawartości pierwszego pola edycji i zapisanie jej w zmiennej.
Umieszczenie w drugim polu edycji zawartości identycznej z pierwszym polem.
CIassWizard dodaje na początku listingu kilka linii dodatkowego komentarza. Komentarz ten
odnosi się jednak do pól tekstu formatowanego. Ponieważ my nie zastosowaliśmy tego rodzaju pola,
komentarz może zostać zignorowany.
W liniach 13 i 14 funkcja GetDIgitem () jest wywoływana dwukrotnie w celu pobrania wskaźników
osobno dla każdego pola edycji. Jak wszystkie inne klasy dotyczące kontrolek, również CEdit jest klasą
wywodzącą się z cwnd. Klasa CEdit dostarcza dodatkowych funkcji w stosunku do cwnd. Kilka
najbardziej użytecznych, opisujemy w tabeli 5.2.
Wywołana w linii 20 funkcja GetWindowText () pobiera bieżącą zawartość pola edycji Second i
zapisuje ją w zmiennej lokalnej strText. Zmienna ta służy do skopiowania tekstu do pola edycji
IDC_EDIT_SHOW, które pracuje w trybie read-oniy. Dzieje się to w linii 23.
Możemy więc skompilować i uruchomić nasz program. Podczas, gdy umieszczamy tekst w polu
edycji Second, identyczny tekst powinien pojawiać się w polu po jego prawej stronie. Zauważmy, że
jeśli klikniemy pole read-oniy pojawi się w nim kursor, co jednak nie umożliwi nam dokonywania
wpisów. Możemy zmienić ten stan, dodając funkcję obsługi komunikatu powiadamiającego
EN_SETFOCUS dla pola IDC_EDIT_SHOW. Możemy dokonać tego wykorzystując procedurę opisaną w
punkcie "Utworzenie funkcji obsługi komunikatu przy użyciu CIassWizard". W utworzonej w ten
sposób funkcji OnSetFocu-sEditShow () należy umieścić następujący wpis:
GetDIgitem(IDC_EDIT_SHOW)->SetFocus() ;
Po ponownym skompilowaniu i uruchomieniu programu, kuknięcie w polu edycji IDC_EDIT_SHOW
spowoduje ustawienie kursora w polu Second.


116_____________________________________Poznaj Visual C++6
Tabela 5.2. Funkcje składowe klasy CEdit
Nazwa funkcji Opis
Create () Pozwala na tworzenie nowych pól edycji podczas pracy programu
GetSel () Ustala pozycje pierwszego i ostatniego znaku w zaznaczonym tekście
S e t s e l () Ustala zakres selekcji
ReplaceSeK) Usuwa zaznaczony tekst
LimitText () Ustala maksymalną liczbę znaków
PATRZ TAKŻE
O dodawaniu funkcji obsługi mówimy w rozdziale 4.
Więcej informacji na temat wymiany i zatwierdzania danych w kontrolkach podajemy w rozdziale 10.
Więcej informacji o klasie cnnd uzyskasz w rozdziale 4.
Wyprowadzanie podklas dla pól edycji
Bardzo często tekst wprowadzany w polu edycji musi zachować specyficzną formę. Na przykład
kody pocztowe wielu państw składają się tylko i wyłącznie z cyfr, a w niektórych są to kombinacje cyfr i
liter. Aplikacje Windows, które wymagają wprowadzania tekstu w takim formacie, muszą sprawdzać
poprawność tekstu oraz jego zgodność z zasadami określonymi dla danego pola edycji. Najlepszym
momentem dla takiego sprawdzenia i zatwierdzenia jest chwila, w której użytkownik wprowadza dane.
Aby wykorzystać taki mechanizm, należy rozszerzyć funkcjonalność okna dialogowego poprzez
wyprowadzenie z klasy CEdit podklasy. Wyprowadzona podklasa dziedziczy od klasy bazowej jej
zmienne i funkcje. Nowa klasa może wykorzystywać mechanizmy zawarte w klasie bazowej, a także
zamieniać ich funkcjonalność, gdy zajdzie taka potrzeba.
Czym są podklasy?
Podklasy są klasami wyprowadzonymi z klas bazowych, dziedziczącymi elementy składowe, takie jak
funkcje, po klasach bazowych.
W niniejszym punkcie wyprowadzimy podklasę o nazwie Clnitials z klasy CEdit.
Zadaniem nowej klasy będzie wymuszenie specyficznego formatu dla wprowadzanych inicjałów
użytkownika. Przykładowo, znakami akceptowalnymi będą jedynie litery, które zostaną automatycznie
zamienione, jeśli zajdzie potrzeba, na litery wielkie. Klasa Clnitials będzie ponadto powodowała
wprowadzanie odstępu pomiędzy literami, oraz usuwała je, gdy użytkownik naciśnie klawisz Backspace.


Stosowanie kontrolek tekstowych 117
Zacznijmy więc od umieszczenia dodatkowych pól edycji w naszym oknie dialogowym
Edits.
Dodanie nowych pól edycji do okna dialogowego
1. Otwórz w edytorze zasobów okno dialogowe IDDJEDITSJDIALOG.
2. Z paska narzędziowego Controls wybierz symbol statycznego pola tekstowego, a następnie
umieść takie okno w lewym dolnym rogu okna dialogowego, jak widać na rysunku 5.6.
3. W oknie właściwości w polu Caption wprowadź nagłówek Initials.
4. Po prawej stronie okna tekstowego Initials umieść nowe pole edycji.
5. Identyfikator nowego pola edycji umieszczony w polu ID okna właściwości powinien
wyglądać następująco: IDCJEDITJNITIALS.
6. Ponownie wybierz z paska Controls i umieść w oknie dialogowym Edit statyczne pole
tekstowe, po prawej stronie pola IDC_EDIT_INITIALS (rysunek 5.6).
7. Jako nagłówek tego okna wpisz Sumame.
8. Umieść w oknie dialogowym jeszcze jedno pole edycji, z prawej strony okna tekstowego
Sumame.
9. Zwiększ szerokość ostatni umieszczonego pola edycji. Okno dialogowe Edits powinno
wyglądać jak na rysunku 5.6.

Rysunek 5.6. Rozszerzone okno dialogowe Edits
Skoro dodaliśmy już nowe pola edycji, utworzymy klasę cinitials. Warto jeszcze
zauważyć, że narzędzie CIassWizard może zostać użyte do wyprowadzania klas z innych klas
biblioteki MFC, nie tylko CEdit.
Tworzenie nowej podklasy przy użyciu CIassWizard
1. Wywołaj CIassWizard poprzez naciśnięcie Ctri+W lub wybranie pozycji CIassWizard z
menu View.
2. Kliknij kartę Message Maps.


118 Poznaj Visual C++ 6
3. Wybierz pozycję CEditsDlg z listy klas Ciass name.
4. Kliknij przycisk Add Ciass, a następnie z wyświetlonego menu wybierz pozycję New.
Otwarte zostanie okno dialogowe New Ciass, widoczne na rysunku 5.7.





Ciass info(mation Marne:
jCInitials
File name: :lnitiab.cpp
Cancel



Change...
fiase ciass: [[Edit
"3
The base ciass does not require a dialog resomce.
Automation - - - "" - ' ('
None : ^" Autorriation s C Ciealeable by type ID:
l""""""
Rysunek 5.7. Okno dialogowe New Ciass
5. W polu Name wpisz nazwę nowej klasy: CInitials.
6. Wybierz CEdit spośród klas bazowych, Base Ciass.
7. Kliknij OK, co spowoduje utworzenie nowej klasy.
8. Z listy Ciass Name wybierz pozycję CEditDIg.
9. Z listy Object IDs wybierz pozycję IDC_EDIT_INITIALS.
10. Kliknij Add Variable. Otworzysz w ten sposób okno dialogowe Add Member Yariable.
11. Jako nazwę nowej zmiennej składowej w polu Member Variable Name wpisz:
m_edtlnitials.
12. Z listy Category wybierz pozycję Control.
13. Z listy Variable Type wybierz CInitials. Opis umieszczony u dołu okna dialogowego
powinien informować o przypisaniu zmiennej do zdefiniowanej przez użytkownika klasy
CInitials.
14. Kliknij OK, by dodać nową zmienną do klasy. Komunikat, który zostanie wyświetlony,
poinformuje, że koniecznym jest umieszczenie dyrektywy #include w pliku na-
główkowym EditsDIg.h. Kliknij OK.
15. Kliknij OK w oknie dialogowym CIassWizard, aby je zamknąć.


Stosowanie kontrolek tekstowych 119
Nowa klasa cinitials powinna być widoczna w panelu ClassView. Musimy jeszcze
dopisać dyrektywę, o której mówił komunikat CIassWizard. Kliknijmy więc dwukrotnie
pozycję CEditsDlg widoczną w panelu ClassView. W oknie edytora zostanie otwarty plik
nagłówkowy klasy CEditsDlg. Zmodyfikujmy treść tego pliku, umieszczając jedną linię ponad
linią, w której klasa CEditsDlg zostaje zadeklarowana. Wpisana przez nas linia musi mieć
postać:
#include "Initials.h"
ciass CEditsDlg : public CDialog
{
CIassWizard tworząc nową klasę, utworzył wraz z nią dwa nowe pliki i dodał je do
projektu: Initials.h oraz Initials.cpp. Dyrektywa łinclude jest konieczna w pliku EditsDIg.h,
ponieważ klasa CEditsDlg posiada obecnie zmienną składową typu cinitials, która jest
zadeklarowana w pliku Initials.h. Nieumieszczenie tej dyrektywy spowoduje błędy
kompilacji.
Możemy więc wykorzystać już klasę cinitials do wypełnienia określonych zadań
związanych z wprowadzaniem przez użytkownika inicjałów. Pierwszym z tych zadań będzie
odrzucanie wszelkich znaków, nie będących literami, konwertowanie wprowadzonych liter na
wielkie oraz automatyczne wstawianie kropek po każdym wprowadzonym znaku. Osiągniemy
to poprzez dodanie funkcji obsługi komunikatu WM_CHAR. Komunikat taki zostaje wysłany za
każdym razem, gdy użytkownik wprowadzi znak z klawiatury, jeśli pole edycji jest obiektem
bieżącym. Odmiennie od komunikatu EN_CHANGE, funkcja obsługi komunikatu WM_CHAR
pobiera znaki wprowadzane przez użytkownika, zanim zostaną one wyświetlone, dlatego też
jest szczególnie przydatna do zatwierdzania poprawności wprowadzanych znaków. Jeśli
funkcja ustali, że znak jest właściwy, znak zostaje umieszczony w polu edycji. W przeciwnym
wypadku zostaje po prostu zignorowany.
Utworzenie funkcji obsługi komunikatu w podklasie przy użyciu CIassWizard
1. Wywołaj CIassWizard poprzez naciśnięcie Ctri+W lub wybranie pozycji CIassWizard z
menu View.
2. Kliknij kartę Message Maps.
3. Z listy klas Ciass Name wybierz Cinitials.
4. Wybierz WM_CHAR z listy komunikatów Messages.
5. Kliknij Add Function. Na liście funkcji składowych, u dołu okna dialogowego CIass-
Wizard pojawi się pozycja OnChar.
6. Kliknij przycisk Edit Code.
Ustanowiliśmy zatem nową funkcję składową OnChar() wewnątrz klasy cinitials. Funkcja
ta będzie wywoływana za każdym razem, gdy użytkownik będzie wprowadzał do pola edycji
Initials nowy znak. Argument nChar przechowuje wartość wprowadzonego znaku.


120_____________________________________Poznaj Visual C++6
Dodatkowe argumenty nRepCnt oraz nFlags nie są związane z omawianym zagadnieniem, nie musimy
zatem zaprzątać sobie nimi głów. Wpiszmy teraz kod zawarty na listingu 5.5.
Listing 5.5. Zapis funkcji obsługi OnChar
1 void CInitials::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
2 (
3 // TODO: Tutaj wpisz kod funkcji
4 // ** Sprawdzenie, czy wprowadzony znak jest literą
5 if( isalpha(nChar) ) O
6 (
7 // ** Zamiana małych liter na wielkie
8 if( islower(nChar) ) @
9 nChar -= 32;
10
11 // ** Wywołanie domyślnej procedury sprawdzania wartości
12 // ** zmian nChar
13 DefWindowProc(WM_CHAR, nChar,
14 ' MAKELONG(nRepCnt, nFlags));
15
16 // ** Ponowne wywołanie domyślnej procedury
17 // ** aby dodać znak kropki
18 nChar = '.' ;
19 DefWindowProc(WM_CHAR, nChar,
20 MAKELONG(nRepCnt, nFlags));
21 }
22 // ** Jeśli użyto klawisza Backspace
23 // ** następuje dwukrotne wywołanie funkcji OnChar
24 // ** w celu usunięcia kropki oraz kasowanego znaku
25 if( nChar == VK_BACK ) O
26 {
27 CEdit::OnChar(nChar, nRepCnt, nFlags);
28 CEdit::OnChar(nChar, nRepCnt, nFlags);
29 }
30 )
O Sprawdzenie, czy wprowadzony znak jest literą alfabetu.
Konwersja liter małych na wielkie.


Stosowanie kontrolek tekstowych 121
Wywołanie domyślnej procedury dla przeprowadzenia standardowej obróbki tekstu. Wprowadzony
znak zostaje zamieniony na kropkę, a następnie ponownie zostaje wywołana ta sama procedura.
O Po naciśnięciu klawisza Backspace program dokonuje podwójnego kasowania:
kropki oraz wprowadzonego znaku.
Wyrażenie i f umieszczone w linii 5 służy sprawdzeniu, czy znaki przekazane funkcji poprzez
argument nChar są literami. W linii 8 sprawdzane są wielkości liter. Jeśli wpisano litery małe, zostają
one zamienione na wielkie poprzez odjęcie liczby 32 od kodu danej litery w zestawie ANSI.
W linii 13 wywołana zostaje funkcja Defwindowproc () (domyślna procedura okna). Wywołuje się
ją zamiast funkcji składowej klasy bazowej CEdit: : OnChar (), ponieważ ta ostatnia nie odnotowuje
zmian wprowadzanych w argumencie nChar. Funkcja ta posługuje się bowiem wyłącznie oryginalnymi
parametrami komunikatu, ignorując wszelkie inne.
W linii 18 następuje zamiana zawartości nChar na znak kropki, który zostaje wysłany do pola
edycji, przy ponownym wywołaniu funkcji Defwindowproc ().
W linii 25 umieszczona jest procedura sprawdzająca, czy użytkownik naciskał klawisz Backspace.
VK_BACK jest symboliczną nazwą, która definiuje wirtualny kod tego klawisza. Definicje kodów
wirtualnych istnieją dla wszystkich klawiszy. Tabela 5.3 wymienia kilka przykładów tych definicji. Jeśli
zatem użytkownik użyje klawisza Backspace, spowoduje tym samym dwukrotne wywołanie funkcji
składowej CEdit: :OnChar() w celu usunięcia kropki oraz znaku po niej następującego.
Skompilujemy i uruchomimy teraz program, by przetestować funkcjonalność klasy
CInitials.
Tabela 5.3. Wirtualne kody klawiszy Definicja
Opis klawisza
VK_BACK Klawisz Backspace
VK_TAB Klawisz tabulacji
VK_LEFT Strzałka w lewo
VK_RI GHT Strzałka w prawo
VK_RETURN Klawisz Enter
VK_ESCAPE Klawisz Esc
VK CONTROL Klawisz Ctrl


122_____________________________________Poznaj Visual C++6
Stosowanie wieloliniowych pól edycji
Pola edycji nie muszą być ograniczone tylko do jednej linii. W celu zastosowania
wieloliniowego pola, wszystko co musimy uczynić, polega na zwiększeniu wysokości pola
edycji, umieszczonego na szablonie okna dialogowego oraz zaznaczeniu stylu Multiiine.
Konieczne będzie również narzucenie stylu Want Retum, co spowoduje śledzenie przy-
padków użycia klawisza Enter. To z kolei wywoływać będzie przeniesienie kursora do nowej
linii.
Wieloliniowe pola edycji obsługują pionowe paski przewijania, które mogą uaktywniać
się automatycznie, gdy objętość wprowadzonego tekstu przekroczy pojemność pola edycji.
Dzięki ogólnym zasadom wykorzystywania wieloliniowych pól edycji, używa się ich
podobnie jak pól jednoliniowych. Możemy w nich wykorzystać klasę CEdit, która posiada
kilka funkcji składowych, specyficznych dla pól wieloliniowych, wymienionych w tabeli 5.4.
Ograniczenia pojemności wieloliniowych pól edycji
Wieloliniowe pola edycji, tak jak i jednoliniowe, mają ograniczoną pojemność. Dla pól
wieloliniowych wynosi ona maksymalnie 64 kB, co zapewnia możliwość wpisania do około
64 000 znaków.
Tabela 5.4. Funkcje składowe klasy CEdit dla wieloliniowych pól edycji Nazwa
funkcji Opis
GetLineCount() Sprawdza liczbę linii tekstu
GetLine() Pobiera linię tekstu
FmtLines() Włącza i wyłącza zawijanie tekstu
SetTabStops() Umożliwia wyznaczenie punktów tabulacji
Ostatnim typem pól edycji są pola tekstu formatowanego. Pola te są o wiele bardziej
rozbudowane niż proste pola edycji, przez co umożliwiają formatowanie zarówno znaków, jak
i akapitów. Tego typu pola rzadko są stosowane w oknach dialogowych, częściej w widoku
ogólnym aplikacji. Z tego też powodu nie zostały opisane na tym etapie.
PATRZ TAKŻE
Szczegóły dotyczące pól tekstu formatowanego znajdują się w rozdziale 19.


Wyszukiwarka

Podobne podstrony:
05 Stosowanie surowców skórzanych i skór wyprawionych
09 Stosowanie kontrolek actiwe x
05 Stosowanie technik graficznych i multimedialnych
K 05 Ksiazka kontroli wzor dokumentu
Stosowanie technik kierowania ciągnikiem rolniczym i wykonywanie czynności kontrolno obsługowych
(05) Komunikat Komisji Skuteczna Europa Stosowanie prawa wspólnotowego
05 Kontrola nośności gruntow i kruszywidW26
HTML & PHP Kontrolki formularzy 05 2005
05 replikacja danych między kontrolerami domenyidY74
Kontrola tworzenia i stosowania prawa podatkowego pod rządami Konstytucji RP
Rozdział 05 Kontroler DMA
Wykład 05 Opadanie i fluidyzacja
Prezentacja MG 05 2012

więcej podobnych podstron