[tutorial] Kolorowy batch bez ansi escape?

Regulamin działu
Kolorowanie składni :
[c][/c], [vb][/vb], [asm][/asm], [delphi][/delphi], [pascal[/pascal], [python][/python], [perl][/perl], [ruby][/ruby], [bash][/bash]

[tutorial] Kolorowy batch bez ansi escape?

Postprzez Patrykuss 11 sie 2009, o 19:36

Witam.

Jako, że już dawno nutrowało mnie to zagadnienie, postanowiłem zrobić coś w tym kierunku. Niestety, swojego czasu uprzedził mnie kolega Gynvael (), jednak to mnie nie zniechęciło. Wręcz przeciwnie, poczułem ochotę rozwiązania problemu w inny sposób. Jak, dalej zapewne każdy wywnioskuje, do głowy przyszło mi bardzo proste ale skuteczne rozwiązanie. "Dlaczego by tak nie napisać do tego bilbioteczki?". Jak pomyślałem, tak się stało. Poniżej zamieszczam kod (brzydki ale działający).
Kod: Zaznacz cały
  1. #include <iostream>
  2. #include <string>
  3. #include <windows.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. using namespace std;
  8.  
  9. int main(int argc, char * argv[]){
  10.  
  11.  if(argc-1 == 0){
  12.        printf("Kolory, jak w komendzie COLOR. Zastosowanie: echoo 0 1 czesc. Wyswietli 'czesc' niebieska czcionka na czarnym tle.");  
  13.        system("PAUSE");
  14.  }else{
  15.        
  16.        char * arg = argv[1];
  17.        int argco = atoi(arg);
  18.        char * arg2 = argv[2];
  19.        int argco2 = atoi(arg2);
  20.        
  21.        int ktlo = 0;
  22.        int ktekst = FOREGROUND_GREEN;
  23.        
  24.        
  25.         if(argco == 0){
  26.             ktlo = 0;
  27.         }  
  28.         if(argco == 1){
  29.             ktlo = BACKGROUND_BLUE;
  30.         }
  31.         if(argco == 2){
  32.             ktlo = BACKGROUND_GREEN;
  33.         }   
  34.         if(argco == 3){
  35.             ktlo = BACKGROUND_GREEN | BACKGROUND_BLUE;
  36.         }
  37.         if(argco == 4){
  38.             ktlo = BACKGROUND_RED;
  39.         }
  40.         if(argco == 5){
  41.             ktlo = BACKGROUND_RED | BACKGROUND_BLUE;
  42.         }
  43.         if(argco == 6){
  44.             ktlo = BACKGROUND_RED | BACKGROUND_GREEN;
  45.         }
  46.         if(argco == 7){
  47.             ktlo = BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED;
  48.         }
  49.         if(argco == 8){
  50.             ktlo = BACKGROUND_INTENSITY | 0;
  51.         }
  52.         if(argco == 9){
  53.             ktlo = BACKGROUND_INTENSITY | BACKGROUND_BLUE;
  54.         }
  55.         if(argco == 10){
  56.             ktlo = BACKGROUND_INTENSITY | BACKGROUND_GREEN;
  57.         }
  58.         if(argco == 11){
  59.             ktlo = BACKGROUND_INTENSITY | BACKGROUND_BLUE | BACKGROUND_GREEN;
  60.         }
  61.         if(argco == 12){
  62.             ktlo = BACKGROUND_INTENSITY | BACKGROUND_RED;
  63.         }
  64.         if(argco == 13){
  65.             ktlo = BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_BLUE;
  66.         }
  67.         if(argco == 14){
  68.             ktlo = BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN;
  69.         }
  70.         if(argco == 15){
  71.             ktlo = BACKGROUND_INTENSITY | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED;
  72.         }
  73.        
  74.         /////////////////////////////////////////////////////////////////////
  75.        
  76.         if(argco2 == 0){
  77.             ktekst = 0;
  78.         }
  79.         if(argco2 == 1){
  80.             ktekst = FOREGROUND_BLUE;
  81.         }
  82.         if(argco2 == 2){
  83.             ktekst = FOREGROUND_GREEN;
  84.         }
  85.         if(argco2 == 3){
  86.             ktekst = FOREGROUND_GREEN | FOREGROUND_BLUE;
  87.         }
  88.         if(argco2 == 4){
  89.             ktekst = FOREGROUND_RED;
  90.         }
  91.         if(argco2 == 5){
  92.             ktekst = FOREGROUND_RED | FOREGROUND_BLUE;
  93.         }
  94.         if(argco2 == 6){
  95.             ktekst = FOREGROUND_RED | FOREGROUND_GREEN;
  96.         }
  97.         if(argco2 == 7){
  98.             ktekst = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
  99.         }
  100.         if(argco2 == 8){
  101.             ktekst = FOREGROUND_INTENSITY | 0;
  102.         }
  103.         if(argco2 == 9){
  104.             ktekst = FOREGROUND_INTENSITY | FOREGROUND_BLUE;
  105.         }
  106.         if(argco2 == 10){
  107.             ktekst = FOREGROUND_INTENSITY | FOREGROUND_GREEN;
  108.         }
  109.         if(argco2 == 11){
  110.             ktekst = FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_GREEN;
  111.         }
  112.         if(argco2 == 12){
  113.             ktekst = FOREGROUND_INTENSITY | FOREGROUND_RED;
  114.         }
  115.         if(argco2 == 13){
  116.             ktekst = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE;
  117.         }
  118.         if(argco2 == 14){
  119.             ktekst = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN;
  120.         }
  121.         if(argco2 == 15){
  122.             ktekst = FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
  123.         }
  124.        
  125.         SetConsoleTextAttribute (GetStdHandle(STD_OUTPUT_HANDLE), ktekst | ktlo);
  126.  
  127.         for(int i = 3; i<=argc-1;i++){
  128.         printf("%s ", argv[i]);
  129.         }
  130.        
  131. }
  132.  
  133.  return 0;  
  134. }


Jak widać, skorzystałem tutaj z gotowych, microsoftowych funkcji, co nie ma większego znaczenia, gdyż i tak całość jest przeznaczona dla skryptów pisanych w batchu.

Wynik takowej zabawy można zobaczyć pod adresem http://patrykuss.python.org.pl/photos/col_cmd.png.

Cały wpis dotyczący powyższej "biblioteki" dostępny jest pod adresem http://patrykuss.python.org.pl/news,10.html.

PS. Całkiem zapomniałbym o sposobie użycia :D
Kod: Zaznacz cały
  1. echoo N Y String

N- kolor tła
Y- kolor pierwszego planu
Sring- naturalnie string wejściowy.

Avatar użytkownika
Patrykuss
 
Posty: 5
Dołączył(a): 8 sie 2009, o 20:30

Re: [tutorial] Kolorowy batch bez ansi escape?

Postprzez timpler 12 sie 2009, o 11:09

Patrykuss napisał(a):Niestety, swojego czasu uprzedził mnie kolega Gynvael (), jednak to mnie nie zniechęciło.


Gynvael zrobił coś zupełnie innego. Napisał patchera cmd.exe, który używa "kodów ucieczki" podczas komendy echo/prompt/type.
A ty jedyne co robisz to zmieniasz kolor czcionki i printujesz tekst. Caly twoj prog opiera sie na jednej, podstawowej funkcji WinAPI.
Jego app patchuje cmd, a twoj wyswietla tekst na kolorze.

timpler
 
Posty: 11
Dołączył(a): 27 lip 2009, o 18:33

Re: [tutorial] Kolorowy batch bez ansi escape?

Postprzez Patrykuss 12 sie 2009, o 12:19

Zgadza się. Jednak przed napisaniem całości, rozmawiałem z Gynvaelem i w zasadzie, efekt jaki chceliśmy uzyskać był ten sam efekt, tyle, że on zrobił to bardziej profesjonalnie i z dodatkami. Moje rozwiązanie jest prostsze, primytywniejsze ale uzyskałem efekt, jaki chciałem.

A ty jedyne co robisz to zmieniasz kolor czcionki i printujesz tekst. Caly twoj prog opiera sie na jednej, podstawowej funkcji WinAPI.

Zgadza się. Jednak czy to w czymś przeszkadza :>?

Avatar użytkownika
Patrykuss
 
Posty: 5
Dołączył(a): 8 sie 2009, o 20:30

Re: [tutorial] Kolorowy batch bez ansi escape?

Postprzez timpler 12 sie 2009, o 12:44

no nie wiem czy efekt miał być zupełnie ten sam.

Po kilku godzinach miałem stworzonego patcha do cmd.exe,
który pozwalał na użycie ANSI Escape Code'ów w wewnętrznych poleceniach konsoli


A twój sposób polega na ciągłym wywoływaniu programu tak aby pokolorować linie, u niego wystarczy dodać escape code'a.

Z resztą co mnie to obchodzi. Masz program używaj go, udostępnij, może będzie popych...

timpler
 
Posty: 11
Dołączył(a): 27 lip 2009, o 18:33


Powrót do Bash/Batch

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 0 gości

cron