Twój ulubiony magazyn on-line

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ótTyp zmiennejOpis
%ccharWyświetla pojedynczy znak tekstowy
%dintWyświetla wartość całkowitą typu dziesiętnego ze znakiem
%uintWyświetla wartość całkowitą typu dziesiętnego bez znaku
%ointWyświetla wartość całkowitą typu ósemkowego bez znaku
%xintWyświetla wartość całkowitą typu ósemkowego bez znaku małymi literami
%XintWyświetla wartość całkowitą typu ósemkowego bez znaku wielkimi literami
%ffloatWyświetla liczbę zmiennoprzecinkową
%sCStringWyś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




Stare Gry Na PC - stare gierki do pobrania

Copyright (c) 1999 - 2000 NoName