![]() |
TX Library Help – Version: 00173a, Revision: 175
|
Классы | |
| class | txAutoLock |
| Класс для автоматической блокировки и разблокировки критической секции. Подробнее... | |
Макросы | |
| #define | CALLOC(type, size) |
| Выделяет блок динамической памяти через calloc с автоматическим преобразованием типа указателя. | |
| #define | FREE(ptr) |
| Освобождает динамическую память и обнуляет указатель на нее. | |
| #define | __TX_FILELINE__ |
| Макрос, раскрывающийся в имя файла и номер строки файла, где он встретился. | |
| #define | __TX_FUNCTION__ |
| Имя текущей функции | |
| #define | MAX(a, b) |
| Возвращает максимальное из двух чисел | |
| #define | MIN(a, b) |
| Возвращает минимальное из двух чисел | |
| #define | ROUND(x) |
| Округляет число до целого | |
| #define | _TX_DESTROY_3D |
| Ну просто очень удобный макрос. | |
| #define | ZERO(type) |
| Обнулитель типов, не имеющих конструкторов | |
| #define | TX_ASSERT(cond) |
| Замена стандартного макроса assert(), с выдачей сообщения через txMessageBox(), консоль и OutputDebugString(). | |
| #define | asserted |
| Выводит диагностическое сообщение в случае нулевого или ложного результата. | |
| #define | verify |
| Выполняет команду (вычисляет выражение) и проверяет результат. | |
| #define | TX_ERROR(msg) |
| Выводит развернутое диагностическое сообщение. | |
| #define | TX_DEBUG_ERROR(...) |
| Выводит развернутое диагностическое сообщение в отладочном режиме. | |
| #define | txStackBackTrace() |
| Распечатывает текущий стек вызовов функций в консоли. | |
| #define | TX_DLLIMPORT(required, libName, retValType, funcName, funcParams, callType) |
| Импортирует функцию из динамической библиотеки @с .dll. | |
| #define | txGDI(command, dc) |
| Вызывает функции Win32 GDI с автоматической блокировкой и разблокировкой. | |
Функции | |
| void * | operator new (size_t size, int) |
| Выделяет блок динамической памяти через new с обнулением его содержимого перед вызовом конструктора. | |
| void * | operator new (size_t size, size_t items, int) |
| Выделяет блок динамической памяти через new[] с обнулением содержимого перед вызовом конструкторов. | |
| int | txMessageBox (const char text[]="Муаххаха! :)", const char header[]="TXLib сообщает", unsigned flags=MB_ICONINFORMATION|MB_OKCANCEL) |
| Выводит различные сообщения в окне с помощью функции MessageBox. | |
| HRESULT | txSetProgress (double percent, unsigned type=2, HWND wnd=NULL) |
| Устанавливает Progress bar окна на панели задач. Весело и вкусно Красиво и иногда полезно. | |
| int | random (int range) tx_deprecated |
| Генератор случайных чисел | |
| double | random (double left, double right) tx_nodiscard tx_deprecated |
| Генератор случайных чисел | |
| template<typename Tx , typename Ta , typename Tb > | |
| bool | In (Tx x, Ta a, Tb b) tx_nodiscard tx_deprecated |
| Проверка, находится ли параметр х внутри замкнутого интервала [a; b]. | |
| template<typename T > | |
| T | max (const T &a, const T &b) |
| Функциональная версия макроса MAX. | |
| template<typename T > | |
| T | min (const T &a, const T &b) |
| Функциональная версия макроса MIN. | |
| uint64_t | txHash (const void *buffer, size_t size) tx_nodiscard |
| Хеширует буфер по алгоритму DJB2 (GNU Hash) | |
| void | tx_fpreset () |
| Переинициализирует математический сопроцессор | |
| double | txSqr (double x) |
| Очень удобное возведение числа в квадрат. | |
| void | txDump (const void *address, const char name[]="_txDump()", bool pause=true) |
| Распечатывает дамп области памяти в консоли. | |
| int | txRegQuery (const char *keyName, const char *valueName, void *value, size_t szValue) |
| Читает информацию из реестра Windows. | |
| int | txSetLocale (int codepage=_TX_CODEPAGE, const char locale[]=_TX_LOCALE, const wchar_t wLocale[]=_TX_WLOCALE) |
| Меняет кодовую страницу консоли и локаль стандартной библиотеки С++. | |
| int | txPause (const char *message,...) tx_printfy(1) |
| Приостанавливает программу до нажатия на любую клавишу. | |
Переменные | |
| const double | txPI |
| Число Пи | |
Вспомогательные функции | |
| int | txUpdateWindow (int update=true) |
| Разрешает или запрещает автоматическое обновление изображения в окне. | |
| bool | txSelectObject (HGDIOBJ obj, HDC dc=txDC()) |
| Устанавливает текущий активный объект GDI. | |
| bool | txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture () |
| Делает нечто иногда удобное. См. название функции. | |
Другие полезные функции, не связанные с рисованием | |
| bool | txPlaySound (const char filename[]=NULL, DWORD mode=SND_ASYNC) |
| Воспроизводит звуковой файл. | |
| int | txSpeak (const char *text,...) tx_printfy(1) |
| Читает мысли текст вслух. | |
| intptr_t | txPlayVideo (int x, int y, int width, int height, const char fileName[], double zoom=0, double gain=1, HWND wnd=txWindow()) |
| Проигрывает видео. | |
| intptr_t | txPlayVideo (const char fileName[], double zoom=0, double gain=1, HWND wnd=txWindow()) |
| Проигрывает видео. | |
| bool | txGetAsyncKeyState (int key) |
| Проверяет, нажата ли указанная клавиша. | |
| bool | txNotifyIcon (unsigned flags, const char title[], const char format[],...) tx_printfy(3) |
| Выводит всплывающее сообщение в системном трее. | |
| int | txOutputDebugPrintf (const char format[],...) tx_printfy(1) |
| Выводит сообщение в отладчике. | |
| template<typename T , typename... ArgsT> | |
| int | txPrintf (const char *format, ArgsT...args) |
| Добрый дядюшка Принтф. Теперь шаблонный. | |
| template<typename T , typename... ArgsT> | |
| int | txPrintf (std::ostringstream &stream, const char *format, ArgsT...args) |
| Печатает в строковый поток вывода, как sprintf(). | |
| template<typename T , typename... ArgsT> | |
| int | txPrintf (char buffer[], size_t size, const char *format, ArgsT...args) |
| Печатает в строковый буфер, как sprintf(). | |
| template<typename... ArgsT> | |
| std::string | txFormat (const char *format, ArgsT...args) |
| Форматирует строку, как sprintf(). | |
| #define | sizearr(arr) |
| Вычисление размера массива в элементах | |
| bool | In (const POINT &pt, const RECT &rect) tx_nodiscard tx_deprecated |
| Проверка, находится ли точка pt внутри прямоугольника rect. | |
| #define | meow ; |
| Еще парочка макросов. | |
| #define | tx_auto_func(func) |
Автоматический вызов функции при завершении другой функции (аналог __finally) | |
| std::string | txDemangle (const char *mangledName) |
| Преобразует декорированное имя С++ в название типа. | |
| #define | _ |
| Макрос, позволяющий передать переменное число параметров в какой-либо другой макрос. | |
| #define | TX_COMMA , |
| Синоним макроса _ (символ подчеркивания) | |
Очень служебные функции | |
| WNDPROC | txSetWindowsHook (WNDPROC wndProc=NULL) |
| Устанавливает альтернативную функцию обработки оконных сообщений Windows (оконную функцию) для окна TXLib. | |
| bool | txLock (bool wait=true) |
| Блокирует холст (контекст рисования). | |
| bool | txUnlock () |
| Разблокирует холст | |
Макросы для построения статической карты сообщений (Message Map) | |
| #define | TX_BEGIN_MESSAGE_MAP() |
| Заголовок карты сообщений (Message Map). | |
| #define | TX_HANDLE(id) |
| Заголовок обработчика сообщения (Message handler) карты сообщений. | |
| #define | TX_COMMAND_MAP |
| Начало карты команд (Command map) в карте сообщений. | |
| #define | TX_END_MESSAGE_MAP |
| Завершитель карты сообщений. | |
Экспериментальные отладочные макросы | |
| #define | __TX_DEBUG_MACROS ("Группа отладочных $-макросов") |
| Отладочная печать переменной во время вычисления выражения или участка кода во время его выполнения. | |
| #define CALLOC | ( | type, | |
| size | |||
| ) |
Выделяет блок динамической памяти через calloc с автоматическим преобразованием типа указателя.
| type | Тип данных, размещаемый в памяти |
| size | Количество элементов типа type |
| #define FREE | ( | ptr | ) |
| #define __TX_FUNCTION__ |
| #define sizearr | ( | arr | ) |
Вычисление размера массива в элементах
| arr | Имя массива. |
Макрос sizearr() вычисляет размер массива в элементах, проверяя, можно ли его правильно вычислить при компиляции.
Макрос SIZEARR() просто делит размер всего массива в байтах на размер его элемента, получается размер массива в элементах.
Он не проверяет, можно ли его правильно вычислить, и при неправильном использовании может выдать неверный размер.
void test() { // Размер этого массива, хоть и не указан, но может быть автоматически определен // компилятором при компиляции программы. Он равен 4 (четыре структуры POINT). POINT coord[] = { {110, 110}, {120, 120}, {130, 110}, {140, 120} }; // Здесь размер массива известен при компиляции, т.к. он был определен тут же. for (int i = 0; i < sizearr (coord) - 1; i++) txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y); DrawLines1 (coord); // Попытка передать массив без передачи размера. DrawLines2 (coord, sizearr (coord)); // Правильная передача размера массива. DrawLines3 (coord); // В принципе, можно и так, но тут ВОДЯТСЯ ШАБЛОНЫ. } // Функции DrawLines1 и DrawLines2 определены так: void DrawLines1 (const POINT coord[]) { // Массивы в Си передаются как указатели на начало массива. Поэтому: // 1) sizearr здесь выдаст ошибку компиляции, и ее легко будет найти. // 2) SIZEARR здесь неверно посчитает размер, что намного хуже, чем ошибка компиляции, // т.к. он будет равен sizeof (POINT*) / sizeof (POINT) == 4/8 == 0, что станет // трудноуловимой логической ошибкой времени исполнения. for (int i = 0; i < sizearr (coord) - 1; i++) txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y); } void DrawLines2 (const POINT coord[], int n) { // Здесь размер приходит как параметр n, так что все просто. Вызывающая сторона (функция // test) правильно вычисляет его и передает функции DrawLines2, которая им пользуется. for (int i = 0; i < n - 1; i++) txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y); } // HIC SVNT TEMPLATES template <int size> void DrawLines3 (const POINT (&coord) [size]) { for (int i = 0; i < size - 1; i++) txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y); }
| #define MAX | ( | a, | |
| b | |||
| ) |
Возвращает максимальное из двух чисел
| a | Одно из чисел :) |
| b | Другое из чисел :) |
a и b могут вычисляться в нем два раза. Поэтому не используйте в нем побочных действий ++, --, += и т.п. Например, не пишите так: int m = MAX (++x, y += 2);if (MAX (3, 7) != 7) printf ("Your CPU is broken, throw it away.");
| #define MIN | ( | a, | |
| b | |||
| ) |
Возвращает минимальное из двух чисел
| a | Одно из чисел :) |
| b | Другое из чисел :) |
a и b могут вычисляться в нем два раза. Поэтому не используйте в нем побочных действий ++, --, += и т.п. Например, не пишите так: int m = MIN (x--, y /= 2);if (MIN (3, 7) != 3) printf ("Your CPU is still broken, throw it away twice.");
| #define ROUND | ( | x | ) |
Округляет число до целого
| x | Число. А вы как думали? |
long.double weight = 5.5; // 5.5 kilos is the weight of Maru the Cat in 2012. long Maru = ROUND (weight); // Should use ROUND() because Maru is so round. And long.
| #define _TX_DESTROY_3D |
Ну просто очень удобный макрос.
#define z 0 #undef. С <http://www.google.ru/search?q=%23undef>#undef ваша программа станет мягкой и шелковистой.)#define _TX_DESTROY_3D #include "TXLib.h" // А теперь попробуйте объявить переменную z для расчета 3-D координат x, y, z: int z = 0; // Да! TXLib уничтожает трехмерность! Очень круто. :=/
| #define meow ; |
Еще парочка макросов.
please увеличивает вероятность успешного выполнения кода*.
meow -- ...просто мяу :)
| #define ZERO | ( | type | ) |
Обнулитель типов, не имеющих конструкторов
| type | Имя типа. |
type, покомпонентно инициализированное по умолчанию (для встроенных типов -- нулем).void f (POINT p); ... POINT z = {}; f (z); // Так без ZERO f (ZERO (POINT)); // Так с ZERO
| #define tx_auto_func | ( | func | ) |
Автоматический вызов функции при завершении другой функции (аналог __finally)
| func | Тело автоматически вызываемой функции (фигурные скобки не обязательны). |
void some_func() { int x = 1; tx_auto_func ($(x)); // Will be printed at return FILE* f = fopen (__FILE__".o.txt", "w"); tx_auto_func (fclose (f)); // Will be closed at return fprintf (f, "start: x = %d\n", x); // Do some job x = 2; // Do some job }
| #define TX_ASSERT | ( | cond | ) |
Замена стандартного макроса assert(), с выдачей сообщения через txMessageBox(), консоль и OutputDebugString().
| cond | Условие для проверки. |
Если условие, проверяемое TX_ASSERT(), истинно, то макрос ничего не делает.
Если условие оказывается ложно, то выводится диагностическое сообщение и программа аварийно завершается.
cond может быть вычислено уже во время компиляции как ложное, компилятор может предупредить об этом (как о делении на 0). TX_ASSERT (0 <= i && i < ARRAY_SIZE); assert (0 <= i && i < ARRAY_SIZE); // То же самое, что и TX_ASSERT FILE* input = fopen ("a.txt", "r"); TX_ASSERT (input); assert (input); // То же самое, что и TX_ASSERT // Этот вызов fgets() НЕ будет выполнен в режиме Release: assert (fgets (str, sizeof (str) - 1, input)); // Здесь все будет правильно: bool ok = (fclose (input) == 0); TX_ASSERT (ok); assert (ok); // То же самое, что и TX_ASSERT
| #define asserted |
Выводит диагностическое сообщение в случае нулевого или ложного результата.
Суффиксная форма макроса assert(), не теряющая в режиме Release исполнения предиката.
FILE* input = fopen ("a.txt", "r"); assert (input); // Этот вызов fgets() будет выполнен в любом случае: fgets (str, sizeof (str) - 1, input) asserted; // Этот вызов fgets() НЕ будет выполнен в режиме Release: assert (fgets (str, sizeof (str) - 1, input)); (fclose (input) != 0) asserted;
| #define verify |
Выполняет команду (вычисляет выражение) и проверяет результат.
| expr | Команда (выражение). |
expr истинно, иначе 0.Если условие, проверяемое verify(), истинно, то макрос ничего не делает.
Если условие оказывается ложно, то выводится диагностическое сообщение и программа аварийно завершается.
| #define TX_ERROR | ( | msg | ) |
Выводит развернутое диагностическое сообщение.
| msg | Сообщение с произвольным количеством параметров в стиле функции printf(). |
TX_ERROR ("Не смог прочитать 'Войну и мир'. Отмазка %d: не нашел '%s'", reasonNum, fileName);
| #define TX_DEBUG_ERROR | ( | ... | ) |
Выводит развернутое диагностическое сообщение в отладочном режиме.
Описание см. в TX_ERROR.
TX_DEBUG_ERROR ("Так и не смог прочитать 'Войну и мир'. Отмазка %d: потерял '%s'", reasonNum, fileName);
| #define txStackBackTrace | ( | ) |
Распечатывает текущий стек вызовов функций в консоли.
g++ -- с помощью ключа командной строки -O0. Разные среды программирования позволяют задать эти ключи по-разному, например, в CodeBlocks через Главное меню -- Settings -- Compiler -- (Global Compiler Settings) -- (Compiler Settings) -- Other Options.void Recursion() // http://google.ru/search?q=%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F { txStackBackTrace(); printf ("Press any key...\n"); _getch(); Recursion(); }
| #define _ |
Макрос, позволяющий передать переменное число параметров в какой-либо другой макрос.
| #define TX_DLLIMPORT | ( | required, | |
| libName, | |||
| retValType, | |||
| funcName, | |||
| funcParams, | |||
| callType | |||
| ) |
Импортирует функцию из динамической библиотеки @с .dll.
Макрос создает указатель на функцию, пригодный для вызова так, как будто это была бы сама функция.
| required | (true/false) Обязательно ли требуется импортировать функцию. Если обязательно, то в случае отсутствия функции будет фатальная ошибка. |
| libName | (char*) Имя библиотеки, включая расширение (обычно .dll). |
| retValType | Тип возвращаемого значения импортируемой функции. |
| funcName | (char*) Имя импортируемой функции. |
| funcParams | Параметры импортируемой функции. |
| callType | Тип вызова импортируемой функции (для функций Windows - WINAPI). |
required равен false, и функция в библиотеке не найдена, или библиотека не загрузилась, то указатель на функцию будет NULL и при ее вызове программа упадет. Проверяйте, равен ли нулю указатель перед таким вызовом.namespace ComDlg32 { TX_DLLIMPORT (false, "ComDlg32.dll", bool, GetOpenFileNameA, (OPENFILENAMEA* ofnStruct), WINAPI); TX_DLLIMPORT (false, "ComDlg32.dll", bool, GetSaveFileNameA, (OPENFILENAMEA* ofnStruct), WINAPI); } int main() { char fileName[MAX_PATH] = ""; OPENFILENAME ofn = { sizeof (ofn), txWindow() }; // +-- Загадка Жака Фреско... на размышление дается 20 секунд // V ofn.lpstrTitle = "\xcd\xe5\x20\xea\xee\xef\xe8\xef\xe0\xf1\xf2\xfc\x2c\x20\xe0\x20\xf0\xe0\xe7\xe1\xe5\xf0\xe8" "\xf1\xfc\x20\xe8\x20\xf1\xe4\xe5\xeb\xe0\xe9\x20\xf4\xf3\xed\xea\xf6\xe8\xfe\x21\x21\x21"; ofn.lpstrFile = fileName; ofn.nMaxFile = sizeof (fileName); ofn.lpstrFilter = "C++ Files\0" "*.cpp\0" // ofn.nFilterIndex = 1. Please change it! "X-- Files\0" "*.xpp\0" // ofn.nFilterIndex = 2. Remove it if you didn't simply copied this code "All Files\0" "*.*\0"; // ofn.nFilterIndex = 3 ofn.nFilterIndex = 1; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; // ofn.FlagsEx = OFN_EX_NOPLACESBAR; bool oldPSW = _txProcessSystemWarnings; _txProcessSystemWarnings = false; // Just do it. (C) NAN - Not a Nike :) if (ComDlg32::GetOpenFileNameA) ComDlg32::GetOpenFileNameA (&ofn); // Весьма полезная функция, отображает диалог выбора файла. _txProcessSystemWarnings = oldPSW; // Just do it too. printf ("\n" "GetOpenFileName() returned: fileName = \"%s\"\n", fileName); }
| #define txGDI | ( | command, | |
| dc | |||
| ) |
Вызывает функции Win32 GDI с автоматической блокировкой и разблокировкой.
| command | Функция GDI (возможно, возвращающая значение). |
| dc | Дескриптор контекста рисования (холста), использующийся в вызове функции GDI (см. параметр command). |
| #define TX_BEGIN_MESSAGE_MAP | ( | ) |
Заголовок карты сообщений (Message Map).
virtual int dialogProc (HWND _wnd, UINT _msg, WPARAM _wParam, LPARAM _lParam) override { int _result = txDialog::dialogProc (_wnd, _msg, _wParam, _lParam); switch (_msg) {
Cм. реализацию функции txInputBox().
| #define TX_HANDLE | ( | id | ) |
Заголовок обработчика сообщения (Message handler) карты сообщений.
| id | Идентификатор сообщения. |
break; case (id):
Cм. реализацию функции txInputBox().
| #define TX_COMMAND_MAP |
Начало карты команд (Command map) в карте сообщений.
} // Конец switch (_msg) if (_msg == WM_COMMAND) switch (LOWORD (_wParam)) {
Cм. реализацию функции txInputBox().
| #define TX_END_MESSAGE_MAP |
Завершитель карты сообщений.
} // Конец switch (_msg) или switch (LOWORD (_wParam)) return FALSE; }
Cм. реализацию функции txInputBox().
| #define __TX_DEBUG_MACROS ("Группа отладочных $-макросов") |
Отладочная печать переменной во время вычисления выражения или участка кода во время его выполнения.
Сделай приятными твои круглые сутки отладки!
$ (var, [name]) | Печать имени и значения переменной или выражения var. [name] – необязательное примечание. |
$_(var, [name]) | То же, что и , но без новой строки. [name] – необязательное примечание. |
$x (var, [name]) | Печать имени и значения переменной или выражения var в 16-ричной системе счисления. [name] – необязательное примечание. |
$x_(var, [name]) | То же, что и $x(var), но без новой строки. [name] – необязательное примечание. |
$v (var, cond, [name]) | То же, что и , но различным цветом в зависимости от условия cond. [name] – необязательное примечание. |
$v_(var, cond, [name]) | То же, что и $v(var), но без новой строки. [name] – необязательное примечание. |
$do(code) | Печать строки кода, затем выполнение этого кода. |
$DO(code) | То же, что и $do(code), но с паузой (нажмите любую клавишу). |
$Do(code) | То же, что и $do(code), но с паузой (txMessageBox). |
$$$ (expr) | Печать выражения, его вычисление, печать и возврат значения. Если выражение содержит оператор "запятая", не взятый в скобки, необходимо окружать expr еще одной парой скобок. |
$$$_(expr) | То же, что и $$, но вторая печать идет без новой строки. |
$$$$ (code) | То же, что и $$, но для операторов или блоков кода (без возврата значения). |
$$$$_(code) | То же, что и $$$, но вторая печать идет без новой строки. |
$$ | Печать местоположения в коде. |
$$_ | Печать местоположения в коде (только имя функции и номер строки). |
$meow (msg) | То же, что и $$, но еще и печатает сообщение msg. |
$test (cond) | Печать результата теста различным цветом в зависимости от условия cond. |
$unittest (code, expected) | Печать результата юнит-теста code с ожидаемым результатом expected. |
$ptrHTML (html, ptr, [backColor]) | Печать указателя ptr в HTML-файл html цветом, зависящим от значения указателя, для HTML-логов. [backColor] – необязательный цвет фона, по умолчанию белый. |
$n | Перевод строки (печать '\n'). |
$nn | Пустая строка (печать '\n\n'). |
$t | Табуляция (печать '\t'). |
$d | Светло-серый цвет | $D | Темно-серый цвет | |
$b | Светло-синий цвет | $B | Темно-синий цвет | |
$g | Светло-зеленый цвет | $G | Темно-зеленый цвет | |
$c | Светло-бирюзовый цвет | $C | Темно-бирюзовый цвет | |
$r | Светло-красный цвет | $R | Темно-красный цвет | |
$m | Светло-малиновый цвет | $M | Темно-малиновый цвет | |
$y | Желтый цвет | $Y | Темно-желтый цвет | |
$h | Белый цвет | $H | Прозрачный цвет |
$o | OK | Светло-зеленый на зеленом | $O | OK bold | Желтый на зеленом | ||
$i | Information | Светло-синий на синем | $I | Information bold | Желтый на синем | ||
$w | Warning | Светло-малиновый на малиновом | $W | Warning bold | Желтый на малиновом | ||
$e | Error | Светло-красный на красном | $E | Error bold | Желтый на красном | ||
$f | Fatal | Черный на светло-красном | $F | Fatal bold | Малиновый на светло-красном | ||
$l | Location | Черный на темно-сером | $L | Location bold | Светло-серый на темно-сером |
$T (cond) | Светло-зеленый или светло-красный, в зависимости от условия cond. |
$s | Запомнить атрибуты. При выходе из { блока кода } атрибуты восстанавливаются. |
$s* | Запомнить атрибуты и установить цвет (замените звездочку кодом цвета, см. выше). Пример: $sg - запомнить атрибуты и установить светло-зеленый цвет. |
Что такое юнит-тест? А вот что: www.google.com/search?q=Юнит-тестирование+C++. Это когда ошибки ищутся сами.
$g // green int x = 5; int y = $(x) + 1; $( x = $(y) + 2 ); int xx[] = { 10, 20, 30 }; $(xx); $r // red double xy = $( pow (x, y) ); $meow ("Computing hypothenuse...") double h = $$$(( $(x) = x*x, y = y*y, sqrt ($(x+y)) )); $$ $$P; $$$( txCreateWindow (800, 600) ); $d // default color $$$$( if ($(xy) < $(h)) { $sE return $(h); } ); // Save color, print h in error color, restore color $T (h < 10); $(h); // Print h again, but in success color (h < 10)... $T (h <= 10); $(h); // ...or error color (otherwize) $n // New line $Do (bool isPositive = (h > 0)); $test (isPositive); $n // Print a test result #ifndef _MSC_VER bool ok = ( $unittest (strlen ("abc"), 3) ); // Checks in unit-test style, thanks GCC #endif $unittest (strlen ("abc"), 3); // Checks in unit-test style, Microsoft compatible way. // No return result from $unittest here, sorry (: $$ $$p;
| void* operator new | ( | size_t | size, |
| int | |||
| ) |
| void* operator new | ( | size_t | size, |
| size_t | items, | ||
| int | |||
| ) |
Выделяет блок динамической памяти через new[] с обнулением содержимого перед вызовом конструкторов.
| size | Размер элементов |
| items | Количество элементов массива |
char* str = new(0) char [100]; ... delete[] str;
| int txMessageBox | ( | const char | text[] = "Муаххаха! :)", |
| const char | header[] = "TXLib сообщает", |
||
| unsigned | flags = MB_ICONINFORMATION|MB_OKCANCEL |
||
| ) |
Выводит различные сообщения в окне с помощью функции MessageBox.
| text | Текст сообщения. В принципе, необязательно, но зачем вы тогда меня вызывали? |
| header | Заголовок сообщения. Необязательно. |
| flags | Флаги отображения сообщения. Необязательно. |
txMessageBox (text, header, flags) можно использовать стандартную функцию Win32 MessageBox (txWindow(), text, header, flags). Отличия txMessageBox в том, что она автоматически подставляет окно-родитель, и в том, что при выводе в окно строчки переводятся в формат UNICODE. Это важно лишь в том случае, когда в региональных настройках контрольной панели Windows неверно установлена кодовая страница для программ, не поддерживающих UNICODE. В остальных случаях нужды в txMessageBox нет.txMessageBox программу можно завершить, нажав клавиши клавиатуры Shift, Control и Alt одновременно с нажатием мышкой на кнопку окна [Отмена] или [Cancel]. Это полезно, если окно txMessageBox постоянно отображается в цикле и программу нельзя завершить нажатием на кнопку закрытия основного окна.if (txMessageBox ("Получилось?", "Прочти меня", MB_YESNO) == IDYES) { MessageBox (txWindow(), "Хватит и обычного MessageBox()", "Win32 сообщает", 0); } else txMessageBox ("Спасаем от кракозябр вместо русских букв, без регистрации и СМС.");
| HRESULT txSetProgress | ( | double | percent, |
| unsigned | type = 2, |
||
| HWND | wnd = NULL |
||
| ) |
Устанавливает Progress bar окна на панели задач. Весело и вкусно Красиво и иногда полезно.
| percent | Процент завершения операции, от 0 до 100, определяющий размер Progress bar'a на панели задач. |
| type | Тип Progress bar'a. задается одним из флагов Win32::TBPF_NORMAL, Win32::TBPF_ERROR, Win32::TBPF_PAUSED, Win32::TBPF_NOPROGRESS, Win32::TBPF_INDETERMINATE. Описание флагов смотрите в Интернете. Необязательно. Если не указано, то используется Win32::TBPF_NORMAL. |
| wnd | Окно для задания Progress bar'a. Необязательно. Если не указано, то используется txWindow(). |
(S_OK), то операция успешна.txSetProgress (146, Win32::TBPF_NORMAL); // 146%, or 100%, that is the question. // Whether 'tis nobler in the mind to suffer...
| int txUpdateWindow | ( | int | update = true | ) |
Разрешает или запрещает автоматическое обновление изображения в окне.
| update | Режим обновления (true -- разрешить, false -- запретить). Необязателен. Если не указан, то "разрешить". |
В отличие от txBegin() и txEnd(), которые поддерживают вложенные вызовы и работают как "скобки для замерзания картинки", txUpdateWindow() позволяет явно установить или снять блокировку автоматического обновления экрана.
Более полную информацию об автоматическом обновлении см. в функции txBegin(). См. также txEnd(), txRedrawWindow(), txSleep().
txUpdateWindow (false); ... txUpdateWindow();
| bool txSelectObject | ( | HGDIOBJ | obj, |
| HDC | dc = txDC() |
||
| ) |
Устанавливает текущий активный объект GDI.
| obj | Дескриптор объекта GDI. |
| dc | Холст (контекст рисования), в котором устанавливается текущий активный объект GDI. Необязателен. |
obj, уничтожается.HPEN pen = CreatePen (PS_DASH, 1, RGB (255, 128, 0)); txSelectObject (pen);
| bool txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture | ( | ) |
Делает нечто иногда удобное. См. название функции.
У этой функции есть синоним с простым понятным названием, поищите его в файле библиотеки, около определения этой функции. Или можно скопировать набрать это километровое имя и посмотреть, что получится.
int main() { txCreateWindow (800, 600); txSetTextAlign (TA_CENTER); txTextOut (txGetExtentX()/2, txGetExtentY()/2, "Press any key to exit!");
| bool txPlaySound | ( | const char | filename[] = NULL, |
| DWORD | mode = SND_ASYNC |
||
| ) |
Воспроизводит звуковой файл.
| filename | Имя звукового файла, включая расширение. Если не указано или NULL, то останавливает звук. |
| mode | Режим воспроизведения. Необязательно. Если не указан, то SND_ASYNC (см. ниже). |
SND_ASYNC | Звук проигрывается одновременно с работой программы. Чтобы отменить звучание, вызовите txPlaySound (NULL). |
SND_SYNC | Выполнение программы приостанавливается до окончания воспроизведения звука. |
SND_LOOP | Зацикливать звук при воспроизведении. Чтобы отменить звучание, вызовите txPlaySound (NULL). |
SND_NODEFAULT | Не использовать звук по умолчанию, если нельзя проиграть указанный звуковой файл. |
SND_NOSTOP | Если какой-либо звук уже проигрывается, не останавливать его для запуска указанного звука. |
SND_APPLICATION | Проигрывать звук, используя программу, зарегистрированную для данного типа звуковых файлов. |
txPlaySound ("tada.wav"); // So happy that this always exists
| int txSpeak | ( | const char * | text, |
| ... | |||
| ) |
Читает мысли текст вслух.
| text | Текст для внеклассного чтения, как для функции printf(). |
\a). Если -1, то текст не прочитался. :(Для использования этой функции укажите перед включением файла TXLib.h определите имя TX_USE_SPEAK командой #define TX_USE_SPEAK до строки с #include "TXLib.h" для того, чтобы TXLib задействовал библиотеку Microsoft Speech API (SAPI.h). См. пример использования ниже.
Текст читается голосом, установленным по умолчанию в Панели управления Windows. Если голос поддерживает русский язык (начиная с Windows 8.1), то можно использовать русские фразы. До Windows 8.1 они не проговариваются. Если голос читает плохо, или с акцентом, то смените его в Панели Управления Windows.
\v, то он еще и печатается на экране (сам символ \v не печатается). \a, то он проговаривается асинхронно: txSpeak() возвращается сразу после вызова, и чтение идет параллельно с работой программы. Без этой опции txSpeak() делает паузу в программе, ожидая конца чтения, и только потом возвращается. <, то он трактуется как формат SSML (см. ниже). \v и \a), то txSpeak() лучше скажет что-то более важное, чем просто молчание. :)SAPI.h из стандартной библиотеки Windows. Не на всех платформах он есть. Если этот файл не найден, то будет ошибка компиляции. < в начале сообщения (после опций \v и \a). В этом случае будьте осторожны с амперсандами &, кавычками и знаками "меньше" < и "больше" >, а также другими спецсимволами XML. Если вы не знаете, как задавать их в XML, то не используйте. Формату SSML нужно строго соответствовать, иначе программа упадет, как это принято у Microsoft. vsnprintf @ (vsprintf), эти функции сэкономят вам немало сил.#define TX_USE_SPEAK #include "TXLib.h" int main() { txSpeak ("TX Library is cool!"); txSpeak ("\vДобрый вечер, котики. Вы все мыши. Goog evening, kittens. You are all mices."); txSpeak ("<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='EN'>" // SSML format "Goog evening, kittens. You are all mices." "</speak>"); }
| intptr_t txPlayVideo | ( | int | x, |
| int | y, | ||
| int | width, | ||
| int | height, | ||
| const char | fileName[], | ||
| double | zoom = 0, |
||
| double | gain = 1, |
||
| HWND | wnd = txWindow() |
||
| ) |
Проигрывает видео.
| x | X-координата верхнего левого угла видео. См. предупреждение ниже. |
| y | Y-координата верхнего левого угла видео. См. предупреждение ниже. |
| width | Ширина видео. Если 0, то равно ширине окна. Также см. предупреждение ниже. |
| height | Высота видео. Если 0, то равно высоте окна. Также см. предупреждение ниже. |
| fileName | Имя видеофайла (включая расширение) или любого другого источника, с которым работает VideoLAN (rtsp://, http:// и т.д.). Если имя -- пустая строка (""), то проводится только проверка на наличие видеопроигрывателя. |
| zoom | Масштаб изображения. Необязателен. Если не указан, то равен 0 (Автомасштабирование). |
| gain | Громкость звука, от 0 до 8 (800%). Необязательна. Если не указана, то равна 1 (100%). |
| wnd | Окно, в котором воспроизводится видео. Необязательно. Если не указано, то используется окно TXLib. |
\a). Если меньше или равно 0, то видео не запустилось. :( См. коды ошибок ниже. \a, то возвращаемое значение -- дескриптор (HWND) окна видеопотока (см. "Асинхронное воспроизведение").INT_MIN | Не найден видеопроигрыватель. |
INT_MIN+1 | Не найден видеофайл. |
INT_MIN+2 | Внутренняя ошибка регистрации класса окна видеопотока. |
INT_MIN+3 | Внутренняя ошибка создания окна видеопотока. |
INT_MIN+4 | Внутренняя ошибка запуска VideoLAN. |
| Другие отрицательные значения | Код завершения процесса VideoLAN с обратным знаком. |
fileName самым первым символом поставить символ \a, то файл будет воспроизводиться асинхронно: txPlayVideo() возвратится сразу после вызова, а воспроизведение видео пойдет параллельно с работой программы. Само имя файла на диске менять не надо. Воспроизведение завершится, когда закончится видеофайл, или когда будет закрыто окно TXLib. См. пример использования. txPlayVideo (NULL).(wnd) указано не окно TXLib, а какое-либо другое, то координаты видео x, y и его размеры width, height игнорируются. В этом случае видеопоток будет занимать всю клиентскую область окна, указанного параметром wnd. См. пример использования.VideoLAN (vlc.exe) версии 3.0 или новее. Ее можно скачать с официального сайта VideoLAN.org. Без установки VideoLAN видео воспроизводиться не будет и выведется сообщение об ошибке. (vlc.exe) все равно не найдена и выводится сообщение об этой ошибке, то установите не 64-битную версию VideoLAN, а 32-битную (x86).// Кот Мару, 24 000 000+ просмотров. А ты чего добился в жизни? :) #define MARU_ON_YOUTUBE "http://ded32.net.ru/www.youtube.com-watch-z_AbfPXTKms" // Cached from www.youtube.com/watch/z_AbfPXTKms int main() // Because Google prevents direct playing from Youtube { txCreateWindow (800, 500); txSetFillColor (TX_BLUE); txClear(); txDrawText (0, 0, txGetExtentX(), txGetExtentY(), "Press ESC to stop!"); txSleep(); if (txPlayVideo ("") <= 0) return TX_ERROR ("А чего вы хотели? VideoLAN не найден..."), 1; txPlayVideo ("\a" MARU_ON_YOUTUBE); txPlayVideo (580, 330, 200, 150, MARU_ON_YOUTUBE, 0, 0); // Для тех, кто [добился] дождался... system ("cmd.exe /c start /min notepad.exe"); double dt = 0.04 / (txQueryPerformance() + 1); HWND notepad = FindWindow ("Notepad", NULL); if (!notepad) return 1; txPlayVideo ("\a" MARU_ON_YOUTUBE, 0, 1, notepad); HWND wnd = (HWND) txPlayVideo (0, 330, 200, 150, "\a" MARU_ON_YOUTUBE, 0, 0); for (double t = 0; !GetAsyncKeyState (VK_ESCAPE); t += dt) { static const POINT cent = { GetSystemMetrics (SM_CXSCREEN) / 2, GetSystemMetrics (SM_CYSCREEN) / 2 }; static const POINT size = { 500, 400 }; MoveWindow (notepad, cent.x + ROUND (cent.y/2 * cos (t)) - size.x/2, cent.y - ROUND (cent.y/2 * sin (t)) - size.y/2, size.x, size.y, false); ShowWindow (notepad, SW_RESTORE); MoveWindow (wnd, ROUND (t*100) % 1000 - 200, 330, 200, 150, false); Sleep (20); } }
| intptr_t txPlayVideo | ( | const char | fileName[], |
| double | zoom = 0, |
||
| double | gain = 1, |
||
| HWND | wnd = txWindow() |
||
| ) |
Проигрывает видео.
| fileName | Имя видеофайла (включая расширение) или любого другого источника, с которым работает VideoLAN (rtsp://, http:// и т.д.). Если имя -- пустая строка (""), то проводится проверка на наличие видеопроигрывателя. |
| zoom | Масштаб изображения. Необязателен. Если не указан, то равен 0 (Автомасштабирование). |
| gain | Громкость звука, от 0 до 8 (800%). Необязательна. Если не указана, то равна 1 (100%). |
| wnd | Окно, в котором воспроизводится видео. Необязательно. Если не указано, то используется окно TXLib. |
См. описание в функции txPlayVideo() выше.
| bool txGetAsyncKeyState | ( | int | key | ) |
Проверяет, нажата ли указанная клавиша.
| key | Код (номер) клавиши, как правило, заданный константой (VK_SPACE, VK_LEFT, 'W' и т.п.) |
void PlayBall(); int main() { txCreateWindow (800, 600); PlayBall(); } void PlayBall() { int x = 100, y = 100; int vx = 5, vy = 7; int ax = 0, ay = 1; int dt = 1; txSetColor (TX_LIGHTGREEN); txSetFillColor (TX_GREEN); while (!txGetAsyncKeyState (VK_ESCAPE)) // Погуглите любой код VK_..., { // и найдете их все txCircle (x, y, 20); vx += ax * dt; // First velocity, then position: this gives more precision vy += ay * dt; // See: http://en.wikipedia.org/wiki/Backward_Euler_method x += vx * dt; y += vy * dt; if (x > 800) { vx = -vx; x = 800; } // = 800 is not the precise solution. Can you make it better? if (x < 0) { vx = -vx; x = 0; } if (y > 600) { vy = -vy; y = 600; } if (y < 0) { vy = -vy; y = 0; } if (txGetAsyncKeyState (VK_LEFT)) vx--; if (txGetAsyncKeyState (VK_RIGHT)) vx++; if (txGetAsyncKeyState (VK_UP)) vy--; if (txGetAsyncKeyState (VK_DOWN)) vy++; if (txGetAsyncKeyState (VK_SPACE)) vx = vy = 0; if (txGetAsyncKeyState ('M')) printf ("Meow "); txSleep (20); } }
| bool txNotifyIcon | ( | unsigned | flags, |
| const char | title[], | ||
| const char | format[], | ||
| ... | |||
| ) |
Выводит всплывающее сообщение в системном трее.
| flags | Флаги сообщения. |
| title | Заголовок сообщения. |
| format | Строка для печати, как в printf(). |
NIIF_INFO | Информация |
NIIF_WARNING | Предупреждение |
NIIF_ERROR | Сообщение об ошибке |
Функция формирует сообщение по правилам printf() и выводит во всплывающем окне.
(_WIN32_IE) была задана не ниже 0x0500. Для этого надо либо включить TXLib.h вместо windows.h или перед ним. Либо надо самостоятельно определить (#define) эту константу. shell32.dll и comctl32.dll), которые влияют на функциональность системы независимо от использования браузера). Сам Internet Explorer в отображении сообщения не участвует.int hours = 3, minutes = 10; const char station[] = "Юму"; ... txNotifyIcon (NIIF_INFO, "Уважаемые пассажиры", "Поезд на %s отправляется в %d:%d.", station, hours, minutes);
| int txOutputDebugPrintf | ( | const char | format[], |
| ... | |||
| ) |
Выводит сообщение в отладчике.
| format | Строка для печати, как в printf(). |
Функция формирует сообщение по правилам printf() и передает его в OutputDebugString(). Ее вывод можно перехватить отладчиком или утилитами-логгерами, например, DbgView. Если этого не сделать, и не задать первый символ '\a' (см. ниже), то о сообщении никто не узнает. :(
'\a', то сообщение также дублируется txMessageBox().'\f', то сообщение также дублируется printf().int x = 7; ... txOutputDebugPrintf ("Никто не узнает, что %d.\n", x);
| int txPrintf | ( | const char * | format, |
| ArgsT... | args | ||
| ) |
Добрый дядюшка Принтф. Теперь шаблонный.
| format | Строка для печати, все как в вашем любимом printf(). |
| args | Значения для печати. |
Функция работает аналогично printf(). Однако, в силу применения сноубордических вариадических шаблонов, она типобезопасна – сама определяет тип печатаемых аргументов и подставляет нужные символы преобразования типов. Допускается применение универсального символа типа %$ (или %?) вместо других символов типов, таких как d, i, c, s, p, g и других.
txPrintf() позволяет распечатывать типы, не встроенные в язык С++: строки С++ (std::string), некоторые типы Win32 (например, POINT) и ваши собственные типы. Для того, чтобы ваши типы могли печататься, надо определить пользовательский оператор вывода в поток STL. Вот, например, как определен оператор вывода для структуры POINT:
std::ostream& operator << (std::ostream& stream, const POINT& point) { stream << "{ x: " << point.x << ", y: " << point.y << " }"; return stream; }
Вы можете определить свой оператор вывода аналогично.
На самом деле функция txPrintf() – это обертка над операторами потокового вывода STL: operator <<. Чудес не бывает, и в любом случае вывод пользовательских типов и автоматический подбор преобразований так или иначе был бы основан на семействе перегруженных функций. Вместо того, чтобы создавать такое семейство с нуля, TXLib использует уже существующий оператор <<, уже перегруженный для всех стандартных типов, и про который все хорошо знают.
*, %.* или *.*), их нужно оборачивать в конструкции width() и precision() с помощью соответствующих функций. См. пример ниже. width_t width (int) – Функция, оборачивающая спецификатор ширины в тип enum width_t.precision_t precision (int) – Функция, оборачивающая спецификатор точности в тип enum precision_t.(std::ostream), во-вторых, вывод сначала идет в строку (через поток std::ostringstream), и только потом печатается. TXLib – делайте сами.Идея реализации взята у признанного демона современного С++ (Alexandrescu A., "Variadic Templates are Funadic", Going Native 2012, Redmond, WA, USA, https://www.youtube.com/watch?v=dD57tJjkumE, краткий обзор докладов см. https://habr.com/ru/post/139064).
Есть также макрос TX_PRINTF (format, ...), который проверяет аргументы согласно спецификации стандартной функции printf() и потом вызывает txPrintf(). Но он отвергает c %$ (%?), требует точного соответствия символов преобразований типов и не позволяет передавать типы, не встроенные изначально в язык С++ (структурные и классовые типы). Используйте его, если в дальнейшем вы планируете перейти на обычный printf().
-std=c++11 или выше, Microsoft Visual Studio 2013 или выше). Используйте макрос _TX_CPP11, который определен, если компилятор поддерживает стандарт C++11.// +--+--+---+---+----+-----+---+--+ // |2 |3 | 4 | 5 | 6 | 7 | 8 | | // +--+--+---+---+----+-----+---+--+ txPrintf ("|%$|%s|%5s|%*d|%.*f|%*.*$|%*$|%%|\n", // Arg#1 // | | | | | | | | | // +--+--+---+---+----+-----+---+--+ 12, // Arg#2 "Cats power!", // Arg#3 std::string ("meow"), // Arg#4 width (10), 56, // Arg#5 precision (3), 3.141592653, // Arg#6 width (15), precision (6), 2.718281828, // Arg#7 width (20), POINT { 10, 20 }); // Arg#8
| int txPrintf | ( | std::ostringstream & | stream, |
| const char * | format, | ||
| ArgsT... | args | ||
| ) |
Печатает в строковый поток вывода, как sprintf().
| format | Строка, как в sprintf(). |
| stream | Строковый поток вывода. |
| args | Значения для печати. |
-std=c++11 или выше, MSVC 2013 или выше). Используйте макрос _TX_CPP11, который определен, если компилятор поддерживает стандарт C++11.| int txPrintf | ( | char | buffer[], |
| size_t | size, | ||
| const char * | format, | ||
| ArgsT... | args | ||
| ) |
Печатает в строковый буфер, как sprintf().
| format | Строка, как в sprintf(). |
| buffer | Буфер для вывода. |
| size | Длина буфера вывода. |
| args | Значения для печати. |
-std=c++11 или выше, MSVC 2013 или выше). Используйте макрос _TX_CPP11, который определен, если компилятор поддерживает стандарт C++11.| std::string txFormat | ( | const char * | format, |
| ArgsT... | args | ||
| ) |
Форматирует строку, как sprintf().
| format | Строка, как в sprintf(). |
| args | Значения для печати. |
std::string.-std=c++11 или выше, MSVC 2013 или выше). Используйте макрос _TX_CPP11, который определен, если компилятор поддерживает стандарт C++11.| int random | ( | int | range | ) |
Генератор случайных чисел
| range | Правая граница диапазона (не включая саму границу). |
Вы еще помните, что означают разные скобочки в обозначении интервалов? :)
char message[100] = "Maybe..."; sprintf (message, "You SUDDENLY got %d bucks now. But note that tax rate is $%d.", random (100), 100); txMessageBox (message, "Lottery");
| double random | ( | double | left, |
| double | right | ||
| ) |
Генератор случайных чисел
| left | Левая граница диапазона (включая саму границу). |
| right | Правая граница диапазона (включая саму границу). |
Вы все еще помните, что означают разные скобочки в обозначении интервалов? :)
int money = random (-100, +100); if (money < 0) { char message[100] = "Maybe..."; sprintf ("Проиграли в лотерею? Отдайте долг в %d рублей", -money); txMessageBox (message, "Быстро!"); }
| bool In | ( | Tx | x, |
| Ta | a, | ||
| Tb | b | ||
| ) |
Проверка, находится ли параметр х внутри замкнутого интервала [a; b].
| x | Проверяемый параметр. |
| a | Левая граница (включительно). |
| b | Правая граница (включительно). |
a и просто b. Так как a - это минимальное значение, лучше бы назвать этот параметр min или как-либо еще, но осмысленно. Пусть математики и любят короткие обозначения, но мы будем любить осмысленные - потому что мы круче. :)) На самом деле это потому, что математики много пишут рукой, и писать длинные имена им сложно, а программисты набирают текст в редакторе, где это делать проще. Не будем обижать математиков, они крутые. MLM - Math Lives Matter! :) while (txMouseButtons() != 1) { if (In (txMouseX(), 110, 120)) txTextOut (100, 100, "Meet the wall!"); txSleep (0); }
| bool In | ( | const POINT & | pt, |
| const RECT & | rect | ||
| ) |
Проверка, находится ли точка pt внутри прямоугольника rect.
| pt | Проверяемая точка в виде POINT {x, y} . |
| rect | Прямоугольник в виде RECT {left, top, right, bottom} . |
Удобно для реализации экранных кнопок, нажимаемых курсором мыши.
RECT button = { 100, 100, 150, 120 };
txSetFillColor (TX_LIGHTGRAY);
txRectangle (button.left, button.top, button.right, button.bottom);
txSetTextAlign();
txSetFillColor (TX_WHITE);
txTextOut (125, 115, "Cookie");
for (;;)
{
if (In (txMousePos(), button))
{
txSetFillColor (TX_TRANSPARENT);
txRectangle (button.left, button.top, button.right, button.bottom);
if (txMouseButtons())
{
txSetFillColor (TX_DARKGRAY);
txRectangle (button.left, button.top, button.right, button.bottom);
txSetFillColor (TX_WHITE);
txTextOut (125, 115, "You got cookie");
break;
}
}
txSleep (0);
}
| uint64_t txHash | ( | const void * | buffer, |
| size_t | size | ||
| ) |
Хеширует буфер по алгоритму DJB2 (GNU Hash)
| buffer | Буфер для хеширования |
| size | Размер буфера |
char str[1024] = ""; printf ("Enter string to hash: "); fgets (str, sizeof (str), stdin); printf ("DJB2 hash is: 0x%llX\n", txHash (str), strlen (str));
| void tx_fpreset | ( | ) |
Переинициализирует математический сопроцессор
Сбрасывает состояние математического сопроцессора, вызывая _fpreset() и разрешая генерацию исключений сопроцессора для неверного результата (_EM_INVALID), денормализации (_EM_DENORMAL), деления на ноль (_EM_ZERODIVIDE), переполнения (_EM_OVERFLOW) и антипереполнения (_EM_UNDERFLOW). Обычный вызов _fpreset() эти исключения маскирует, в результате чего вычислительные ошибки могут оказаться незамеченными.
Если вы хотите замаскировать эти исключения, вызывайте обычный _fpreset(), и затем проверяйте результат вычислений на достоверность хотя бы с помощью std::isfinite (x).
tx_fpreset();
| double txSqr | ( | double | x | ) |
Очень удобное возведение числа в квадрат.
| x | Число для возведения в него. (Кого? (Who?)) |
printf ("\n" "Радиус\t\t" "Площадь круга\n\n"); for (double r = 100; r > 0; r--) { printf ("%6.2lf...", r); double square = M_PI * txSqr (r); // Надолго запомним эту площадь! printf ("\b\b\b \t"); printf ("%-.2lf\n", square); }
| void txDump | ( | const void * | address, |
| const char | name[] = "_txDump()", |
||
| bool | pause = true |
||
| ) |
Распечатывает дамп области памяти в консоли.
| address | Адрес начала распечатки. |
| pause | Делать ли паузу в конце распечатки. Необязательно. |
| name | Название распечатки (усекается до 8 символов). Необязательно. |
| std::string txDemangle | ( | const char * | mangledName | ) |
Преобразует декорированное имя С++ в название типа.
| mangledName | Декорированное (mangled) имя. |
Что такое декорирование имен (name mangling) см. здесь.
char*, вы должны сами освободить память, занимаемую строкой, с помощью вызова free(), иначе будет утечка памяти.auto type = txDemangle (typeid (std::string) .name()); std::cout << "The real type of std::string is: " << type << ", muahhaha! :)\n"; std::cout << "Call is shorter, but result is the same: " << txTypename (std::string) << ", muahhaha, too.\n";
| int txRegQuery | ( | const char * | keyName, |
| const char * | valueName, | ||
| void * | value, | ||
| size_t | szValue | ||
| ) |
Читает информацию из реестра Windows.
| keyName | Имя ключа реестра (см. ниже) |
| valueName | Имя параметра ключа |
| value | Буфер, в который записывается значение |
| szValue | Размер буфера |
keyName обязательно должно начинаться c имени или обозначения одного из разделов:| Обозначение | Ключ реестра |
HKLM | HKEY_LOCAL_MACHINE |
HKCU | HKEY_CURRENT_USER |
HKCR | HKEY_CLASSES_ROOT |
HKU | HKEY_USERS |
HKCC | HKEY_CURRENT_CONFIG |
char path[MAX_PATH] = "(not installed)"; txRegQuery ("HKCU\\Software\\TX Library", "ProductDir", path, sizeof (path)); printf ("TX Library is installed in: \"%s\"\n", path);
| WNDPROC txSetWindowsHook | ( | WNDPROC | wndProc = NULL | ) |
Устанавливает альтернативную функцию обработки оконных сообщений Windows (оконную функцию) для окна TXLib.
| wndProc | Новая оконная функция окна TXLib. Если не указана или NULL, то текущая альтернативная оконная функция удаляется и устанавливается стандартная. |
Используйте эту функцию, чтобы самому обрабатывать сообщения Windows, например, сообщения от колесика Мыши. См. примеры такой обработки в примере использования ниже.
Заданная оконная функция wndProc будет вызываться до обработки события средствами TXLib. Она должна быть функцией со следующим прототипом:
LRESULT CALLBACK NewWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam);
WM_CLOSE.WNDPROC OldWndProc = (WNDPROC) SetWindowLongPtr (txWindow(), GWL_WNDPROC, (LONG_PTR) NewWndProc);
LRESULT CALLBACK MyWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam);
void SetColors (COLORREF lineColor, COLORREF fillColor, int op);
void DrawCursor (POINT pos, int size);
void DrawShoot (POINT pos, int size);
int main()
{
_txWindowStyle |= WS_THICKFRAME;
txCreateWindow (GetSystemMetrics (SM_CXSCREEN) / 4, GetSystemMetrics (SM_CYSCREEN) / 4);
txSetWindowsHook (MyWndProc);
POINT sz = txGetExtent();
txSelectFont ("Lucida Console", 30, 15);
txDrawText (0, 0, sz.x, sz.y, "MOV txWindow, eax [please]");
txSelectFont ("Lucida Console", 15, 7.5);
txDrawText (0, sz.y/2, sz.x, sz.y, "(Info for the cats: NO MOUSE HERE)");
return 0;
}
LRESULT CALLBACK MyWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam)
{
static bool wheelMsg = false;
static POINT pos = {-10, -10};
const int size = 20;
if (message == WM_MOUSEMOVE)
{
DrawCursor (pos, size);
DrawCursor (pos = {LOWORD (lParam), HIWORD (lParam)}, size);
txUpdateWindow();
}
if (message == WM_LBUTTONDOWN)
{
DrawCursor (pos, size);
DrawShoot (pos, size);
DrawCursor (pos, size);
txUpdateWindow();
txPlaySound ("C:\\Windows\\Media\\ir_begin.wav");
}
if (message == WM_MOUSEWHEEL)
{
int wheel = (short) HIWORD (wParam) / WHEEL_DELTA;
RECT rect = {}; GetWindowRect (window, &rect);
POINT sz = { rect.right - rect.left, rect.bottom - rect.top };
wheelMsg = true;
MoveWindow (window, rect.left - wheel, rect.top - wheel, sz.x + wheel*2, sz.y + wheel*2, true);
wheelMsg = false;
}
if (message == WM_MOVE && !wheelMsg)
{
txMessageBox (" I like to MOVe it, MOVe it", "TXLib 2 Real", MB_ICONINFORMATION);
wheelMsg = false;
}
if (message == WM_SETCURSOR && LOWORD (lParam) == HTCLIENT)
{
SetCursor (NULL); // Hide the mouse cursor
return true; // Не продолжать обработку сообщения средствами TXLib
}
static int i = 0;
if (i++ % 15 == 0)
{
char str[2] = {"-\\|/" [i/15 % 4]}; // Прропппеллллерррр
SetWindowText (txWindow(), str);
}
return false; // Продолжить обработку сообщения средствами TXLib
}
void DrawCursor (POINT pos, int size)
{
SetColors (TX_YELLOW, TX_TRANSPARENT, R2_XORPEN);
txCircle (pos.x, pos.y, size/2);
txLine (pos.x-size, pos.y, pos.x+size, pos.y);
txLine (pos.x, pos.y-size, pos.x, pos.y+size);
Win32::SetROP2 (txDC(), R2_COPYPEN);
}
void DrawShoot (POINT pos, int size)
{
SetColors (RGB (255, 64, 0), RGB (255, 64, 0), R2_COPYPEN);
for (int i = 0; i < 5; i++)
txCircle (pos.x + rand() % (size*2) - size,
pos.y + rand() % (size*2) - size, rand() % (size/2) + size/2);
}
void SetColors (COLORREF lineColor, COLORREF fillColor, int op)
{
txSetColor (lineColor);
txSetFillColor (fillColor);
Win32::SetROP2 (txDC(), op);
}
| bool txLock | ( | bool | wait = true | ) |
Блокирует холст (контекст рисования).
| wait | Ожидать конца перерисовки окна вспомогательным потоком. Если не указано, то "ожидать". |
Перед вызовом любых функций Win32 GDI необходимо заблокировать холст функцией txLock() и затем разблокировать с помощью txUnlock(). Это связано с тем, что обновление содержимого окна (для тех, кто знает Win32: обработка сообщения WM_PAINT) в библиотеке TXLib происходит в отдельном вспомогательном потоке. Надолго блокировать его нельзя -- при заблокированном потоке окно не обновляется.
txLock() использует EnterCriticalSection(), и физически приостанавливает поток, обновляющий окно, так что надолго блокировать нельзя. Иначе тормозится обработка оконных сообщений, окно перестает реагировать на действия пользователя и перерисовываться. Нельзя также вызывать txSleep() или Sleep() при заблокированном потоке.
txLock() / txUnlock() -- это низкоуровневый механизм. Он отличается от более простого высокоуровневого механизма txBegin() / txEnd() / txUpdateWindow(), который не приостанавливает поток, а просто отключает принудительное постоянное обновление окна.
| bool txUnlock | ( | ) |
| int txSetLocale | ( | int | codepage = _TX_CODEPAGE, |
| const char | locale[] = _TX_LOCALE, |
||
| const wchar_t | wLocale[] = _TX_WLOCALE |
||
| ) |
Меняет кодовую страницу консоли и локаль стандартной библиотеки С++.
| codepage | Номер новой кодовой страницы консоли. Если не указано, то 1251. |
| locale | Новая локаль (информация о языке) стандартной библиотеки С++. Если не указано, то "Russian" или "ru_RU.CP1251". |
| wLocale | Новая локаль стандартной библиотеки С++ для wide character functions. Если не указано, то L"Russian_Russia.ACP". |
txSetLocale (866, "Russian_Russia.866", L"Russian_Russia.866");
| int txPause | ( | const char * | message, |
| ... | |||
| ) |
Приостанавливает программу до нажатия на любую клавишу.
| message | Сообщение, выводимое в консоль через stderr, в формате printf(). Необязательно. |
txPause ("Привет от system (\"pause\");");
| const double txPI |
Число Пи
if (txPI == 1) txMessageBox ("Вы попали в другую Вселенную.", "Поздравляем", MB_ICONSTOP);