TX Library Help – Version: 00173a, Revision: 173
 ALL  Windows graphics in a sandbox

Разное

Классы

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 >
max (const T &a, const T &b)
 Функциональная версия макроса MAX.
template<typename 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)
 Меняет кодовую страницу консоли и локаль стандартной библиотеки С++.
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
Возвращает:
Выделенная память
Примеры использования:
          char* str = CALLOC (char, 100);
          ...
          FREE (str);

См. определение в файле TXWave.h строка 462

#define FREE (   ptr)

Освобождает динамическую память и обнуляет указатель на нее.

Аргументы:
ptrУказатель на освобождаемую память. После освобождения памяти он обнуляется.
Примеры использования:
          char* str = CALLOC (char, 100);
          ...
          FREE (str);

См. определение в файле TXWave.h строка 478

#define __TX_FUNCTION__

Имя текущей функции

Предупреждения:
Если определение имени функции не поддерживается компилятором, то __TX_FUNCTION__ раскрывается в имя исходного файла и номер строки.

См. определение в файле TXLib.h строка 285

#define sizearr (   arr)

Вычисление размера массива в элементах

Аргументы:
arrИмя массива.
Возвращает:
Размер массива в элементах (не в байтах).

Макрос sizearr() вычисляет размер массива в элементах, проверяя, можно ли его правильно вычислить при компиляции.

Макрос SIZEARR() просто делит размер всего массива в байтах на размер его элемента, получается размер массива в элементах.
Он не проверяет, можно ли его правильно вычислить, и при неправильном использовании может выдать неверный размер.

Предупреждения:
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);
              }

См. определение в файле TXLib.h строка 4400

#define MAX (   a,
 
)

Возвращает максимальное из двух чисел

Аргументы:
aОдно из чисел :)
bДругое из чисел :)
Возвращает:
Максимальное из двух чисел a и b.
Предупреждения:
Это макрос, и аргументы a и b могут вычисляться в нем два раза. Поэтому не используйте в нем побочных действий ++, --, += и т.п. Например, не пишите так: int m = MAX (++x, y += 2);
См. также:
MIN()
Примеры использования:
          if (MAX (3, 7) != 7) printf ("Your CPU is broken, throw it away.");

См. определение в файле TXLib.h строка 4588

#define MIN (   a,
 
)

Возвращает минимальное из двух чисел

Аргументы:
aОдно из чисел :)
bДругое из чисел :)
Возвращает:
Минимальное из двух чисел a и b.
Предупреждения:
Это макрос, и аргументы a и b могут вычисляться в нем два раза. Поэтому не используйте в нем побочных действий ++, --, += и т.п. Например, не пишите так: int m = MIN (x--, y /= 2);
См. также:
MAX()
Примеры использования:
          if (MIN (3, 7) != 3) printf ("Your CPU is still broken, throw it away twice.");

См. определение в файле TXLib.h строка 4614

#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.

См. определение в файле TXLib.h строка 4641

#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 уничтожает трехмерность! Очень круто. :=/

См. определение в файле TXLib.h строка 4758

#define meow   ;

Еще парочка макросов.

please увеличивает вероятность успешного выполнения кода*.

meow -- ...просто мяу :)

Заметки:
* Это шутка :)
Примеры использования:
          #include "TXLib.h"

          int x = rand() meow   // Как же без котиков?
          int y = rand() meow
          if (x+y > RAMD_MAX/2) please x = y = 0;

См. определение в файле TXLib.h строка 4787

#define ZERO (   type)

Обнулитель типов, не имеющих конструкторов

Аргументы:
typeИмя типа.
Возвращает:
Значение типа type, покомпонентно инициализированное по умолчанию (для встроенных типов -- нулем).
Примеры использования:
          void f (POINT p);
          ...

          POINT z = {}; f (z);  // Так без ZERO

          f (ZERO (POINT));     // Так с ZERO

См. определение в файле TXLib.h строка 4817

#define tx_auto_func (   func)

Автоматический вызов функции при завершении другой функции (аналог __finally)

Аргументы:
funcТело автоматически вызываемой функции (фигурные скобки не обязательны).
Заметки:
- Все переменные вызываемой функции связываются с переменными внешней функции по ссылке.
  • Их названия и типы не указываются. Указывается только тело вызываемой функции.
  • Синоним: tx_finally
