
Kurs Visual C++
Lekcja 6 - Kurs Visual C++ by SLASH
Dziś dokończymy nasz mały programik matematyczny. Ja na razie mamy szkielet programu, tzn. wygląd, zmienne obiektów oraz domyślą opcję (Dodawanie). Otwórzmy więc nasz projekt. Pamiętacie jak to się robiło ? Plik z rozszerzeniem dsp - klikamy prawym klawiszem myszki na niego i Open with MsDev. I już aplikacja załadowana - teraz w obszarze roboczym przechodzimy do folderu Dialog i otwieramy naszą formę. Jest ! Cała i zdrowa :). Ale teraz musimy ją nauczyć działań matematycznych - czy już wiecie do jakiego obiektu dodamy zdarzenie ? Powinniście ! To oczywiście nasz przycisk Licz ! Klikamy więc dwukrotnie na niego, Add and Edit i OK. I już jesteśmy w kodzie ! Teraz pod komentarzem piszemy:
void CMpaDlg::OnLicz() { // TODO: Add your control notification handler code here
////////////////////////////////////////////////////////// /////////////////// NOWY KOD /////////////// /////////////////////////////////////////////////////////
UpdateData(TRUE); //Odświeżenie danych z obiektów float fwynik; // Zainicjowanie zmiennej która będzie przechwytywała wynik CString lancuch; // To jest to co będzie wyświetlone w polu static
if (m_funkcja == 0) // Jeśli wybraliśmy opcję 0 (dodawanie) to... { fwynik = m_liczba1 + m_liczba2; // dodaj liczby z pól edit } if (m_funkcja == 1) // Jeśli wybraliśmy opcję 1 (odejmowanie) to... { fwynik = m_liczba1 - m_liczba2; //odejmij liczby z pól edit itd... } if (m_funkcja == 2) { fwynik = m_liczba1 * m_liczba2; } if (m_funkcja == 3) //Jeśli wybraliśmy dzielenie { if (m_liczba2 == 0) //Sprawdzenie czy dzielnikiem nie jest liczba 0 { MessageBox("Nie można podzielić przez 0 !","Błąd",MB_ICONEXCLAMATION); //Jeśli tak to błąd goto koniec; // Przeskocz do linii oznaczonej "koniec" } fwynik = m_liczba1 / m_liczba2; //Jeśli dobrnęliśmy tutaj to wylicz }
lancuch.Format("Wynik: %.2f", fwynik); //Sformatuj dane (opis działania funkcji poniżej kodu) m_wynik = lancuch //Zapisz sformatowany wynik do zmiennej obiektu static UpdateData(FALSE); //Odśwież dane koniec: // Tutaj linia konie // Linia pusta (dlaczego tak - opis na dole)
/////////////////////////////////////////////////////////// ///// KONIEC NOWEGO KODU////// ////////////////////////////////////////////////////////// }
Skompiluj sobie program i sprawdź jak działa - zauważysz pewnie, że wynik zawsze jest zwracany z tą samą liczbą miejsc po przecinku - nawet jeśli dasz 3 + 5 to funkcja zwróci 8.00 . Dziś jeszcze się nie dowiesz jak to skrócić - musiałbyś znać funkcje obróbki łańcuchów - a o tym dopiero w następnych lekcjach.
Teraz wyjaśniam kilka rzeczy - po pierwsze funkcja goto - służy ona do przeskoczenia przez pewien ciąg funkcji - w naszym przypadku po wyświetleniu komunikatu przeskoczyliśmy na sam koniec programu - bo skoro jest błąd to po co liczyć. Jej składnia jest prosta - goto linia - a linię możemy zadeklarować tak: linia: Teraz wyjaśniam dlaczego w ostatniej linii użyłem średnika - tak naprawdę funkcja Linia: wskazuje dopiero na następną - gdybyśmy nie dopisali ; to wskazywało by to na } co już jest zakończeniem programu i nie można tego zaliczyć jako linia - musieliśmy stworzyć pustą linię - czyli sam ;
Teraz dłużej zatrzymiemy się przy funkcji Format. Dlaczego w ogóle ją użyłem ? Otóż C++ nie pozwoli nam łączyć czy wyświetlać w stringach liczb typu int czy float. Tak np.
int x = 4; CString wynik; wynik = x;
Takie działanie jest niedopuszczalne, tak samo nie możemy połączyć dwóch różnych typów np.
int x = 4; CString str = "Slash"; CString wynik; wynik = x + str;
Możliwe to było np. w Visual Basicu - tu jednak musimy przestrzegać zmiennych. Ale taki wynik można sformatować i nasz drugi przypadek powinien wyglądać tak:
int x = 4; CString str = "Slash"; CString wynik; wynik.Format("%d %s",x,str);
Teraz wyjaśnię budowę tej funkcji - najpierw jednak wyjaśnię co oznaczają kolejne procenty:
Skrót | Typ zmiennej | Opis | %c | char | Wyświetla pojedynczy znak tekstowy | %d | int | Wyświetla wartość całkowitą typu dziesiętnego ze znakiem | %u | int | Wyświetla wartość całkowitą typu dziesiętnego bez znaku | %o | int | Wyświetla wartość całkowitą typu ósemkowego bez znaku | %x | int | Wyświetla wartość całkowitą typu ósemkowego bez znaku małymi literami | %X | int | Wyświetla wartość całkowitą typu ósemkowego bez znaku wielkimi literami | %f | float | Wyświetla liczbę zmiennoprzecinkową | %s | CString | Wyświetla łańcuch tekstowy „string” | %% | - | Wyświetla znak % |
Dodatkowo dla %f możemy ustalić ile liczba ma być wyświetlanych po przecinku - tak np. zapis %.4f spowoduje takie sformatowanie liczby że zwróci jedynie 4 miejsca po przecinku - podobną rzecz użyliśmy w naszym programie. Teraz pokażę bardziej rozbudowane użycie funkcji Format:
CString imie = "Maciek"; int wiek = 12; int klasa = 7; char typklasy = 'c'; int szanse = 40;
CString wynik; wynik.Format("%s ma %d lat, chodzi do klasy %d%c i ma zaledwie %d szans na przejście" ,imie, wiek, klasa, typklasy, szanse); MessageBox(wynik);
Oczywiście funkcja Format zawiera się w 1 linijce - tylko możliwe, że pracujesz na niższej rozdzielczości jak ja i linia została podzielona !
Pewnie będzie Ci to ciężko zrozumieć - ale jakoś musisz ! Pamiętaj o kolejności zmiennych - czyli 3 % jest przydzielony 3 zmiennej którą wypisałeś w funkcji Format za cudzysłowem ! Możesz sobie to zapamiętać tak - %(typ) reprezentuje to co jest za cudzysłowem tylko w kolejności.
Mam nadzieję, że pojąłeś - jeśli nie to próbuj dalej - zrób sobie jakiś inny przykład - ta funkcja jest bardzo często wykorzystywana w programach - po prostu musisz ją umieć !
To tyle na dzisiaj - poćwicz sobie jeszcze tę funkcję i do następnej lekcji...
Lekcja 7 - Kurs Visual C++ by SLASH
Witam na 7 lekcji Visual C++. Dziś powiemy sobie o Polach wyboru (CheckBox), także o Liście typu Combo, o wyłączaniu obiektów kontrolnych oraz o uruchamianiu innych aplikacji
Aby zobaczyć gdzie te kontrolki znajdują się na pasku musisz zerknąć na lekcję 1 do ściągi z paska. Teraz napiszemy mały program uruchamiający pewne aplikacje. Tak więc tworzymy nowy projekt MFC oparty na oknie dialogowym - nazywamy aplikację Uruchom i przechodzimy do widoku formy. Usuwamy (jak zwykle) wszelkie elementy znajdujące się na niej i układamy check box-a oraz listę typu Combo - dla CheckBoxa ustawiamy ID na IDC_UDOSTEPNIJ i Caption na Udostępnij. Teraz musimy zmienić właściwości Combo-boxa, ale zanim to zrobimy ustalmy długość rozwijalnej listy. My w C++ mamy taki komfort. A więc klikamy w naszym projekcie na ComboBox-a, ale na taką strzałeczkę po prawej - zobaczysz, że zaznaczył się dolny kwadracik - teraz wystarczy, że go przeciągniesz odpowiednio na dół i już masz ustaloną rozpiętość Combola. Zmieńmy teraz identyfikator tego pola na IDC_APP (zakładka general). Teraz powiem Wam jeszcze jak zrobić jedną rzecz - zauważ, że twojej aplikacji nie da się ani zminimalizować, ani zmaksymalizować. Aby była taka możliwość kliknij prawym klawiszem myszy na formie i wybierz Properties i już w pierwszej zakładce widzimy CheckBox-y Minimize box oraz Maximize box - programiku jednak na razie nie da się powiększyć czy pomniejszyć (jedynie zmaksymalizować) - aby była taka możliwość należy w tej samej zakładce odnaleźć Combo-box-a Border i zmienić jego wartość na Resizing. Teraz już możemy zamknąć okienko. Jak już widzisz twoja aplikacja posiada w.w opcje - u mnie to wygląda tak:

