![]() |
TX Library Help – Version: 00173a, Revision: 171
PROJECT_BRIEF=
|
Классы | |
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. | |
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) |
Смена кодовой страницы консоли и локали стандартной библиотеки С++. | |
Переменные | |
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 . |
$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); }
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 funstions. Если не указано, то L"Russian_Russia.ACP". |
txSetLocale (866, "Russian_Russia.866", L"Russian_Russia.866");
const double txPI |
Число Пи
if (txPI == 1) txMessageBox ("Вы попали в другую Вселенную.", "Поздравляем", MB_ICONSTOP);