См. также:
txAutoLock
Примеры использования:
          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
              }

См. определение в файле TXLib.h строка 4853

#define TX_ASSERT (   cond)

Замена стандартного макроса assert(), с выдачей сообщения через txMessageBox(), консоль и OutputDebugString().

Аргументы:
condУсловие для проверки.
Возвращает:
Не определено.

Если условие, проверяемое TX_ASSERT(), истинно, то макрос ничего не делает.
Если условие оказывается ложно, то выводится диагностическое сообщение и программа аварийно завершается.

Предупреждения:
При компиляции в режиме Release (или если определен NDEBUG) TX_ASSERT превращается в пустой оператор.
Не надо помещать в TX_ASSERT() или в assert() действия, которые важны для работы алгоритма!
Заметки:
Если условие cond может быть вычислено уже во время компиляции как ложное, компилятор может предупредить об этом (как о делении на 0).
See: "JPL Institutional Coding Standard for the C Programming Language", Jet Propulsion Laboratory, California Institute of Technology, JPL DOCID D-60411, Ver. 1.0, March 3, 2009, page 15.

Стандартный макрос assert() переопределяется так, что становится эквивалентен TX_ASSERT().
Предупреждения:
Кто не юзает assert(), тот ест баги на десерт!
См. также:
asserted, verified, verify(), TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(), txNotifyIcon(), txStackBackTrace(), txPause(), __TX_FILELINE__, __TX_FUNCTION__
Примеры использования:
          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

См. определение в файле TXLib.h строка 4930

#define asserted

Выводит диагностическое сообщение в случае нулевого или ложного результата.

Возвращает:
Всегда 0.

Суффиксная форма макроса assert(), не теряющая в режиме Release исполнения предиката.

Заметки:
Предполагается, что операция в случае неуспеха возвращает 0 или false.

При компиляции в режиме Release (или если определен NDEBUG) asserted превращается в пустое место.
См. также:
assert(), verify(), verified, TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(), txNotifyIcon(), txStackBackTrace(), txPause(), __TX_FILELINE__, __TX_FUNCTION__
Примеры использования:
          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;

См. определение в файле TXLib.h строка 4974

#define verify

Выполняет команду (вычисляет выражение) и проверяет результат.

Аргументы:
exprКоманда (выражение).
Возвращает:
1, если выражение expr истинно, иначе 0.

Если условие, проверяемое verify(), истинно, то макрос ничего не делает.
Если условие оказывается ложно, то выводится диагностическое сообщение и программа аварийно завершается.

Заметки:
Действие макроса аналогично assert(), но при компиляции в режиме Release (или если определен NDEBUG) verify не превращается в пустой оператор.
См. также:
verified, assert(), asserted, TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(), txNotifyIcon(), txStackBackTrace(), txPause(), __TX_FILELINE__, __TX_FUNCTION__
Примеры использования:
          FILE* input = verify (fopen ("a.txt", "r"));

          // Этот вызов fgets() БУДЕТ выполнен в режиме Release:
          verify (fgets (str, sizeof (str) - 1, input));

          // Здесь все тоже будет правильно:
          verify (fclose (input) == 0);

См. определение в файле TXLib.h строка 5019

#define TX_ERROR (   msg)

Выводит развернутое диагностическое сообщение.

Аргументы:
msgСообщение с произвольным количеством параметров в стиле функции printf().
Заметки:
Этот макрос может распечатывать стек вызовов функций в консоли. По этому поводу см. замечания к функции txStackBackTrace() и раздел Установка библиотеки, п.4.
Возвращает:
Всегда false.
См. также:
_, TX_COMMA, assert(), asserted, verify(), verified, TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(), txNotifyIcon(), txStackBackTrace(), txPause(), __TX_FILELINE__, __TX_FUNCTION__
Примеры использования:
          TX_ERROR ("Не смог прочитать 'Войну и мир'. Отмазка %d: не нашел '%s'", reasonNum, fileName);

См. определение в файле TXLib.h строка 5051

#define TX_DEBUG_ERROR (   ...)

Выводит развернутое диагностическое сообщение в отладочном режиме.

Описание см. в TX_ERROR.