Aha - zapomnieliśmy jeszcze przycisku do potwierdzenia wybory - dodaj go więc - Nadaj mu Identyfikator IDC_URUCHOM i caption: Uruchom.
Jak to zawsze bywa po dodaniu obiektów musimy przypisać im zmienne - w tym celu uruchamiamy ClassWizard - wybieramy zakładkę Member Variables - dodajemy zmienną do IDC_APP o nazwie m_aplikacja, kategorii Value i typie zmiennej CString. Podobnie robimy z IDC_UDOSTEPNIJ - dodajemy zmienną o nazwie m_udostepnij, kategorii Value i typie BOOL (Typ BOOL może przyjąć tylko dwie wartości - TRUE lub FALSE). Skoro mamy już utworzone zmienne to w ClassWizard klikamy na OK - teraz zajmiemy się kodem źródłowym.
Teraz musimy jakoś sprawić aby działał CheckBox - klikamy więc na niego dwukrotnie - teraz tworzymy zdarzenie dla kliknięcia (czyli zmiany wartości) - Add and Edit i dodajemy taki oto kod źródłowy
void CUruchomDlg::OnUdostepnij() { // TODO: Add your control notification handler code here
///// NOWY KOD ////////
UpdateData(TRUE); if (m_udostepnij == TRUE) { GetDlgItem(IDC_APP)->EnableWindow(TRUE); } else { GetDlgItem(IDC_APP)->EnableWindow(FALSE); }
////////// KONIEC NOWEGO KODU //////////////
}
Wszystko tutaj powinno być jasne dla Ciebie prócz funkcji GetDlgItem. Jest to tak naprawdę złożenie dwóch funkcji, a właściwie uproszczenie - funkcja GetDlgItem pobiera wskaźnik do okna (obiektu), a następnie za pomocą tego wskaźnika możemy wykonywać róźne operacje na tych oknach - w tym przykładzie włączamy lub wyłączamy obiekt.
Skompiluj swój program - kliknij udostępnij i działa - odznacz - nie działa. Ale jest tu pewien błąd - uruchom aplikację jeszcze raz i spójrz na CheckBox-a - jest wyłączony, a jednak nasz Combo jest dostępny. Dzieje się to dlatego, że póki nie klikniemy na Check-u to program nic w tej sprawie nie zrobi. Można to zrobić na kilka sposobów - ja przedstawię dwa. W obydwu sposobach będziemy musieli skorzystać z OnInitDialog - pamiętasz jeszcze jak się tam dochodziło i gdzie się wpisywało dodatkowy kod ? Jeśli nie to wróć się do poprzedniej lekcji ! Pierwszy sposób - najczęściej używany - dopisać coś takiego, aby checkBox był od razu włączony - chyba nic prostszego:
m_udostepnij = TRUE; UpdateData(FALSE);
No dobrze, a jeśli chcemy aby nasz CheckBox był wyłączony ? Możemy dodać coś takiego:
GetDlgItem(IDC_APP) -> EnableWindow(FALSE);
Przy okazji może zauważyłeś, ż po zastosowaniu zmian przez wskaźnik nie wywołujemy już UpdateData(FALSE); - w takich przypadkach jest to niepotrzebne. Dobra, ale my posłużymy się najkrótszym zapisem, a i przy okazji nauczymy się łączyć funkcje. Może pamiętasz jak na pierwszej (a może drugiej) lekcji pokazywałem jak najprościej wyłączyć program - była to funkcja OnOK( ); - tak naprawdę ta linijka wywoływał funkcję, którą stworzył nam kreator MFC . Nam teraz wystarczy przy ładowaniu się formy połączyć z funkcją sprawdzenia ChechBox-a i już wszystko załatwione - wystarczy wywołać coś takiego:
SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
////// NOWY KOD ///// OnUdostepnij( ); ///// KONIEC NOWY KOD ///// return TRUE; // return TRUE unless you set the focus to a control }
[...]
void CUruchomDlg::OnUdostepnij( ) { // TODO: Add your control notification handler code here UpdateData(TRUE); if (m_udostepnij == TRUE) { GetDlgItem(IDC_APP)->EnableWindow(TRUE);
Na czerwono zaznaczyłem to połączenie - myślę, że zrozumiałeś - jeśli nie to mail'me :) Uruchom teraz program i zobaczysz, że obiekt jest już wyłączony.
Teraz zajmiemy się ComboBox-em - jak na razie jest pusty - nie ma w nim żadnych elementów, ale aby je dodać wcale nie musimy posługiwać się kodem - kliknij prawym klawiszem myszki na ComboBox-ie i wybierz Properties - przejdź do zakładki Data i wpisz Notatnik. Aby przejść do następnego wiersza należy naciśnąć Ctrl + Enter i dopisujemy kolejno:
Paint Microsoft Word
Możemy już zamknąć okienko i do przycisku dodajemy kod:
void CUruchomDlg::OnButton1() {
//////// NOWY KOD ŹRÓDŁOWY ///////
UpdateData(TRUE); if (m_aplikacja == "Notatnik") { WinExec("notepad.exe",SW_SHOW); } if (m_aplikacja == "Paint") { WinExec("pbrush.exe",SW_SHOW); } if (m_aplikacja == "Microsoft Word") { WinExec("C:\\Program files\\Microsoft Office\\Office \\winword.exe",SW_SHOW); }
//// KONIEC KODU /////
}
Jedyne co tu powinno być dla ciebie niejasne to funkcja WinExec - uruchamia ona wskazaną aplikację. Pewnie dziwi Cię fakt, że w pierwszych 2 przypadkach nie wkazaliśmy ścieżki tylko sam plik exe. Otóż to jest tak, że domyślnym katalogiem, jest katalog Windows - i wszystkie pliki (EXE) znajdujące się w tym katalogu możemy uruchomić bez podawania katalogu. Inna sprawa jest z programami leżącymi gdzie indziej - tam musimy już podać pełną ścieżkę. Należy pamiętać przy tym, że w C++ zamiast jednego znaku backslash stosujemy dwa !!! Ale jednak nie powinniśmy uruchamiać tak programów ! Dlaczego - najlepiej jest to sprawdzić na grze Fifa 2000, na pliku autorun.exe. Po próbie uruchomienia jej z naszego programiku wyskoczy błąd. Przyczyna jest prosta - zobacz:
Naszym domyślnym katalogiem jest c:\windows. Odpalamy teraz programik autorun.exe z płytki - a w pliku jest taki odnośnik: \Config - rzecz jasna ten katalog znajduje się na płycie, ale skoro naszym domyślnym katalogiem jest C:\Windows to programik szuka katalogu Config pod Windows ! Oczywiście jest to nieprawidłowe - jedynym sposobem jest zmiana domyślnego katalogu - ale o tym na następnej lekcji.
Oj - dziś się nauczyłeś dość sporo - na następnej lekcji praktycznie powtórka - powiemy sobie jeszcze o radio buttonach i właśnie o zmianie domyślnego katalogu.
Do zobaczenia !
Pamiętaj ! Jeśli masz jakikolwiek problem ze zrozumieniem tego kursu to napisz do mnie - na każdego maila odpisuję chętnie. Także wszelkie opinie, zażalenia itp. kieruj na mój adres - chcę wiedzieć czy ten kurs Wam się podoba czy też nie Adres - slash@ptik.prv.pl
Slash
e-mail: slash@ptik.ivg.pl

Copyright (c) 1999 - 2000 NoName |
|