(!!!) Видим 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х-яйцовом камушке эта дело занимало меньше секунды))))