Заметки:
В режиме Release этот макрос не выводит ничего.
См. также:
_, TX_COMMA, assert(), asserted, verify(), verified, TX_ERROR(), txOutputDebugPrintf(), txMessageBox(), txNotifyIcon(), txStackBackTrace(), txPause(), __TX_FILELINE__, __TX_FUNCTION__
Примеры использования:
          TX_DEBUG_ERROR ("Так и не смог прочитать 'Войну и мир'. Отмазка %d: потерял '%s'", reasonNum, fileName);

См. определение в файле TXLib.h строка 5077

#define txStackBackTrace ( )

Распечатывает текущий стек вызовов функций в консоли.

Предупреждения:
Для корректной работы этой функкции требуются модули, которые нужно установить (скопировать) в папку Windows. См. раздел Установка библиотеки, п.4.
Заметки:
Для наиболее корректной работы этой функции полностью отключайте оптимизацию при компиляции. Например, для компилятора GCC g++ -- с помощью ключа командной строки -O0. Разные среды программирования позволяют задать эти ключи по-разному, например, в CodeBlocks через Главное меню -- Settings -- Compiler -- (Global Compiler Settings) -- (Compiler Settings) -- Other Options.
См. также:
txDump(), TX_ERROR(), TX_DEBUG_ERROR()
Примеры использования:
          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();
              }

См. определение в файле TXLib.h строка 5150

#define _

Макрос, позволяющий передать переменное число параметров в какой-либо другой макрос.

Заметки:
Символ подчеркивания и символ TX_COMMA просто переопределяются в запятую.
См. также:
TX_ERROR(), TX_DEBUG_ERROR()
Примеры использования:
          TX_ERROR ("Слишком умный абзац: роман 'Война и мир', файл '%s', строка %d" _ fileName _ lineNum);

См. определение в файле TXLib.h строка 5230

#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);
              }

См. определение в файле TXLib.h строка 5299

#define txGDI (   command,
  dc 
)

Вызывает функции Win32 GDI с автоматической блокировкой и разблокировкой.

Аргументы:
commandФункция GDI (возможно, возвращающая значение).
dcДескриптор контекста рисования (холста), использующийся в вызове функции GDI (см. параметр command).
Возвращает:
Значение, возвращаемое вызываемой функцией GDI.
Заметки:
Если параметр dc соответствует основному холсту TXLib (совпадает с возвращаемым значением txDC()), то на время выполнения функции GDI поток, обновляющий окно TXLib, блокируется.
Если в вызове функции GDI используются запятые, то используйте двойные скобки, чтобы получился один параметр, так как txGDI() это все же макрос.
См. также:
txDC(), txVideoMemory(), txLock(), txUnlock()
Примеры использования:
          txGDI (( Rectangle (txDC(), x1, y1, x2, y2) ));  // Не забудьте про две ((ДВЕ)) скобки

См. определение в файле TXLib.h строка 5551

#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)
                  {
См. также:
TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog
Примеры использования:
          Cм. реализацию функции txInputBox().

См. определение в файле TXLib.h строка 6725

#define TX_HANDLE (   id)

Заголовок обработчика сообщения (Message handler) карты сообщений.

Аргументы:
idИдентификатор сообщения.
Раскрывается в
                  break;
                  case (id):
См. также:
TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog
Примеры использования:
          Cм. реализацию функции txInputBox().

См. определение в файле TXLib.h строка 6755

#define TX_COMMAND_MAP

Начало карты команд (Command map) в карте сообщений.

Раскрывается в
                  }  // Конец switch (_msg)

              if (_msg == WM_COMMAND)
                  switch (LOWORD (_wParam))
                      {
См. также:
TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog
Примеры использования:
          Cм. реализацию функции txInputBox().

См. определение в файле TXLib.h строка 6781

#define TX_END_MESSAGE_MAP

Завершитель карты сообщений.

Раскрывается в
                  }  // Конец switch (_msg) или switch (LOWORD (_wParam))

              return FALSE;
              }
См. также:
TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog
Примеры использования:
          Cм. реализацию функции txInputBox().

См. определение в файле TXLib.h строка 6810

#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++. Это когда ошибки ищутся сами.

См. также:
assert(), asserted, __TX_FILELINE__, __TX_FUNCTION__, TX_ERROR
Заметки:
Есть еще другие (недокументированные) подобные макросы. Загляните в исходный текст TXLib.h, ищите __TX_DEBUG_MACROS и см. ниже.
Примеры использования:
          $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;

