Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: Кирилица в консоли
Показать сообщение отдельно
NYX NYX вне форума

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


(!!!) Видим 866, имеем 1251 (!!!) + возможность вводить пароли ***** символами (!!!)
Значит к какому результу я притаранился
Для начала в теле функции main() прописываем APIшные строки:

SetConsoleCP(1251);
SetConsoleOutputCP(1251);

Затем, у меня стоит своя собственная приблуда, которая ограничивает количество вводимых символо при помощи label: goto label; в теле
которого я тупо повесил char cWord = getch(); и если cWord != VK_RETURN, пишем в массив СИМВОЛ в кодировке 1251 а на экран выводим в кодировке 866 (OEM);
Вот листинг

Код: Выделить весь код
bool GetArg(char cString[], int iSize, bool Masked)
{

int iLength = 0;
char cWord = 0;
enter_word:
cWord = getch();
if (cWord == VK_TAB)cWord = 13;
if (cWord == 22) // Paste From Clipboard
    {
    if ((iLength+Clipboard()->AsText.Length()) <= iSize)
        {
        for (int newindex = iLength; newindex < (iLength + Clipboard()->AsText.Length()); newindex++)
        cString[newindex] = Clipboard()->AsText[newindex-iLength+1];
        iLength += Clipboard()->AsText.Length();
        cout << Clipboard()->AsText.c_str();
        }
    goto enter_word;
    }

if (cWord == VK_ESCAPE)SendMessage(FindWindow("ConsoleWindowClass", NULL), WM_CLOSE, 0, 0);
if (cWord != VK_RETURN)
    {
    if (cWord != VK_BACK)
        {
        if (iLength < iSize)
            {
            cString[iLength] = cWord;
            ToWin(&cWord);
            if (Masked)
            cout << '*';
            else
            cout << cWord;
            iLength++;
            }
        }
        else
        {
        if (iLength > 0)
            {
            cout << "\b \b";
            iLength--;
            cString[iLength] = 0;
            }
        }
    goto enter_word;
    }
    else
    {
    if (strlen(cString) > (unsigned)iSize){cout << " -- Buffer oveflow (press key)"; return 0;}
    iLength = 0;
    if (strlen(cString) > 0)
        {
        return 1;
        }
    goto enter_word;
    }
}

// Кстати незаменимая штукенция на тот случай если в консоли надо ввест пароль :) последним аргументом это регулируется :)
в листинге есть вызов некой ToWin(&cWord); которая и транслирует мне 1251 в 866 делает она это так:
Код: Выделить весь код
void ToWin(char *symbol) 
{
for (unsigned int CPIndex = 0; CPIndex < strlen(Win); CPIndex++)
if (*symbol == Oem[CPIndex])*symbol = Win[CPIndex];
}

перед стартом проги делается это: // объявляется перед стартом потока main(); тобешь ГЛОБАЛЬНО
char Win[67];
char *Oem = "ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäå¸æçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
CharToOem("ÀÁÂÃÄŨÆÇÈÊÉËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäå¸æçèéêëìíîïðñòóôõö÷øùúûüýþÿ", Win); // Лень переписывать (в массивы загоняются А-Я-а-я)
ФФух кажысь выложил идейку

Да и уж извините что офтопю, просто на радостях:
Написал штучку зугружающую картинку в консоль
вот она:

Код: Выделить весь код
for(long y = 0; y < 120; ++y)
    {
    for(long x = 0; x < 400; ++x)
		{
        SetPixel(dc, x, y, logo_img[y * 400 + x]);
  		}
    }
Sleep(1000);
for(long y = 0; y < 120; ++y)
    {
    for(long x = 0; x < 400; ++x)
		{
        SetPixel(dc, x, y, 0);
  		}
    }

unsigned long logo_img[144056] = {0,0,0 ... }; // это массив который я собрал из имеющегося логотипа :) сделал это для того что бы не было зависимости вылетов в тех ситуациях, когда отсутствует логотип. Написал программку, которая делает так:

#include <assert.h>

HBITMAP hBmp = (HBITMAP)LoadImage(GetModuleHandle(0), "logo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
BITMAP bmpInfo = {};
::GetObject(hBmp, sizeof(BITMAP), &bmpInfo);
assert(bmpInfo.bmBitsPixel / 8 == sizeof(COLORREF));
LONG nCount = bmpInfo.bmWidth * bmpInfo.bmHeight;
COLORREF* pBits = new COLORREF[nCount];
GetBitmapBits(hBmp, nCount * sizeof(COLORREF), pBits);
затем этот самый pBits[] посимвольно вывожу в файл, который формируется таким образом:
сначала добавляю строки
#ifndef MYLOGO_H
#define MYLOGO_H
unsigned long logo_img[размер pBits в байтах] = { ... далее циклом вставляю pBits[x] << ","; (!!!) // Самое главное каждые 10 выводов в файл, надо вставлять '\n' ибо компилятор будет
материться если в строке будет дофига символов

Да и логотип такого размера будет туговато грузиться на машинках от 900 Мгц так что лучше делать голотипчик размером не более 5000 байт, в таком случае он на стареньких компах
будет более менее грузиться (например проверил на Asus Eee 701 - 10кратное обновление картинки заняло около 20 сек, в то время как на 2х-яйцовом камушке эта дело занимало меньше секунды))))

Последний раз редактировалось Drongo, 25-12-2009 в 16:28. Причина: Худая память, кривые руки


Отправлено: 16:42, 21-12-2009 | #70

Название темы: Кирилица в консоли