Цветная палитра в консоле? Определение позиции курсора?
От: PsiH-kz  
Дата: 09.02.05 18:58
Оценка:
Народ, I need help! Задача заключается в следующем:
Необходимо в консоли вывести цветной текс с поддержкой русского шрифта и определить позицию курсора.
Я поискал решение данной задачи в MSDNе и нашел. По примеру сделал, работает , но вот беда стандартная функция CharToOem с помощью, которой выводил русский текс, в данном примере не работает . Подскажите как или с помощью чего это можно исправить?
Текс функции вывода цветной палитры:
void TypeColorText(char lpszStringSRC[100], WORD wColors, int CorX = 0, int CorY = 0)
{
    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD cWritten; 
    BOOL fSuccess; 
    COORD coord; 
    CHAR chFillChar;
 
    char lpszString[100];
    СharToOem(lpszStringSRC, lpszString); //!!!Не работает!!!

    coord.X = CorX;
    coord.Y = CorY; 
    
    fSuccess = WriteConsoleOutputCharacter( 
        hOutput,              
        lpszString,           
        lstrlen(lpszString),  
        coord,                
        &cWritten);           

    if (!fSuccess) 
        MyError("\t\nWriteConsoleOutputCharacter\n"); 
 
    for (;coord.X < lstrlen(lpszString); coord.X++) 
    {
        fSuccess = WriteConsoleOutputAttribute( 
            hOutput,          
            &wColors,         
            1,                
            coord,             
            &cWritten);       
    }

    if (! fSuccess) 
        MyError("\t\nWriteConsoleOutputAttribute\n");
}


Как можно определить позицую курсора в консоли и проводить над ним разные операции?
Re: Цветная палитра в консоле? Определение позиции курсора?
От: Alter_ Украина http://alter.org.ua
Дата: 09.02.05 19:59
Оценка:
Здравствуйте, PsiH-kz, Вы писали:

PK>Народ, I need help! Задача заключается в следующем:

PK> Необходимо в консоли вывести цветной текс с поддержкой русского шрифта и определить позицию курсора.
PK>Я поискал решение данной задачи в MSDNе и нашел. По примеру сделал, работает , но вот беда стандартная функция CharToOem с помощью, которой выводил русский текс, в данном примере не работает . Подскажите как или с помощью чего это можно исправить?
PK>Текс функции вывода цветной палитры:
PK>
PK>void TypeColorText(char lpszStringSRC[100], WORD wColors, int CorX = 0, int CorY = 0)
PK>{
PK>    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

PK>    char lpszString[100];
PK>    СharToOem(lpszStringSRC, lpszString); //!!!Не работает!!!

PK>}
PK>


А как именно она не работает ? что возвращает ?
И что сказал GetlastError() ?
и еще можно попробовать WideCharToMultiByte() с WC_COMPOSITECHECK и CP_OEMCP или CP_ACP

PK>Как можно определить позицую курсора в консоли и проводить над ним разные операции?


GetConsoleCursorInfo() и SetConsoleCursorInfo()

--
Alter, http://alter.org.ua
--
Alter, http://alter.org.ua
Re[2]: Цветная палитра в консоле? Определение позиции курсор
От: PsiH-kz  
Дата: 10.02.05 07:12
Оценка:
Здравствуйте, Alter_, Вы писали:

A_>А как именно она не работает ? что возвращает ?

A_>И что сказал GetlastError() ?
A_>и еще можно попробовать WideCharToMultiByte() с WC_COMPOSITECHECK и CP_OEMCP или CP_ACP

PK>>Как можно определить позицую курсора в консоли и проводить над ним разные операции?


A_>GetConsoleCursorInfo() и SetConsoleCursorInfo()


A_>--

A_>Alter, http://alter.org.ua


Сама функция СharToOem работает, ошибку не возвращает! После того как эта функция конвертнула выполняется функция WriteConsoleOutputCharacter. Результатом ее выполения явлется то, что она половину русского алфавита не выдает оставляет пробелы. Попробывал функцию WideCharToMultiByte() с разными параметрами. Выдает одни вопросительные знак.
Может я, чтото не так делаю? Вот пример функции:


void TypeColorText(char lpszStringSRC[256], WORD wColors, int CorX = 0, int CorY = 0)
{
    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD cWritten; 
    BOOL fSuccess; 
    COORD coord;
    int iResult;
    char lpszString[256];
    
    iResult = WideCharToMultiByte(CP_ACP,
        WC_COMPOSITECHECK,
        (LPCWSTR) lpszStringSRC,
        -1,
        lpszString,
        256,
        NULL,
        NULL);

   if(iResult == ERROR_INSUFFICIENT_BUFFER) MyError("ERROR_INSUFFICIENT_BUFFER\n");
   if(iResult == ERROR_INVALID_FLAGS) MyError("ERROR_INVALID_FLAGS\n");
   if(iResult == ERROR_INVALID_PARAMETER) MyError("ERROR_INVALID_PARAMETER\n");


   /*CharToOem(lpszStringSRC, lpszString);*/
    coord.X = CorX;
    coord.Y = CorY;
    
    fSuccess = WriteConsoleOutputCharacter( 
        hOutput,              
        lpszString,           
        lstrlen(lpszString),  
        coord,
        &cWritten);

    if (!fSuccess) 
        MyError("\t\nWriteConsoleOutputCharacter\n"); 
 
    for (;coord.X < CorX + lstrlen(lpszString); coord.X++) 
    {
        fSuccess = WriteConsoleOutputAttribute( 
            hOutput,          
            &wColors,         
            1,                
            coord,            
            &cWritten);       
    }

    if (! fSuccess) 
        MyError("\t\nWriteConsoleOutputAttribute\n");
}
Re[3]: Цветная палитра в консоле? Определение позиции курсор
От: Alter_ Украина http://alter.org.ua
Дата: 11.02.05 17:44
Оценка:
Здравствуйте, PsiH-kz, Вы писали:


PK>Сама функция СharToOem работает, ошибку не возвращает! После того как эта функция конвертнула выполняется функция WriteConsoleOutputCharacter. Результатом ее выполения явлется то, что она половину русского алфавита не выдает оставляет пробелы. Попробывал функцию WideCharToMultiByte() с разными параметрами. Выдает одни вопросительные знак.

PK>Может я, чтото не так делаю? Вот пример функции:

А конвертация правильно работает ? в 866ю таблицу ?
Можно попробовать WriteConsoleOutputCharacterW() или WriteConsoleW()... Тогда вообще на преобразование не заморачиваться.
или нужно под 9x ?

PK>
PK>void TypeColorText(char lpszStringSRC[256], WORD wColors, int CorX = 0, int CorY = 0)
PK>{
PK>    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
PK>    DWORD cWritten; 
PK>    BOOL fSuccess; 
PK>    COORD coord;
PK>    int iResult;
PK>    char lpszString[256];
    
PK>    iResult = WideCharToMultiByte(CP_ACP,
PK>        WC_COMPOSITECHECK,
PK>        (LPCWSTR) lpszStringSRC,
PK>        -1,
PK>        lpszString,
PK>        256,
PK>        NULL,
PK>        NULL);

PK>   if(iResult == ERROR_INSUFFICIENT_BUFFER) MyError("ERROR_INSUFFICIENT_BUFFER\n");
PK>   if(iResult == ERROR_INVALID_FLAGS) MyError("ERROR_INVALID_FLAGS\n");
PK>   if(iResult == ERROR_INVALID_PARAMETER) MyError("ERROR_INVALID_PARAMETER\n");


PK>   /*CharToOem(lpszStringSRC, lpszString);*/
PK>    coord.X = CorX;
PK>    coord.Y = CorY;
    
PK>    fSuccess = WriteConsoleOutputCharacter( 
PK>        hOutput,              
PK>        lpszString,           
PK>        lstrlen(lpszString),  
PK>        coord,
PK>        &cWritten);

PK>    if (!fSuccess) 
PK>        MyError("\t\nWriteConsoleOutputCharacter\n"); 
 
PK>    for (;coord.X < CorX + lstrlen(lpszString); coord.X++) 
PK>    {
PK>        fSuccess = WriteConsoleOutputAttribute( 
PK>            hOutput,          
PK>            &wColors,         
PK>            1,                
PK>            coord,            
PK>            &cWritten);       
PK>    }

PK>    if (! fSuccess) 
PK>        MyError("\t\nWriteConsoleOutputAttribute\n");
PK>}
PK>
--
Alter, http://alter.org.ua
Re[2]: Цветная палитра в консоле? Определение позиции курсор
От: Silent Bob  
Дата: 11.02.05 18:18
Оценка: 1 (1)
PK>>Как можно определить позицую курсора в консоли и проводить над ним разные операции?

A_>GetConsoleCursorInfo() и SetConsoleCursorInfo()


А вот и нет!


hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

void getxy(int *x, int *y)
{
    CONSOLE_SCREEN_BUFFER_INFO consoleScreenBufferInfo;
    GetConsoleScreenBufferInfo(hConsole, &consoleScreenBufferInfo);

    *x = consoleScreenBufferInfo.dwCursorPosition.X;
    *y = consoleScreenBufferInfo.dwCursorPosition.Y;
}

void gotoxy(int x, int y)
{
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(hConsole, coord);
}
Re[3]: Цветная палитра в консоле? Определение позиции курсор
От: Alter_ Украина http://alter.org.ua
Дата: 12.02.05 10:32
Оценка:
Здравствуйте, Silent Bob, Вы писали:

PK>>>Как можно определить позицую курсора в консоли и проводить над ним разные операции?


A_>>GetConsoleCursorInfo() и SetConsoleCursorInfo()


SB>А вот и нет!


SB>
SB>    GetConsoleScreenBufferInfo(hConsole, &consoleScreenBufferInfo);
SB>


Мдя... промахнулся я малость

--
Alter, http://alter.org.ua
--
Alter, http://alter.org.ua
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.