См. определение в файле TXLib.h строка 15843


Функции

void* operator new ( size_t  size,
int   
)

Выделяет блок динамической памяти через new с обнулением его содержимого перед вызовом конструктора.

Аргументы:
sizeРазмер элемента/элементов
Возвращает:
Выделенная память
Примеры использования:
          int* i = new(0) int;
          ...
          delete i;

См. определение в файле TXWave.h строка 504

void* operator new ( size_t  size,
size_t  items,
int   
)

Выделяет блок динамической памяти через new[] с обнулением содержимого перед вызовом конструкторов.

Аргументы:
sizeРазмер элементов
itemsКоличество элементов массива
Возвращает:
Выделенная память
Примеры использования:
          char* str = new(0) char [100];
          ...
          delete[] str;

См. определение в файле TXWave.h строка 523

int txMessageBox ( const char  text[] = "Муаххаха! :)",
const char  header[] = "TXLib сообщает",
unsigned  flags = MB_ICONINFORMATION|MB_OKCANCEL 
)

Выводит различные сообщения в окне с помощью функции MessageBox.

Аргументы:
textТекст сообщения. В принципе, необязательно, но зачем вы тогда меня вызывали?
headerЗаголовок сообщения. Необязательно.
flagsФлаги отображения сообщения. Необязательно.
Возвращает:
Значение, возвращаемое функцией MessageBox.
Предупреждения:
Текст не должен превышать _TX_BIGBUFSIZE символов, а заголовок -- _TX_BIGBUFSIZE символов, иначе они обрезаются.
Заметки:
Вместо txMessageBox (text, header, flags) можно использовать стандартную функцию Win32 MessageBox (txWindow(), text, header, flags). Отличия txMessageBox в том, что она автоматически подставляет окно-родитель, и в том, что при выводе в окно строчки переводятся в формат UNICODE. Это важно лишь в том случае, когда в региональных настройках контрольной панели Windows неверно установлена кодовая страница для программ, не поддерживающих UNICODE. В остальных случаях нужды в txMessageBox нет.

При отображении окна txMessageBox программу можно завершить, нажав клавиши клавиатуры Shift, Control и Alt одновременно с нажатием мышкой на кнопку окна [Отмена] или [Cancel]. Это полезно, если окно txMessageBox постоянно отображается в цикле и программу нельтзя завершить нажатием на кнопку закрытия основного окна.
См. также:
TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txNotifyIcon(), txSpeak(), txStackBackTrace()
Примеры использования:
          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().
Возвращает:
Ошибка выполнения функции. Если возвращаемое значение равно 0 (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().

См. также:
txBegin(), txEnd(), txSleep(), txUpdateWindow(), txDC(), txVideoMemory(), txTextCursor(), txLock(), txUnlock(), txGDI()
Примеры использования:
          txUpdateWindow (false);
          ...
          txUpdateWindow();
bool txSelectObject ( HGDIOBJ  obj,
HDC  dc = txDC() 
)

Устанавливает текущий активный объект GDI.

Аргументы:
objДескриптор объекта GDI.
dcХолст (контекст рисования), в котором устанавливается текущий активный объект GDI. Необязателен.
Возвращает:
Если операция была успешна -- true, иначе -- false.
Заметки:
Предыдущий выбранный объект того же типа (PEN/BRUSH/BITMAP и т.п.), как и obj, уничтожается.
См. также:
txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txSelectFont()
Примеры использования:
          HPEN pen = CreatePen (PS_DASH, 1, RGB (255, 128, 0));
          txSelectObject (pen);
bool txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture ( )

Делает нечто иногда удобное. См. название функции.

Возвращает:
Если операция была успешна -- true, иначе -- false.

У этой функции есть синоним с простым понятным названием, поищите его в файле библиотеки, около определения этой функции. Или можно   скопировать   набрать это километровое имя и посмотреть, что получится.

См. также:
txCreateWindow(), txSleep()
Примеры использования:
          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 (см. ниже).
Возвращает:
Если операция была успешна -- true, иначе -- false.
Режимы воспроизведения:
SND_ASYNC   Звук проигрывается одновременно с работой программы.
Чтобы отменить звучание, вызовите txPlaySound (NULL).
SND_SYNC   Выполнение программы приостанавливается до окончания воспроизведения звука.
SND_LOOP   Зацикливать звук при воспроизведении.
Чтобы отменить звучание, вызовите txPlaySound (NULL).
SND_NODEFAULT   Не использовать звук по умолчанию, если нельзя проиграть указанный звуковой файл.
SND_NOSTOP   Если какой-либо звук уже проигрывается, не останавливать его для запуска указанного звука.
SND_APPLICATION   Проигрывать звук, используя программу, зарегистрированную для данного типа звуковых файлов.
Заметки:
Поддерживаются только файлы в формате WAV. Остальные форматы (MP3 и др.) надо перекодировать в WAV. Переименование со сменой расширения не поможет, как и в случае с форматом картинок в txLoadImage().
См. также:
txSpeak(), txPlayVideo()
Примеры использования:
          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() лучше скажет что-то более важное, чем просто молчание. :)
