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
C/C++ - C gotoxy() textcolor() textbackground()
Forum - C/C++ - C gotoxy() textcolor() textbackground()

Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 14:00
Venerdì, 26/02/2021
Uso i compilatori C/C++ della Microsoft e MinGW, nella rete si trovano molti codici che usano le istruzioni non standard: gotoxy() textcolor() textbackground() clrscr().
Ho letto che tali istruzioni sono implementate nel compilatore C/C++ della Borland e simili.
Con i compilatori che non le supportano, in Windows sono facilmente replicabili, ho scritto un breve codice test che le raggruppa:
Codice sorgente - presumibilmente C/C++

  1. #include <stdio.h>
  2. #include <windows.h>
  3.  
  4. /****************************************************************************
  5.    codice che replica le istruzioni:
  6.    gotxy(); textcolor(); textbackground(); clrscr();
  7.    presenti nella libreria <conio.h> del compilatore Borland C/C++ e simili
  8.  
  9.    Per rendere compatibili i codici che usano tali istruzioni con i compilatori:
  10.    CGwin, MinGW, MSVC e altri, è sufficiente eseguire le seguenti modifiche:
  11.  
  12.    1) aggiungere le variabili globali: fore, back e handle
  13.    2) aggiungere nel main():  handle=GetStdHandle(STD_OUTPUT_HANDLE);
  14.    3) modificare tutti i cprintf() in printf()
  15.    4) aggiungere le quattro void:
  16.                               gotxy(int x, int y)
  17.                               textcolor(int f)
  18.                               textbackground(int b)
  19.                               clrscr()
  20. *****************************************************************************/
  21.  
  22. int fore = 7; // variabile globale colore primo piano
  23. int back = 0; // variabile globale colore secondo piano
  24. HANDLE handle; // variabile globale che contiene l'HANDLE della console
  25.  
  26. void gotoxy(int x, int y){ // equivalente in Borland C/C++
  27.     COORD cursore; // angolo superiore sinistro = 0,0
  28.     cursore.X=x-1; // i codici Borland usano la base 1
  29.     cursore.Y=y-1; // i codici Borland usano la base 1
  30.     SetConsoleCursorPosition(handle, cursore);
  31. }
  32.  
  33. COORD getxy(){ // può far comodo
  34.     CONSOLE_SCREEN_BUFFER_INFO buff;  // buffer info schermo
  35.     GetConsoleScreenBufferInfo(handle, &buff); // lettura info console
  36.     /* info disponibili:
  37.     dwCursorPosition     COORD
  38.     dwMaximumWindowSize  COORD
  39.     dwSize               COORD
  40.     srWindow             SMALL_RECT
  41.     wAttributes          WORD
  42.     */
  43.     return buff.dwCursorPosition; // angolo superiore sinistro = 0,0
  44. }
  45.  
  46. void textcolor(int f){ // equivalente in Borland C/C++
  47.     // se f non è compreso tra 0 e 15, i colori ciclano
  48.     fore=f; // right 4 bit
  49.     SetConsoleTextAttribute(handle, fore+back*16);
  50. }
  51.  
  52. void textbackground(int b){ // equivalente in Borland C/C++
  53.     // se b non è compreso tra 0 e 15, i colori ciclano
  54.     back=b; // left 4 bit
  55.     SetConsoleTextAttribute(handle, fore+back*16);
  56. }
  57.  
  58. void clrscr(){
  59.     system("cls");
  60. }
  61.  
  62. // Test routine
  63. int main(){
  64.  
  65.     handle=GetStdHandle(STD_OUTPUT_HANDLE); // lettura dell'HANDLE
  66.  
  67.     for (int i=0; i<16; i++) printf("foba "); // intestazione fo=foreground, ba=background
  68.  
  69.     for (int ba=0; ba<16; ba++){ // 16 colori di background
  70.         for (int fo=0; fo<16; fo++){ // 16 colori di foreground
  71.             gotoxy(ba*5+1,fo+2); // ogni colore al suo posto
  72.             textcolor(fo); textbackground(ba);
  73.             printf("%02d%02d", fo, ba);
  74.         }
  75.     }
  76.     textcolor(7); textbackground(0); // colori default
  77.     printf("\n");
  78.     COORD cursore=getxy(); // lettura coordinate cursore in base 0
  79.     printf("_<- qui il cursore e' in colonna %d riga %d ", cursore.X, cursore.Y);
  80.     cursore=getxy(); // lettura coordinate cursore in base 0
  81.     printf("_<- qui colonna %d riga %d \n", cursore.X, cursore.Y);
  82.  
  83.     return 0;
  84. }


