Kolory w konsoli windows (dowolne), jezyk polski w konsoli

Odpowiedz Nowy wątek
2012-04-30 00:01
Hajter 393
0

Czy jest możliwość uzyskania dowolnego koloru tekstu w konsoli windows? Cały wieczór spędziłem aby poszukać informacji na ten temat, i jedyne co mi się udało to uzyskać 8 kolorów oraz czy jest możliwe, aby tekst napisany w konsoli windows był w języku polskim?

2012-04-30 00:40
0

jedyne co mi się udało to uzyskać 8 kolorów
kolorów jest 16. ale nie więcej.

czy jest możliwe, aby tekst napisany w konsoli windows był w języku polskim?

Tak. Jeśli masz problem z polskimi literami, daj

#include <clocale>
...
int main()
{
  setlocale(LC_CTYPE, ".1250");
}

Działa w Visualu. Pod MinGW na niektórych komputerach nie chce.

Pozostało 580 znaków

2012-04-30 18:32
7

Hey,

kolorów jest 16. ale nie więcej.

Zgadza się! A konkretniej, jest 16 kolorów z palety którą można samemu zdefiniować (tj. można samemu zdefiniować na Vista/2008/7/etc; nie testowałem na XP, ale wg. MSDN funkcje do redefiniowania palety są dopiero od ww. wersji).

Najpierw obrazek:
user image

Przykładowy kod:

// Windows conhost palette change test.
// gynvael.coldwind//vx
// Consider this code public domain
// (except the definitions; they are from MSDN; links below).
// Btw, this required Vista/2008 or newer version of windows.
#include <windows.h>
#include <stdio.h>

// Uncomment this if CONSOLE_SCREEN_BUFFER_INFOEX is undefined.
// - This seems to be the case in MinGW Platform API.
// - This is NOT the case for the newest Microsoft Windows Platform SDK.

// Source for these definitions: MSDN
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686039(v=vs.85).aspx
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms683172(v=vs.85).aspx
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682091(v=vs.85).aspx
/*
typedef struct _CONSOLE_SCREEN_BUFFER_INFOEX {
  ULONG      cbSize;
  COORD      dwSize;
  COORD      dwCursorPosition;
  WORD       wAttributes;
  SMALL_RECT srWindow;
  COORD      dwMaximumWindowSize;
  WORD       wPopupAttributes;
  BOOL       bFullscreenSupported;
  COLORREF   ColorTable[16];
} CONSOLE_SCREEN_BUFFER_INFOEX, *PCONSOLE_SCREEN_BUFFER_INFOEX;

extern "C" BOOL WINAPI GetConsoleScreenBufferInfoEx(
  HANDLE hConsoleOutput,
  PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
);

extern "C" BOOL WINAPI SetConsoleScreenBufferInfoEx(
  HANDLE hConsoleOutput,
  PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
);
*/

// Let's test the palette!
int
main(void)
{
  // Set a black into violet gradient.
  CONSOLE_SCREEN_BUFFER_INFOEX bi;
  bi.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
  HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE);

  GetConsoleScreenBufferInfoEx(hcon, &bi);

  // Format: 0x00bbggrr
  bi.ColorTable[ 0] = 0x000000; // black
  bi.ColorTable[ 1] = 0x110011; // very dark violet
  bi.ColorTable[ 2] = 0x330033; 
  bi.ColorTable[ 3] = 0x550055;
  bi.ColorTable[ 4] = 0x770077;
  bi.ColorTable[ 5] = 0x990099;
  bi.ColorTable[ 6] = 0xbb00bb;
  bi.ColorTable[ 7] = 0xdd00dd;
  bi.ColorTable[ 8] = 0xff11ff; // violet
  bi.ColorTable[ 9] = 0xff33ff;
  bi.ColorTable[10] = 0xff55ff;
  bi.ColorTable[11] = 0xff77ff; // pink
  bi.ColorTable[12] = 0xff99ff;
  bi.ColorTable[13] = 0xffbbff;
  bi.ColorTable[14] = 0xffddff; 
  bi.ColorTable[15] = 0xffffff; // white

  SetConsoleScreenBufferInfoEx(hcon, &bi);

  // Test.
  for(DWORD i = 0; i < 16; i++) {
    // Change the color and print a test message.
    SetConsoleTextAttribute(hcon, i);
    printf("This is a test for color %u\n", (unsigned int)i);

    // Buffering vs SetConsoleTextAttribute might be a bad idea.    
    fflush(stdout);
  }

  // Done.
  return 0;
}

Update:
Ad polskie znaki diakrytyzowane (ąłść etc) w konsoli - tutaj trzeba pamiętać o jednej ważnej zasadzie: nieważne którą "polską" stronę kodową wybierzesz, ważne żeby edytor kodu / tekstu miał ustawioną dokładnie taką samą.
Czyli, jeśli masz edytor który zapisuje kod w utf-8, a stronę ustawisz jako windows-1250 (1250), to pojawią się krzaczki.
Prawdę mówiąc warto aby w ogóle nie trzymać stringów z polskimi znakami w kodzie - najlepiej trzymać je w jakimś pliku tekstowym i je sobie wczytać jako binarne dane. Warto również gdzieś na górze takowego pliku zamieścić informacje o użytym kodowaniu (tak aby następna osoba, która go będzie edytować, nie musiała zgadywać).

Anyway, przykładowy kod z kilkoma różnymi stronami kodowymi obsługującymi polskie znaki:

user image

// Polish characters in Windows.
// gynvael.coldwind//vx
// Consider this code public domain
#include <windows.h>
#include <stdio.h>