Предупреждения:
Для работы этой функции TXLib требует наличия файла SAPI.h из стандартной библиотеки Windows. Не на всех платформах он есть. Если этот файл не найден, то будет ошибка компиляции.

Этот файл точно есть в Visual Studio или в этой сборке платформы MinGW: https://nuwen.net/mingw.html
Заметки:
Вы можете настраивать синтез речи, используя язык разметки SSML (Speech Synthesis Markup Language). Признаком наличия разметки SSML является наличие открывающей угловой скобки < в начале сообщения (после опций \v и \a). В этом случае будьте осторожны с амперсандами &, кавычками и знаками "меньше" < и "больше" >, а также другими спецсимволами XML. Если вы не знаете, как задавать их в XML, то не используйте. Формату SSML нужно строго соответствовать, иначе программа упадет,   как это принято у Microsoft.  

Если вам не нравится, что надо каждый раз указывать заголовок SSML, то вам это правильно не нравится. Сделайте функцию-обертку над txSpeak, заодно познакомитесь, как делать функции с переменным числом параметров. Не забудьте о vsnprintf @ (vsprintf), эти функции сэкономят вам немало сил.
См. также:
txPlaySound(), txPlayVideo(), txMessageBox(), txOutputDebugPrintf(), txPause()
Примеры использования:
          #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() 
)

Проигрывает видео.

Аргументы:
xX-координата верхнего левого угла видео. См. предупреждение ниже.
yY-координата верхнего левого угла видео. См. предупреждение ниже.
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() делает паузу в программе, ожидая конца воспроизведения, и только потом возвращается.

В случае асинхронного воспрооизведения возвращаемым значением функции txPlayVideo() будет не время ее работы, а дескриптор окна видеопотока (HWND). С его помощью можно контролировать это окно, его положение на экране, размеры, видимость и другие свойства. См. функции MoveWindow(), ShowWindow() и многие другие в MSDN. Гуглите. Также см. пример использования.

Досрочно прервать асинхронное воспроизведение можно, уничтожив окно видеопотока с помощью функции txDestroyWindow().

Принудительно завершить асинхронное воспроизведение всех видео можно, сделав вызов txPlayVideo (NULL).
Предупреждения:
Если в последнем параметре (wnd) указано не окно TXLib, а какое-либо другое, то координаты видео x, y и его размеры width, height игнорируются. В этом слчае видеопоток будет занимать всю клиентскую область окна, указанного параметром wnd. См. пример использования.
Заметки:
Воспроизведение видео требует установки внешней программы VideoLAN (vlc.exe) версии 3.0 или новее. Ее можно скачать с официального сайта VideoLAN.org. Без установки VideoLAN видео воспроизводиться не будет и выведется сообщение об ошибке.

Если после установки VideoLAN программа (vlc.exe) все равно не найдена и выводится сообщение об этой ошибке, то установите не 64-битную версию VideoLAN, а 32-битную (x86).
См. также:
Кот Мару!, txPlaySound(), txSpeak(), txMessageBox(), txOutputDebugPrintf(), txPause()
Примеры использования:
          // Кот Мару, 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() выше.

См. описание в функции txPlayVideo() выше.

bool txGetAsyncKeyState ( int  key)

Проверяет, нажата ли указанная клавиша.