La void getxy(), non so se esiste nel compilatore Borland, ma l'ho aggiunta perché potrebbe essere utile sapere le coordinate correnti del cursore  in base 0.

Al solito, commenti e considerazioni sono gradite.

Ultima modifica effettuata da Carlo il 04/03/2021 alle 20:17


in programmazione tutto è permesso
PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 15:07
Venerdì, 26/02/2021
Se cerchi la libreria conio che racchiude tutte (e anche altre) le funzioni richieste,

Ci sono diverse implementazioni in rete, tipo:

https://github.com/thradams/conio,

Basta scaricarla e includerla nella stessa cartella dei tuoi progetti. (mettendo L header conio.h tra doppi apici e non parentesi angolari, affinchè cerchi nella stesssa cartella)

Cmq anche se non l ho provato mi sembra un buon lavoro che hai fatto.

Ultima modifica effettuata da Mikelius il 26/02/2021 alle 15:10
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 16:15
Venerdì, 26/02/2021
Grazie Mikelius, testata la "conio.h" che mi hai proposto, funziona e finalmente ho il codice per replicare il comportamento di <windows.h> in linux.

Peccato che la tua "conio.h" usa una sintassi diversa e coordinate in base 0, comunque utile da studiare e facile da modificare.

EDIT:
Non sono un Linuxxiano, in tutto ci ho passato 2 o 3 ore da quando l'ho installato 5 mesi fa, finalmente posso padroneggiare la console di Linux, rigrazie Mikelius :k:

Ultima modifica effettuata da Carlo il 26/02/2021 alle 19:31


in programmazione tutto è permesso
PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 19:30
Venerdì, 26/02/2021
Testo quotato

Postato originariamente da Carlo:

Grazie Mikelius, testata la "conio.h" che mi hai proposto, funziona e finalmente ho il codice per replicare il comportamento di <windows.h> in linux.

Peccato che la tua "conio.h" usa una sintassi diversa e coordinate in base 0, comunque utile da studiare e facile da modificare.



Si, avendo il codice e un po' di dimestichezza, non è difficile da modificare.
Se cerchi forse rieci a trovare anche altre versioni, implementate più o meno differentemente, forse più adatte alla versione che avevi fatto tu. Io ho postato la prima che ho trovato

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 19:35
Venerdì, 26/02/2021
@ Mikelius, come ti ho postato sopra, è andata bene così, perché la conio.h che mi hai proposto ha il codice anche per Linux, e mi ha permesso di vedere come si gestisce la console in Linux, con il poco tempo che ci avevo dedicato non ne ero arrivato a capo. :heehee:


in programmazione tutto è permesso
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 8:30
Sabato, 27/02/2021
La conio e' una libreria non standard utilizzata con MSDOS e quindi obsoleta.

Nello specifico, con Linux si usa la libreria ncurses

https://it.m.wikipedia.org/wiki/Ncurses

https://invisible-island.net/ncurses/

http://www.pluto.it/sites/default/files/ildp/traduzioni/nc ...

Ultima modifica effettuata da nessuno il 27/02/2021 alle 8:34


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 15:34
Sabato, 27/02/2021
Testo quotato

Postato originariamente da nessuno:

La conio e' una libreria non standard utilizzata con MSDOS e quindi obsoleta.

Nello specifico, con Linux si usa la libreria ncurses

https://it.m.wikipedia.org/wiki/Ncurses

https://invisible-island.net/ncurses/

http://www.pluto.it/sites/default/files/ildp/traduzioni/nc ...


Grazie le guarderò, ma come avrai capito più che usare la libreria, ero interessato a come fa quello che fa, e quella postata da Mikelius è scritta in mododo facilmente comprensibile e riproducibile. In XTerm/UXTerm funziona alla grande, nella finestra Bash ha dei comportamenti indesiderati, controllerò se ncurses è più compatibile, con la speranza che il codice non sia troppo complesso.


in programmazione tutto è permesso
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:39
Domenica, 28/02/2021
Io ho risposto alla tua domanda con lo stato dell'arte. Poi puoi anche usare librerie e metodi obsoleti a tua scelta


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 18:54
Domenica, 28/02/2021
Testo quotato

Postato originariamente da nessuno:

Io ho risposto alla tua domanda con lo stato dell'arte. Poi puoi anche usare librerie e metodi obsoleti a tua scelta  


Io ho valutato la tua risposta come tale, non l'ho presa alla leggera, ho archiviato i tuoi link e appena posso analizzerò le ncurses.
Il mio è un percorso: ho fatto da me, ho visto la conio postata da Mikelius e guarderò ncurses...:yup:

Ultima modifica effettuata da Carlo il 28/02/2021 alle 18:56


in programmazione tutto è permesso
PM Quote