Marys Temat założony przez niniejszego użytkownika |
Odświeżanie jednego elementu i własne funkcje » 2011-01-07 03:08:24 Witam ponownie, mam programik, który przesuwa, powiększa itd. litery wyrysowane przez mnie, poniżej mam legendę do tego i teraz jak manipuluje tym wszystkim to wszystko mi się odświeża tzn robi clear screen, a jak wyrzucić z clear screena z legendy. Aplikacja uruchamia się w konsoli i pracuję na C++ Builder.
Drugie pytanie to jak tworzyć własne funkcje po za programem głównym, w osobnym pliku? Np. mam pętle w wyżej wymienionym programie i wystarczy, że napisze w osobnym pliku funkcje i ja nazwę, a później dołączę odpowiedni nagłówek i wstawię funkcje z odpowiednimi parametrami, mogę jakiś przykład. |
|
DejaVu |
» 2011-01-07 03:58:38 |
|
Marys Temat założony przez niniejszego użytkownika |
» 2011-01-08 05:13:27 Już prostuje moją wypowiedź :P Na początek może obrazek, będzie łatwiej wytłumaczyć -> http://img835.imageshack.us/i/beztytuugs.png http://img835.imageshack.us/img835/1323/beztytuugs.png Chodzi o to aby clearscreen działał tylko na to co jest zaznaczone na niebiesko, a co jest zaznaczone na czerwono "nie używało" clearscreena. Co do tych funkcji, to zanim dostałem ten ciekawy link spróbowałem czegoś takiego i moje pytanie czy to tak może być? Oto kod głównego programu #include <iostream.h> #include <conio.h> #include "funkcje.cpp" const int RANGE_BEGIN = 5; const int RANGE_END = 17;
void tresc(); void czyt( int & dl ); void zadanie( int dl );
int main() { int dl; tresc(); clrscr(); czyt( dl ); clrscr(); zadanie( dl ); return 0; }
void tresc() { do { cout << "ZADANIE PROJEKOTWE\n" << "---------------------------------------------------------" << "-----------------------\n\n"; cout << "Program wyswietla pierwsze litery imienia i nazwsika (Marcin " << "Michalik) oraz \nostatnia cyfre indeksu (8132)." << " Tekst mozna powiekszac i pomniejszac za pomoca\n" << "klawiszy + i - oraz przesuwac za pomoca strzalek. " << "Przed uruchomieniam nalezy\npodac rozmiar wyswietlanego" << " tekstu. Podany rozmiar musi byc liczba calkowita," << "\nnieparzysta o wartosci minimalnej 5.\n\n\n\n\n\n"; cout << "Autor: Marcin Michalik\n" << "Nr grupy: GID101 (grupa I)\n" << "Data: 3.01.2011\n"; cout << "\n\tPrzejdz dalej -> Enter\n"; } while( getch() != 13 ); }
void czyt( int & dl ) { int er, x, y; cout << "Prosze podac rozmiar wyswietlanego tekstu (prosze wczytac " << "cyfre calkowita,\nz przedzialu <5, 17>): "; x = wherex(); y = wherey(); do { gotoxy( x, y ); clreol(); er = 0; cin >> dl; if( cin.fail() ) { er = 1; cin.clear(); cin.ignore( 0xff,( int ) '\n' ); } } while(( dl < RANGE_BEGIN ) ||( dl > RANGE_END ) || er ); }
void zadanie( int dl ) { int x, x1, x2 = 1, y, y1, y2 = 27, z, a, szer, g, f; char klawisz; szer = dl - 1; z = szer - 1; a =( z - 1 ) / 2; y =( 25 - dl ) / 2; x =( 80 - 2 *( z + z - 1 ) - dl - 4 ) / 2; do { _setcursortype( _NORMALCURSOR ); clrscr(); x1 = x; y1 = y; gotoxy( x1, y1 ); mpion( dl, y1, x1, x, z ); y1 = y; x1 = x; gotoxy( x1, y1 ); mskos( y1, x1, z ); x1 = x + 2 *( z - 1 ) + 3; y1 = y; gotoxy( x1, y1 ); m2pion( y1, x1, dl, x, z ); y1 = y; x1 = x + 2 *( z - 1 ) + 3; gotoxy( x1, y1 ); m2skos( y1, x1, z ); x1 = x + 4 *( z - 1 ) + 5; y1 = y + 1; gotoxy( x1, y1 ); dwapoziom( y1, x1, y, dl ); x1 = x + 4 *( z - 1 ) + 4 + dl; y1 = y + 2; gotoxy( x1, y1 ); dwaprawo( x1, y1, dl ); x1 = x + 4 *( z - 1 ) + 6; y1 = y + dl -(( dl + dl % 2 ) / 2 - 2 ); gotoxy( x1, y1 ); dwalewo( x1, y1, dl ); x1 = x2; y1 = y2; gotoxy( x1, y1 ); legenda( x1, y1, y2, g, f ); _setcursortype( _NOCURSOR ); klawisz = getch(); sterowanie( x, y, dl, szer, z, a, klawisz ); } while( klawisz != 27 ); }
A to kod funkcji: #include <iostream.h> #include <conio.h> #include <math.h> void mpion( int dl, int y1, int x1, int x, int z ) { for( int i = 1; i <= dl; i++ ) { y1++; gotoxy( x1, y1 ); cout << 'M'; x1 = x + 2 *( z - 1 ); gotoxy( x1, y1 ); cout << 'M'; x1 = x; } } void mskos( int y1, int x1, int z ) { for( int i = 1; i <= z; i++ ) { y1++; gotoxy( x1, y1 ); cout << 'M'; x1++; } for( int i = 1; i <= z - 1; i++ ) { y1--; gotoxy( x1, y1 ); cout << 'M'; x1++; } } void m2pion( int y1, int x1, int dl, int x, int z ) { for( int i = 1; i <= dl; i++ ) { y1++; x1 = x + 2 *( z - 1 ) + 3; gotoxy( x1, y1 ); cout << 'M'; x1 = x + 4 *( z - 1 ) + 3; gotoxy( x1, y1 ); cout << 'M'; x1 = x; } } void m2skos( int y1, int x1, int z ) { for( int i = 1; i <= z; i++ ) { y1++; gotoxy( x1, y1 ); cout << 'M'; x1++; } for( int i = 1; i <= z - 1; i++ ) { y1--; gotoxy( x1, y1 ); cout << 'M'; x1++; } } void dwapoziom( int y1, int x1, int y, int dl ) { for( int i = 1; i < dl; i++ ) { x1++; gotoxy( x1, y1 ); cout << '2'; y1 = y +(( dl - dl % 2 ) / 2 - 1 ) + 2; gotoxy( x1, y1 ); cout << '2'; y1 = y + dl; gotoxy( x1, y1 ); cout << '2'; y1 = y + 1; } } void dwaprawo( int x1, int y1, int dl ) { for( int i = 0; i <( dl - dl % 2 ) / 2 - 1; i++ ) { cout << '2'; y1++; gotoxy( x1, y1 ); } } void dwalewo( int x1, int y1, int dl ) { for( int i = 0; i <( dl + dl % 2 ) / 2 - 2; i++ ) { cout << '2'; y1++; gotoxy( x1, y1 ); } } void legenda( int x1, int y1, int y2, int g, int f ) { string T[ 10 ]; for( int i = 0; i < 80; i++ ) cout << '-'; x1 =( 80 - 8 ) / 2; y1 = y2 + 1; gotoxy( x1, y1 ); cout << "LEGENDA:"; T[ 0 ] = "Powiekszanie: +"; T[ 1 ] = "Pomniejszanie: -"; T[ 2 ] = "Przsuniecie w lewo: <-"; T[ 3 ] = "Przesuniecie w prawo: ->"; T[ 4 ] = "Przesuniecie w gore: ^"; T[ 5 ] = "Przesuniecie w dol: *"; T[ 6 ] = "Wyjscie: ESC"; g = 0; f = 1; x1 = 1; y1++; gotoxy( x1, y1 ); for( int i = 0; i <= 6; i++ ) { x1 = 1; y1++; gotoxy( x1, y1 ); cout << T[ g ]; x1 = 40; gotoxy( x1, y1 ); cout << T[ f ]; if( g <= 6 ) g = g + 2; if( f <= 5 ) f = f + 2; } } void sterowanie( int & x, int & y, int & dl, int & szer, int & z, int & a, char & klawisz ) { switch( klawisz ) { case 43: if( dl <= 17 && x <= 80 - 2 *( z + z ) - dl - 3 && y <= 25 && x > 1 && y > 0 ) { dl++; szer++; z++; a++; y--; x--; break; } case 45: if( dl > 5 && szer > 4 ) { dl--; szer--; z--; a--; y++; x = x + 3; break; } case 72: if( y > 0 ) { y--; break; } case 80: if( y < 26 - dl ) { y++; break; } case 75: if( x > 1 ) { x--; break; } case 77: if( x < 80 - 2 *( z + z - 1 ) - dl - 2 ) { x++; break; } } }
Chodzi o to aby ten kod był bardziej czytelny jakoś i pomyślałem, że część funkcji (głównie te funkcje odpowiedzialne za rysowanie liter) wywalić do innego pliku, a plik z funkcją główną będzie je sobie pobierał. |
|
DejaVu |
» 2011-01-08 07:38:33 W zasadzie jeżeli działa to i może tak być. Rozwiązanie nie jest jednak poprawne, bowiem za pomocą #include nie należy dołączać plików źródłowych (*.cpp) tylko pliki nagłówkowe (*.h / *.hpp). Co do czyszczenia ekranu. Skoro nie chcesz czyścić całego ekranu to zamaluj prostokątem obszar, który chcesz 'zmazać'. Nie wiem czy taką funkcję masz dostępną w tym czego używasz ale to jest jakieś rozwiązanie. A jeżeli nie masz takiej funkcji to po prostu rysuj menu czy cokolwiek innego po każdym czyszczeniu ekranu i sprawę będziesz miał załatwioną. |
|
Marys Temat założony przez niniejszego użytkownika |
» 2011-01-08 12:15:23 Nie kumam tego z tym clearscreenem. Babka mi powiedziała, że mam zdefiniować jakby dwa okna i jedno będzie miało clearscreena a drugie nie, ale kompletnie nie wiem o co chodzi i jak to zrobić :/ |
|
malan |
» 2011-01-08 15:13:06 Mam coś, co mogłoby rozwiązać Twój problem aczkolwiek przy próbie kompilacji Twojego kodu wyskakuje trochę błędów. 1. Na jakim IDE pracujesz? Borland? 2. System operacyjny? 3. Ten kod jest kompletny? /edit: #include <windows.h>
HANDLE hConsole = GetStdHandle( STD_OUTPUT_HANDLE );
CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo( hConsole, & info );
COORD newLocation = { 0, 0 };
DWORD writtenChars; FillConsoleOutputCharacterW( hConsole, L' ', info.dwSize.X * info.dwSize.Y, newLocation, & writtenChars );
SetConsoleCursorPosition( hConsole, newLocation ); Zamiast info.dwSize.Y wstaw pozycję (OY), która będzie mówiła, gdzie zakończyć czyszczenie. Czyli, w Twoim przypadku, to będzie miejsce, gdzie zaczynasz rysować linię nad "legendą". Nie testowałem, ale spróbować nie zaszkodzi ;p. |
|
Marys Temat założony przez niniejszego użytkownika |
» 2011-01-09 23:46:02 Tak na Borlandzie. Windows Tak to jest kompletny kod |
|
Marys Temat założony przez niniejszego użytkownika |
» 2011-01-10 02:21:17 A można jakoś podzielić konsole na 2 okna? Znalazłem taki kod, ale Builder nie ma takiej biblioteki. Proszę o szybką pomoc. |
|
« 1 » 2 3 |