Аргументы:
keyКод (номер) клавиши, как правило, заданный константой (VK_SPACE, VK_LEFT, 'W' и т.п.)
Возвращает:
true, если указанная клавиша нажата, false -- если не нажата.
Заметки:
В отличие от оригинальной функции GetAsyncKeyState(), возвращает false, если окно TXLib не активно.
Примеры использования:
          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() и выводит во всплывающем окне.

Предупреждения:
  • Эта функция требует, чтобы при компиляции константа версии Internet Explorer (_WIN32_IE) была задана не ниже 0x0500. Для этого надо либо включить TXLib.h вместо windows.h или перед ним. Либо надо самостоятельно определить (#define) эту константу.
    С версией Internet Explorer это связано потому, что при его установке в Windows обновляются многие компоненты (например, shell32.dll и comctl32.dll), которые влияют на функциональность системы независимо от использования браузера). Сам Internet Explorer в отображении сообщения не участвует.
  • Сообщение не должно превышать _TX_BUFSIZE символов, иначе оно обрезается.
См. также:
TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(), txSpeak(), txPause()
Примеры использования:
          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().
Предупреждения:
Сообщение не должно превышать _TX_BIGBUFSIZE символов, иначе оно обрезается.
См. также:
TX_ERROR(), TX_DEBUG_ERROR(), txPrintf(), txNotifyIcon(), txMessageBox(), txStackBackTrace(), txPause()
Примеры использования:
          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.
Предупреждения:
Функция довольно медленная и жадная на ресурсы: во-первых, в силу применения весьма неоптимальных потоков вывода STL (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().

Предупреждения:
Эта функция доступна только если ваш компилятор поддерживает стандарт C++11 (g++ с опцией -std=c++11 или выше, Microsoft Visual Studio 2013 или выше). Используйте макрос _TX_CPP11, который определен, если компилятор поддерживает стандарт C++11.
См. также:
txFormat(), TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txNotifyIcon(), txMessageBox(), txPause()
Примеры использования:
          //         +--+--+---+---+----+-----+---+--+
          //         |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Значения для печати.
Возвращает:
Количество напечатанных символов.
Предупреждения:
Эта функция доступна только если ваш компилятор поддерживает стандарт C++11 (g++ с опцией -std=c++11 или выше, MSVC 2013 или выше). Используйте макрос _TX_CPP11, который определен, если компилятор поддерживает стандарт C++11.
См. также:
txPrintf(), TX_ERROR(), TX_DEBUG_ERROR(), txPrintf(), txNotifyIcon(), txMessageBox(), txStackBackTrace(), txPause()
Примеры использования:
См. пример в функции txPrintf() выше.
int txPrintf ( char  buffer[],
size_t  size,
const char *  format,
ArgsT...  args 
)

Печатает в строковый буфер, как sprintf().

Аргументы:
formatСтрока, как в sprintf().
bufferБуфер для вывода.
sizeДлина буфера вывода.
argsЗначения для печати.
Возвращает:
Количество напечатанных символов.
Предупреждения:
Эта функция доступна только если ваш компилятор поддерживает стандарт C++11 (g++ с опцией -std=c++11 или выше, MSVC 2013 или выше). Используйте макрос _TX_CPP11, который определен, если компилятор поддерживает стандарт C++11.
См. также:
txPrintf(), TX_ERROR(), TX_DEBUG_ERROR(), txPrintf(), txNotifyIcon(), txMessageBox(), txStackBackTrace(), txPause()
Примеры использования:
См. пример в функции txPrintf() выше.
std::string txFormat ( const char *  format,
ArgsT...  args 
)

Форматирует строку, как sprintf().

Аргументы:
formatСтрока, как в sprintf().
argsЗначения для печати.
Возвращает:
Отформатированная строка в виде std::string.
Предупреждения:
Эта функция доступна только если ваш компилятор поддерживает стандарт C++11 (g++ с опцией -std=c++11 или выше, MSVC 2013 или выше). Используйте макрос _TX_CPP11, который определен, если компилятор поддерживает стандарт C++11.
См. также:
txPrintf(), TX_ERROR(), TX_DEBUG_ERROR(), txPrintf(), txNotifyIcon(), txMessageBox(), txStackBackTrace(), txPause()
Примеры использования:
См. пример в функции txPrintf() выше.
int random ( int  range)

Генератор случайных чисел

Аргументы:
rangeПравая граница диапазона (не включая саму границу).
Возвращает:
Случайное целое число в диапазоне [0; range).

Вы еще помните, что означают разные скобочки в обозначении интервалов? :)

