Функции API для работы с консолью
Для начала работы с консолью необходимо получить ее дескриптор.
Функция получения дескриптора стандартного устройства ввода, вывода или ошибки в зависимости от переданного константного параметра:
HANDLE WINAPI GetStdHandle(__in DWORD nStdHandle);
nStdHandle может принимать значения
- STD_INPUT_HANDLE = -10; // устройство ввода
- STD_OUTPUT_HANDLE = -11; // устройство вывода
- STD_ERROR_HANDLE = -12; // ошибка
Использование русского языка в консоли с помощью API
Для указания кодовой страницы используются функции
- Кодовая страница консоли вывода
BOOL WINAPI SetConsoleOutputCP(UINT wCodePageID); - Кодовая страница консоли ввода
BOOL WINAPI SetConsoleCP(UINT wCodePageID);
где wCodePageID — номер кодовой страницы.
Для перекодировки на русский язык используется кодовая страница wCodePageID=1251 .
Для перекодировки русского текста, введенного в Win-коде также может использоваться функция
- lpszSrc – указатель на строку-источник;
- lpszDst/strong> – указатель на строку-приемник
Возвращаемое значение 1 в случае успешной перекодировки.
Чтение/запись данных в консоль/файл
Для чтения и записи данных в консоль используются функции
В случае успешного завершения функции возвращают ненулевое значение.
Аргументы функций
- hFile -дескриптор файла/консоли. Файл/консоль должен иметь доступ для чтения для функции ReadFile() и доступ для записи для функции WriteFile() .
- lpBuffer — указатель на буфер (строку) для чтения/записи данных.
- nNumberOfBytesToWrite — число байтов, которые будут записаны в файл.
- lpNumberOfBytesWritten — указатель на переменную, которая получает число считанных/записанных байтов.
- lpOverlapped — указатель на структуру OVERLAPPED , которая используется в операциях асинхронного ввода-вывода (например, получение данных по интерфейсу связи). Для синхронного ввода-вывода данный указатель имеет значение NULL .
Установка заголовка окна консоли
Функция установки заголовка окна консоли
lpConsoleTitle – указатель на строку имени консоли с завершающим нуль-символом
Установка цвета символов и фона в консоли
Цвет символов и фона задается с помощью констант, определяющих тетрады символов.
Цвет символов
- FOREGROUND_BLUE = 0x01
- FOREGROUND_GREEN = 0x02
- FOREGROUND_RED = 0x04
- FOREGROUND_INTENSITY = 0x08
- BACKGROUND_BLUE = 0x10
- BACKGROUND_GREEN = 0x20
- BACKGROUND_RED = 0x40
- BACKGROUND_INTENSITY = 0x80
Каждая тетрада, определяющая цвет символов или фона, представляет собой значение от 0 до 15, задаваемая логической суммой соответствующих констант:
Например, цвет символов с кодом 13 задается как
FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY .
Функция определения атрибутов вводимых символов в окне консоли
- hConsoleOutput – дескриптор буфера консоли вывода;
- wAttributes – цвет букв и фона, получаемый путем комбинации констант
Функция, задающая цвет фона консоли(путем закрашивания фона отдельных символов)
- hConsoleOutput – дескриптор буфера вывода консоли;
wAttribute – атрибут цвета фона символа в консоли; - nLength – количество ячеек символов, фон которых устанавливается заданным цветом;
- dwWriteCoord – координаты первой закрашиваемой ячейки;
- lpNumberOfAttrsWritten – указатель на идентификатор, в который записывается количество реально закрашенных ячеек.
Для того чтобы изменить цвет всего окна консоли необходимо задать цвет символов, количество которых определяется размером окна консоли. Размер стандартного окна консоли 80×25 = 2000 символов.
Установка позиции курсора
Функция установки позиции курсора в окне консоли
hConsoleOutput – дескриптор буфера вывода консоли;
dwCursorPosition – структура координат COORD, определяющая позицию курсора.
Структура координат представляет собой
Результат выполнения
Примечание: для корректной компиляции программы необходимо изменить тип кодировки проекта на многобайтовую.
Руководство по API командной строки
Command Line API Reference — оригинал статьи. Перевод статьи от нашего старшего frontend разработчика Сэма Булатова.
API консоли содержит коллекцию полезных функций для выполнения простых задач: выделение и испектирование DOM элементов, вывод данных в читабельном формате, остановка и запуск профайлера, и мониторинг DOM событий.
Это API доступно только из консоли. Вы не сможете получить доступ к нему из скриптов страницы.
Если вы ищите функции которые работают с консолью ( функции которые начинаются с console.*), ознакомьтесь с Console API .
$_ возвращает последнее выполненное выражение.
В следующем примере, выполняется простое выражение (2 + 2). $_свойство содержит результат этого выражения.
В следующем примере, в консоль вводится массив имен. Выполнение $_.length для нахождения длины массива, приведет к изменению содержимого $_ , что в итоге будет равно 4:
Команды $0, $1, $2, $3 и $4 содержат последние 5 проинспектированных DOM элементов через панель Elements или последние 5 JavaScript обектов выбранные в панели Profiles. $0возвращает самый последний выделенный элемент или JavaScript объект, $1 возвращает предыдущий выделенный элемент и так далее.
В следующем примере, выделенный через панель Elements тег img , $0 содержит ссылку на тег img так как это последний выбранный элемент:
На изображении ниже показан другой элемент выбранный на той же странице. Теперь $0 возвращает недавно выбранный элемент, а $1возвращает предыдущий выбранный элемент, то есть тег img .
$(selector, [startNode])
$(selector) возвращает первый DOM элемент подходящий под переданный CSS селектор. Эта функция алиас для document.querySelector() .
В седеющем примере возвращается ссылка на первый элемент imgв странице:
Клик правой кнопки мыши по результату и выберите “Reveal in Elements Panel”, чтобы найти элемент в DOM или “Scroll in to View”, чтобы перейти к этому элементу на странице.
Следующий пример, возвращает ссылку на выбранный элемент и выводит значение его src атрибута:
Эта функция также принимает второй параметр, startNode, элемент или узел(node) в котором нужно искать элемент. По умолчанию это параметр равен document .
В следующем примере возвращается ссылка на первый элемент выбранного, в данный момент, узла и выводит его src :
Если вы используете такую библиотеку как Jquery, которая использует знак $ , эта функциональность переписывается и будет использоваться реализация библиотеки
$$(selector, [startNode])
$$(selector) возвращает массив всех элементов подходящих под CSS селектор. Эта команда эквивалента document.querySelectorAll() .
Следующий пример использует $$() для получения массива всех элементов на странице и выводит значение атрибута srcкаждого элемента:
var images = $$(‘img’);for (each in images) <
console.log(images[each].src);
>
$$() так же принимает параметр startNode и работает точно так же как и предыдущая функция.
Далее вы ведите измененную версию предыдущего примера, здесь мы используем $$() для получения массива элементов в переданном узле:
var images = $$(
‘img’,
document.querySelector(‘.devsite-header-background’)
);for (each in images) <
console.log(images[each].src);
>
Используйте Shift + Enter в консоле, чтобы перейти на новую строку без выполнения написанного
$x(path, [startNode])
$x(path) вернет массив DOM элементов которые соответствуют XPath выражению.
Разбираемся в WinAPI
Для кого эта статья
Эта статья адресована таким же, как и я новичкам в программировании на С++ которые по воле случая или по желанию решили изучать WinAPI.
Хочу сразу предупредить:
Я не претендую на звание гуру по C++ или WinAPI.
Я только учусь и хочу привести здесь несколько примеров и советов которые облегчают мне изучение функций и механизмов WinAPI.
В данной статье я предполагаю что вы уже достаточно ознакомились с С++, что бы уметь создавать классы и перегружать для них различные операторы и что вы уже «прятали» какие-то свои механизмы в класс.
Создание и использование консоли
Для отладки Win32 приложения или просто для того что посмотреть как оно там всё внутри происходит я всегда пользуюсь консолью.
Так как вы создаете GUI приложение, а не консольное, то консоль не подключается. Для того что бы её вызвать в недрах интернета был найден вот этот код
if (AllocConsole())
<
int hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), 4);
*stdout = *(::_fdopen(hCrt, «w»));
::setvbuf(stdout, NULL, _IONBF, 0);
*stderr = *(::_fdopen(hCrt, «w»));
::setvbuf(stderr, NULL, _IONBF, 0);
std::ios::sync_with_stdio();
>
Для удобства советую обернуть его в функцию. Например:
void CreateConsole()
<
if (AllocConsole())
<
int hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), 4);
*stdout = *(::_fdopen(hCrt, «w»));
::setvbuf(stdout, NULL, _IONBF, 0);
*stderr = *(::_fdopen(hCrt, «w»));
::setvbuf(stderr, NULL, _IONBF, 0);
std::ios::sync_with_stdio();
>
Вызванная консоль работает только в режиме вывода и работает он также как и в консольных приложениях. Выводите информацию как и обычно — cout/wcout.
Для работоспособности данного кода необходимо включить в прект следующие файлы:
#include
#include #include
и включить пространство имен std в глобальное пространство имён:
using namespace std;
Конечно же, если вы не хотите этого делать, то просто допишите std:: ко всем сущностям которые в ней находятся.
Наследование объектов для вывода и арифм. операций
При создании и изучении самих «окошек» мне всегда требовалось выводить в консоль какое-нибудь значение.
Например:
Вы получаете размер клиентской области окна с помощью функции GetClientRect куда как параметр передается адрес объекта структуры RECT, что бы заполнить этот объект данными. Если вам нужно узнать размер полученной клиентский области вы просто можете вывести его в уже подключённую консоль
Но делать так каждый раз (особенно если вам часто приходиться делать что-то подобное) очень неудобно.
Здесь нам на помощь приходит наследование.
Создайте класс который открыто наследуется от структуры RECT и перегрузите оператор вывода class newrect:public RECT
<
public:
friend ostream& operator
Теперь просто выводите обьект с помощью cout/wcout:
И вам в удобном виде будет выводиться всё так, как вам требуется.
Так же вы можете сделать с любыми нужными вам операторами.
Например, если надо сравнивать или присваивать структуры (допустим тот же RECT или POINT) — перегрузите operator==() и operator=() соответственно.
Если хотите реализовать оператор меньше class BaseWindow
<
WNDCLASSEX _wcex;
TCHAR _className[30];
TCHAR _windowName[40];
HWND _hwnd;
bool _WindowCreation();
public:
BaseWindow(LPCTSTR windowName,HINSTANCE hInstance,DWORD style,UINT x,UINT y,UINT height,UINT width);
BaseWIndow(LPCTSTR windowName,HINSTANCE hInstance);
const HWND GetHWND()const
LPCTSTR GetWndName()const
>;
Один раз хорошенько продумав и написав такой класс вы облегчите себе жизнь и будете больше времени уделять обучению и оттачиванию навыков чем написанию одного и того же каждый раз. Тем более, я считаю это очень полезно — самому сделать такой класс и дополнять его по необходимости.