int
main(void)
{
  // Kazdy test zawiera nastepujace literki (diakrytyzowane):
  // Aa Ss Zz Zz Oo
  //       ^^^^^
  //       pierwsze z kropeczka, drugie z kreseczka :)

  // Przydatny link:
  // http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx

  // ibm852 -- OEM Latin 2; Central European (DOS)
  // http://en.wikipedia.org/wiki/Code_page_852
  SetConsoleOutputCP(852);
  puts("Test strony kodowej 852 (ibm852):\n"
       "\xA4\xA5 \x97\x98 \xBD\xBE \x8D\xAB \xE0\xA2\n");
  fflush(stdout); // Buforowanie vs zmiana strony kodowej brzmi jak zly pomysl.

  // windows-1250 -- ANSI Central European; Central European (Windows)
  // http://en.wikipedia.org/wiki/Code_page_1250
  SetConsoleOutputCP(1250);
  puts("Test strony kodowej 1250 (windows-1250):\n"
       "\xA5\xB9 \x8C\x9C \xAF\xBF \x8F\x9F \xD3\xF3\n");
  fflush(stdout); // Buforowanie vs zmiana strony kodowej brzmi jak zly pomysl.

  // iso-8859-2 -- ISO 8859-2 Central European; Central European (ISO)
  // http://en.wikipedia.org/wiki/ISO/IEC_8859-2
  SetConsoleOutputCP(28592);
  puts("Test strony kodowej 28592 (iso-8859-2):\n"
       "\xA1\xB1 \xA6\xB6 \xAF\xBF \xAC\xBC \xD3\xF3\n");
  fflush(stdout); // Buforowanie vs zmiana strony kodowej brzmi jak zly pomysl.

  // Skipping utf-7 since it shouldn't be used anyway.
  // http://en.wikipedia.org/wiki/UTF-7#Security

  // utf-8 -- Unicode (UTF-8)
  // http://en.wikipedia.org/wiki/UTF-8
  SetConsoleOutputCP(65001);
  puts("Test strony kodowej 65001 (utf-8):\n"
       "\xC4\x84\xC4\x85 \xC5\x9A\xC5\x9B \xC5\xBB\xC5\xBC "
       "\xC5\xB9\xC5\xBA \xC3\x93\xC3\xB3\n");
  // Moj edytor zapisuje w utf-8 wiec moglem po prostu napisac:
  //  "Ąą Śś Żż Źź Óó\n"
  fflush(stdout); // Buforowanie vs zmiana strony kodowej brzmi jak zly pomysl.

  // Done.
  return 0;
}

peace,
gynvael.coldwind//vx

"Imagination is more important than knowledge..." Albert Einstein
edytowany 3x, ostatnio: Gynvael Coldwind, 2012-04-30 19:33
"Literówka" się trafiła, "Done." w pierwszym kodzie nie zakomentowane. I podwojony link do http://en.wikipedia.org/wiki/Code_page_1250 w drugim ;) - Jadeszek 2012-04-30 19:25
wczoraj w jakimś poście ktoś wspominał, że kiedyś "Gyn" bywał na 4p, a tutaj proszę cóż za niespodziana :) - matek3005 2012-04-30 21:40
@matek3005 O tym samym pomyślałem ;) - Jadeszek 2012-04-30 22:44
czy zmiana koloru w palecie wpływa tylko na nowe znaki, czy zmienia kolor już wyświetlonych znaków na ekranie? - Azarien 2012-04-30 23:55
@Azarien: zmienia kolory już wyświetlonych niestety ;) (rozumiem, że dążysz do starego triku z GIF / niektórych komputerów 8-bitowych ze zmianą palety "w locie"? ;> good call, ale niestety ;>) Zawsze można pobrać HWND konsoli i sobie tam narysować bitmapkę z tekstem w innych kolorach ;p) @Jadeszek / @matek3005: nie? brzmi to przynajmniej podejrzanie ;) - Gynvael Coldwind 2012-05-01 12:44

Pozostało 580 znaków

2012-04-30 21:46
Hajter 393
0

@Azarien

Niestety podany przez Ciebie sposób nie działa, może dlatego że korzystam z Code::Blocks, ale dzięki za chęci.

@Gynvael Coldwind

Z kolorami lipa, bo korzystam głównie z Xp i Twój program nawet się nie kompiluje, co do polskich znaków to działa, z tym że muszę jeszcze ogarnąć kod (m.in. bibliotekę stdio.h). Także dziękuję za chęci i pomoc ;p

Co do kolorów to myślałem że jest możliwość mieszania podstawowych kolorów np. procentowo. Dla przykładu w tej funkcji po "Wymieszaniu" barwy czerwonej z niebieską otrzymuję fiolet:


#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_BLUE | FOREGROUND_RED );
    cout << "Ten napis jest fioletowy" << endl;
    return 0;
}
Yep, na XP program się nie odpali / czasem nawet nie skompiluje. Natomiast jestem ciekaw czy nie można by jakimś CSRSS callem uzyskać identycznych feature'ów na XP (tj. zmiany palety). Hmm nie mam XP pod ręką, więc trudno mi sprawdzić niestety. Ad mieszanie - powiedzmy, że domyślna paleta 16 kolorów jest tak ustawiona, żeby imitować mieszanie barw, a raczej włączanie/wyłączanie danej barwy (red / green / blue) z koloru + jak pisze adf88 rozjaśnienie koloru (historycznie tez tak było, z wyłączeniem koloru brązowego (6) który miał inne proporcje kolorów niż reszta). - Gynvael Coldwind 2012-05-01 12:38

Pozostało 580 znaków

2012-04-30 22:01
1

Do uzyskanie jest 16 kolorów. FOREGROUND_INTENSITY rozjaśnia kolor.

http://msdn.microsoft.com/en-[...]x#_win32_character_attributes

edytowany 1x, ostatnio: adf88, 2012-04-30 22:01

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0