Предупреждения:
Эта функция может мяукать.   Just because it can.   Потому что она не часть стандарта С++ или Windows, а зависит от TXLib'а. Если это вам не нравится, вы можете написать ее сами, с помощью стандартной функции rand() и операции остатка от деления %. Подсказка: rand() % 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Правая граница диапазона (включая саму границу).
Возвращает:
Случайное целое число в диапазоне [left; right].

Вы все еще помните, что означают разные скобочки в обозначении интервалов? :)

Предупреждения:
Эта функция может мяукать.   Just in case.   Потому что она не часть стандарта С++ или Windows, а зависит от TXLib'а. Если это вам не нравится, вы можете написать ее сами, с помощью стандартной функции rand() и небольшой   уличной   магии с делением на RAND_MAX и   таинственной   операцией вычитания.
Примеры использования:
          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 <= x && x <= b, то истина, если нет -- ложь.
Заметки:
Параметры этой функции названы не по смыслу: просто a и просто b. Так как a - это минимальное значение, лучше бы назвать этот параметр min или как-либо еще, но осмысленно. Пусть математики и любят короткие обозначения, но мы будем любить осмысленные - потому что мы круче. :)) На самом деле это потому, что математики много пишут рукой, и писать длинные имена им сложно, а программисты набирают текст в редакторе, где это делать проще. Не будем обижать математиков, они крутые. MLM - Math Lives Matter! :)

Когда будете писать свою аналогичную функцию (а вы точно будете ее писать, см. предупреждение), назовите параметры осмысленно. Не следуйте плохим примерам из TXLib'а! (Они там есть для этого специально.)
Предупреждения:
Эта функция может мяукать.   Because cats are power!   Потому что она не часть стандарта С++ или Windows, а зависит от TXLib'а. Если это вам не нравится, вы можете написать ее сами, используя неравенства.
Примеры использования:
          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} .
Возвращает:
Результат проверки.

Удобно для реализации экранных кнопок, нажимаемых курсором мыши.

Предупреждения:
Эта функция может мяукать.   Because cats are always right.   Потому что она не часть стандарта С++ или Windows, а зависит от TXLib'а. Если это вам не нравится, вы можете написать ее сами.
Примеры использования:
          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).

Заметки:
Поведение TXLib по умолчанию -- генерация этих исключений и их перехват TXLib'ом в виде ошибки.

См. [1] пример работы с этими исключениями, [2] статью о них.
Примеры использования:
double txSqr ( double  x)

Очень удобное возведение числа в квадрат.

Аргументы:
xЧисло для возведения в него. (Кого? (Who?))
Возвращает:
Квадрат, полученный путем возведения в него числа, заданного для возведения в квадрат.
Заметки:
Это пример, как не надо писать код: txSqr() -- функция с "медвежьей услугой". Иногда встречаются те, кто любит печатать в функции результат ее вычислений (не данные для отладки, а именно результат), вместо того, чтобы просто возвращать его туда, где эту функцию вызывали. Пусть эти люди воспользуются приведенной txSqr() для какого-нибудь нужного дела, особенно в цикле. Пример, конечно, несколько преувеличен. См. в исходном тексте код этой навязчивой радости.
Примеры использования:
          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);
              }

См. определение в файле TXLib.h строка 4710

void txDump ( const void *  address,
const char  name[] = "_txDump()",
bool  pause = true 
)

Распечатывает дамп области памяти в консоли.

Аргументы:
addressАдрес начала распечатки.
pauseДелать ли паузу в конце распечатки. Необязательно.
nameНазвание распечатки (усекается до 8 символов). Необязательно.
Заметки:
Распечатывается область памяти размером 256 байт.
См. также:
txStackBackTrace(), TX_ERROR(), TX_DEBUG_ERROR()
Примеры использования:
          const char text[] = "Каждому лектору -- в портфель по вектору";
          txDump (text);

          SetConsoleOutputCP (437);    // Будет отображаться псевдографика, но НЕ русские буквы
          txDump (text);
          SetConsoleOutputCP (1251);
std::string txDemangle ( const char *  mangledName)

Преобразует декорированное имя С++ в название типа.

