Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
DOS Designer 1.0 - design.h

design.h

Caricato da: Inconcepibile
Scarica il programma completo

  1. #ifndef DESIGN_H
  2. #define DESIGN_H
  3.  
  4. #include <iostream>
  5. #include <conio.h>
  6. #include <fstream>
  7. #include <windows.h>
  8. using namespace std;
  9.  
  10. // costanti con le dimensioni della classica schermata DOS
  11. const int nROW = 24,    // numero di righe
  12.           nCOLUMN = 79; // numero di colonne
  13.  
  14. // costanti coi valori dei tasti che l'utente può premere
  15. const char UP = 119,    // W = sù
  16.            DOWN = 115,  // S = giù
  17.            LEFT = 97,   // A = sinistra
  18.            RIGHT = 100, // D = destra
  19.            EXIT = 27,   // Esc = esci
  20.            DRAW = 49,   // 1 = attiva/disattiva matita
  21.            CANCEL = 50, // 2 = attiva/disattiva gomma
  22.            SAVE = 48,   // 0 = salva disegno
  23.            CLEAR = 32;  // Space = cancela disegno
  24.  
  25. /* procedura per spostare il cursore sullo schermo, il primo valore lo sposta
  26. orizzontalmente, il secondo verticalmente */
  27. void gotoxy(int y, int x)
  28. {
  29.     COORD coor;
  30.     HANDLE hOutput;
  31.     hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
  32.     coor.X = x;
  33.     coor.Y = y;
  34.     SetConsoleCursorPosition(hOutput,coor);
  35. }
  36.  
  37. // classe per la gestione dei disegni
  38. class design
  39. {
  40.       // matrice in cui viene salvato l'intero disegno
  41.       bool screen_view[nROW][nCOLUMN];
  42.       public:
  43.              void clear();
  44.              design() { clear(); }
  45.              void draw();
  46.              void save();
  47.              void load(string);
  48.              };
  49.  
  50. // procedura per pulire la matrice
  51. void design::clear()
  52. {
  53.      int i, j;
  54.      for (i=0; i<nROW; i++) {
  55.          for (j=0; j<nCOLUMN; j++) screen_view[i][j] = false;
  56.          }
  57. }
  58.  
  59. // procedura per disegnare
  60. void design::draw()
  61. {
  62.      
  63.      int mx,        // movimento in orizzontale
  64.          my,        // movimento in verticale
  65.          x = 12,    // posizione del cursore in orizzontale
  66.          y = 40;    // posizione del cursore in verticale
  67.      
  68.      // gli interruttori per disegnare e cancellare
  69.      bool draw_switch = false,
  70.           cancel_switch = false;
  71.          
  72.      char move;
  73.      
  74.      for (;;) {
  75.          // l'utente preme un tasto finchè non ne preme uno di quelli precedentemente indicati
  76.          do {
  77.              move = getch();
  78.              } while(move!=UP && move!=DOWN && move!=LEFT && move!=RIGHT && move!=EXIT && move!=DRAW && move!=CANCEL && move!=CLEAR && move!=SAVE);
  79.      
  80.      // in base al tasto premuto viene eseguita un'istruzione diversa
  81.      switch (move) {
  82.             case UP: mx=-1; my=0; break;
  83.             case DOWN: mx=1; my=0; break;
  84.             case LEFT: mx=0; my=-1; break;
  85.             case RIGHT: mx=0; my=1; break;
  86.             case DRAW:
  87.                  mx=0; my=0;
  88.                  if(draw_switch) draw_switch = false;
  89.                  else draw_switch = true;
  90.                  cancel_switch = false;
  91.                  break;
  92.             case CANCEL:
  93.                  mx=0; my=0;
  94.                  if(cancel_switch) cancel_switch = false;
  95.                  else cancel_switch = true;
  96.                  draw_switch = false;
  97.                  break;
  98.             case CLEAR:
  99.                  mx=0; my=0;
  100.                  system("cls");
  101.                  clear();
  102.                  break;
  103.             case SAVE:
  104.                  mx=0; my=0;
  105.                  save();
  106.                  break;
  107.             }
  108.      
  109.      if(move == EXIT) break;
  110.      
  111.      // aggiorna le coordinate del cursore coi rispettivi controlli che il cursore
  112.      // non finisca fuori dalla finestra
  113.      x += mx;
  114.      if(x == nROW) x--;
  115.      if(x == -1) x++;
  116.      
  117.      y += my;
  118.      if(y == nCOLUMN) y--;
  119.      if(y == -1) y++;
  120.      gotoxy(x, y);
  121.      
  122.      // in base all'interruttore attivo esegue uno dei seguenti effetti
  123.      if (draw_switch) {
  124.         cout <<'#';
  125.         screen_view[x][y] = true;
  126.         }
  127.        
  128.      if (cancel_switch) {
  129.         cout <<' ';
  130.         screen_view[x][y] = false;
  131.         }
  132.      }
  133.      // pulisce la matrice alla fine dell'esecuzione
  134.      clear();
  135. }
  136.  
  137. // precedura per salvare il disegno
  138. void design::save()
  139. {
  140.      string file_name;
  141.      char ok;
  142.      
  143.      system("cls");
  144.      // chiede il nome dell'immagine da salvare
  145.      cout <<"\n\n\nInserire nome dell'immagine da salvare: ";
  146.      cin >> file_name;
  147.      
  148.      // aggiunge al nome immesso l'estensione
  149.      file_name += ".dat";
  150.      // dichiaro la variabile di stream
  151.      ofstream fout;
  152.      // crea ed apre il file con il nome che si è appena inserito specificando
  153.      // che sarà un flusso di output dal programma al file (ios::out) e che
  154.      // il file sarà di tipo binario (ios__binary)
  155.      fout.open(file_name.c_str(), ios::out | ios::binary);
  156.      // scrivo sul file la matrice sotto forma di classe
  157.      fout.write((char*)this, sizeof(*this));
  158.      // chiudo il file
  159.      fout.close();
  160.      
  161.      // chiedo se si vuole continuare il disegno o no
  162.      cout <<"\n\nVuole tornare al disegno (s=si', n=no): ";
  163.      do { ok = getch(); } while(ok!=115 && ok!=110);
  164.      if(ok == 115) load("file_name");
  165.      else exit(0);
  166. }
  167.  
  168. void design::load(string file_name)
  169. {
  170.      int i, j;
  171.      
  172.      system("cls");
  173.      // dichiaro la variabile di stream
  174.      ifstream fin;
  175.      // crea ed apre il file con il nome che si è appena inserito specificando
  176.      // che sarà un flusso di input dal file al programma (ios::in) e che
  177.      // il file sarà di tipo binario (ios__binary)
  178.      fin.open(file_name.c_str(), ios::in | ios::binary);
  179.      // legge le informazioni contenute nel file sotto forma di classe design
  180.      fin.read((char*)this, sizeof(*this));
  181.      // stampo a video le informazioni appena ricevute
  182.      for (i=0; i<nROW; i++) {
  183.          for (j=0; j<nCOLUMN; j++) {
  184.              if(screen_view[i][j]) cout <<'#';
  185.              else cout <<' ';
  186.              }
  187.          cout << endl;
  188.          }
  189.      // chiudo il file
  190.      fin.close();
  191.      // parte la procedura per disegnare avendo come base il disegno appena aperto
  192.      draw();
  193. }
  194.  
  195. #endif