Аргументы:
mangledNameДекорированное (mangled) имя.
Возвращает:
Строка с полным названием типа.

Что такое декорирование имен (name mangling) см. здесь.

Предупреждения:
Если используется форма функции, возвращающая char*, вы должны сами освободить память, занимаемую строкой, с помощью вызова free(), иначе будет утечка памяти.
См. также:
txDump(), txStackBackTrace(), TX_ERROR(), TX_DEBUG_ERROR()
Примеры использования:
          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Размер буфера
Возвращает:
Количество байт, записанных в буфер   сос мыслом   со значением value
Заметки:
Имя ключа реестра 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, то текущая альтернативная оконная функция удаляется и устанавливается стандартная.
Возвращает:
Адрес предыдущей оконной функции для окна TXLib.

Используйте эту функцию, чтобы самому обрабатывать сообщения Windows, например, сообщения от колесика Мыши. См. примеры такой обработки в примере использования ниже.

Заданная оконная функция wndProc будет вызываться до обработки события средствами TXLib. Она должна быть функцией со следующим прототипом:

          LRESULT CALLBACK NewWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam);
Предупреждения:
Ваша оконная функция будет вызываться из вспомогательного (второго) потока, создаваемого txCreateWindow(). Это не тот же самый поток, в котором выполняется main(). В связи с этим будьте внимательны при работе с глобальными переменными или их аналогами, т.к. может возникнуть "гонка потоков" (race condition).
Если ваша оконная функция вернет значение, не равное 0, то стандартная обработка сообщений средствами TXLib производиться не будет. Из-за этого, возможно, окно даже не сможет нормально закрыться. Придется завершать программу с помощью Alt-Ctrl-Del из диспетчера задач, или из более продвинутого диспетчера Process Explorer. Если Вы берете на себя обработку оконных сообщений, делайте ее по правилам Win32 (см. в MSDN), включая вызов DefWindowProc(). Этот вызов особенно важен, если вы обрабатываете сообщение WM_CLOSE.
Заметки:
Полностью поменять оконную функцию можно с помощью функций SetWindowLong или SetWindowLongPtr:
          WNDPROC OldWndProc = (WNDPROC) SetWindowLongPtr (txWindow(), GWL_WNDPROC, (LONG_PTR) NewWndProc);
При этом надо обязательно всегда вызывать старую оконную функцию с помощью CallWindowProc, (см. MSDN), иначе последствия будут такими же плачевными, как описаны выше.
См. также:
txCreateWindow(), txDialog, txInputBox()
Примеры использования:
          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(), который не приостанавливает поток, а просто отключает принудительное постоянное обновление окна.

См. также:
txDC(), txVideoMemory(), txLock(), txUnlock(), txGDI()
Примеры использования:
См. исходный текст функций _txCanvas_OnPAINT() и _txConsole_Draw() в TXLib.h.
bool txUnlock ( )

Разблокирует холст

Возвращает:
Состояние блокировки (всегда false).

Более подробно см. в описании txLock().

См. также:
txDC(), txVideoMemory(), txLock(), txGDI()
Примеры использования:
См. исходный текст функций _txCanvas_OnPAINT() и _txConsole_Draw() в TXLib.h.
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".
Возвращает:
Номер старой кодовой страницы консоли.
Предупреждения:
Если устанавливается кодовая страница не 1251, возможны нарушения в работе строковых функций C++ и вывода текста в консоль.
См. также:
txClearConsole(), txSetConsoleAttr() и другие консольные функции, txReopenStdio()
Примеры использования:
          txSetLocale (866, "Russian_Russia.866", L"Russian_Russia.866");
int txPause ( const char *  message,
  ... 
)

Приостанавливает программу до нажатия на любую клавишу.

Аргументы:
messageСообщение, выводимое в консоль через stderr, в формате printf(). Необязательно.
Заметки:
При нажатии Ctrl+C программа аварийно завершается.
См. также:
txMessageBox(), TX_ERROR(), TX_DEBUG_ERROR()
Примеры использования:
          txPause ("Привет от system (\"pause\");");

Переменные

const double txPI

Число Пи

Примеры использования:
          if (txPI == 1) txMessageBox ("Вы попали в другую Вселенную.", "Поздравляем", MB_ICONSTOP);

См. определение в файле TXLib.h строка 4679