· 7 years ago · Feb 18, 2019, 08:08 AM
1//=================================================================================================================
2// [These sections are for folding control in Code::Blocks]
3//{ [Best viewed with "Fold all on file open" option enabled] [best screen width is 115 chars]
4//=================================================================================================================
5//!
6//! @file TXLib.h
7//! @brief Библиотека Тупого Художника (The Dumb Artist Library, TX Library, TXLib).
8//!
9//! $Version: 00172a, Revision: 104 $
10//! $Copyright: (C) Ded (Ilya Dedinsky, http://txlib.ru) <mail@txlib.ru> $
11//! $Date: 2014-08-09 16:37:26 +0400 $
12//!
13//! TX Library - ÐºÐ¾Ð¼Ð¿Ð°ÐºÑ‚Ð½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ° двумерной графики Ð´Ð»Ñ Win32 на С++.
14//! Ðто Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ°Ñ "пеÑочница" Ð´Ð»Ñ Ð½Ð°Ñ‡Ð¸Ð½Ð°ÑŽÑ‰Ð¸Ñ… реализована Ñ Ñ†ÐµÐ»ÑŒÑŽ помочь им в изучении
15//! проÑтейших принципов программированиÑ. Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ð° руÑÑком Ñзыке.
16//!
17//! ФилоÑофиÑ<sup><a href=#Refs><small>1</small></a></sup> TX Library - облегчить первые шаги
18//! в программировании и подтолкнуть к творчеÑтву и ÑамоÑтоÑтельноÑти.
19//!
20//! TX Library is a tiny 2D graphics library for Win32 written in C++. This is a small
21//! sandbox for the very beginners to help them to learn basic programming principles.
22//! The documentation is currently in Russian.
23//!
24//! Официальный Ñайт библиотеки: <a href=http://txlib.ru>txlib.ru.</a>
25//!
26//! См. также <a href=http://txlib.sourceforge.net>Ñтраницу проекта на SourceForge.</a>
27//!
28//! @warning <b>Ðто альфа-верÑиÑ. Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ ÑоглаÑование Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¾Ð¼ библиотеки.</b> @nn
29//! Правила иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð»Ð¾Ð² библиотеки и Ñайта Ñм. на <a href=http://txlib.ru>
30//! официальном Ñайте.</a>
31//!
32//! @par Трекеры на SourceForge:
33//! - <a href=https://sourceforge.net/tracker/?func=add&group_id=213688&atid=1026710> <b>Сообщить об ошибке </b></a>
34//! - <a href=https://sourceforge.net/tracker/?func=add&group_id=213688&atid=1026713> <b>Предложить улучшение</b></a>
35//!
36//! @par Литература <a name=Refs>
37//! -# <a href=http://storage.ded32.net.ru/Materials/ConferencePseudoScientific-2003.pdf>
38//! Сальников Ð’.Ð., Ильин Ð’.Ð’., Шарко Ф.С., Митина Ð.Ð’., Ð‘ÐµÐ»Ð°Ñ Ð˜.Ð’., Индукаев Ð.К., ДединÑкий И.Ð .
39//! Структура и динамика поведенчеÑких реакций в уÑловиÑÑ… информационной перегрузки. <i>Batman
40//! Proceedings in Sheep Philosophy,</i> 2003, Vol. 22. pp. 23-24.</a>
41//!
42// $Copyright: (C) Ded (Ilya Dedinsky, http://txlib.ru) <mail@txlib.ru> $
43//-----------------------------------------------------------------------------------------------------------------
44//!
45//! @defgroup Drawing РиÑование
46//! @defgroup Mouse Поддержка мыши
47//! @defgroup Dialogs Диалоговые окна
48//! @defgroup Misc Разное
49//! @defgroup Service Служебное
50//! @defgroup Technical ТехничеÑкие детали
51//}
52//=================================================================================================================
53
54#if !defined (__TXLIB_H_INCLUDED) // <<<<<<<<< The code is here, unfold it <<<<<<<<<<<<<<<<<<<<<<<<<
55#define __TXLIB_H_INCLUDED
56
57//-----------------------------------------------------------------------------------------------------------------
58//{ Version information
59//-----------------------------------------------------------------------------------------------------------------
60
61//! @cond INTERNAL
62#define _TX_V_FROM_CVS(_1,file,ver,rev,date,auth,_2) "TXLib [Ver: " #ver ", Rev: " #rev "]"
63#define _TX_A_FROM_CVS(_1,file,ver,rev,date,auth,_2) "Copyright (C) " auth
64#define _TX_v_FROM_CVS(_1,file,ver,rev,date,auth,_2) ((0x##ver << 16) | 0x##rev)
65//! @endcond
66
67//{----------------------------------------------------------------------------------------------------------------
68//! @ingroup Technical
69//! @brief Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¸.
70//!
71//! @code
72//! #define _TX_VERSION "TXLib [Version: 1.72a, Revision 50]" (пример)
73//! #define _TX_AUTHOR "Copyright (C) Ded (Ilya Dedinsky, http://txlib.ru)"
74//! @endcode
75//! Ðти конÑтанты автоматичеÑки обновлÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ изменении верÑии.
76//!
77//! @see txVersion()
78//!
79//! @hideinitializer
80//}----------------------------------------------------------------------------------------------------------------
81//! @{
82
83#define _TX_VERSION _TX_V_FROM_CVS ($VersionInfo: , TXLib.h, 00172a, 104, 2014-08-09 16:37:26 +0400, "Ded (Ilya Dedinsky, http://txlib.ru) <mail@txlib.ru>", $)
84#define _TX_AUTHOR _TX_A_FROM_CVS ($VersionInfo: , TXLib.h, 00172a, 104, 2014-08-09 16:37:26 +0400, "Ded (Ilya Dedinsky, http://txlib.ru) <mail@txlib.ru>", $)
85
86//! @}
87//{----------------------------------------------------------------------------------------------------------------
88//! @ingroup Technical
89//! @brief ВерÑÐ¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¸ в целочиÑленном формате.
90//!
91//! Формат: Ñтаршее Ñлово - номер верÑии, младшее - номер ревизии, в двоично-деÑÑтичном формате.
92//! Ðапример, @c 0x172a0050 - верÑÐ¸Ñ @c 0.172a, Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ @c 50.
93//!
94//! Ðта конÑтанта автоматичеÑки обновлÑетÑÑ Ð¿Ñ€Ð¸ изменении верÑии.
95//!
96//! @see txVersion()
97//! @usage @code
98//! #if !(defined (_TX_VER) && (_TX_VER >= 0x172a0000))
99//! #error Must use TXLib.h version >= 1.72 to compile this.
100//! #endif
101//! @endcode
102//!
103//! @hideinitializer
104//}----------------------------------------------------------------------------------------------------------------
105
106#define _TX_VER _TX_v_FROM_CVS ($VersionInfo: , TXLib.h, 00172a, 104, 2014-08-09 16:37:26 +0400, "Ded (Ilya Dedinsky, http://txlib.ru) <mail@txlib.ru>", $)
107
108//}
109//-----------------------------------------------------------------------------------------------------------------
110
111//-----------------------------------------------------------------------------------------------------------------
112//{ Compiler- and platform-specific
113//! @name ÐÐ´Ð°Ð¿Ñ‚Ð°Ñ†Ð¸Ñ Ðº компилÑторам и платформам
114//-----------------------------------------------------------------------------------------------------------------
115//! @{ @cond INTERNAL
116
117#if !defined (__cplusplus)
118
119 #ifdef __GNUC__
120 #error
121 #error --------------------------------------------------------------------------------------------------------
122 #endif
123 #error TXLib.h: Must use C++ to compile TXLib.h.
124 #error
125 #error CHECK source file EXTENSION. Maybe it is ".C". It must be ".CPP".
126 #error If your file is named, for example, "Untitled.C", go to menu [File], then
127 #error then [Save As] and rename it to "Untitled.CPP". Please do NOT use spaces.
128 #error --------------------------------------------------------------------------------------------------------
129 #error
130
131#endif
132
133#if !defined (WIN32) && !defined (__WIN32__) && !defined(_WIN32) && !defined(_WIN32_WINNT)
134
135 #ifdef __GNUC__
136 #error
137 #error --------------------------------------------------------------------------------------------------------
138 #endif
139 #error TXLib.h: Windows (MSVC/Win32 or GCC/MinGW) is the only supported system, sorry.
140 #error
141 #error In Linux or iOS, you should write your own TXLib and share it with your friends,
142 #error or use wine.
143 #error --------------------------------------------------------------------------------------------------------
144 #error
145
146#endif
147
148#if defined (UNICODE) || defined (_UNICODE)
149
150 #ifdef __GNUC__
151 #warning TXLib.h: Disabling the UNICODE
152 #endif
153
154 #undef UNICODE // Burn Unicode, burn
155 #undef _UNICODE
156
157 #if defined (_WINDOWS_H) || defined (_INC_WINDOWS) || defined (_WINDOWS_) || defined (__WINDOWS__)
158
159 #ifdef __GNUC__
160 #error
161 #error --------------------------------------------------------------------------------------------------------
162 #endif
163 #error TXLib.h: Should include "TXLib.h" BEFORE or INSTEAD of <Windows.h> in UNICODE mode.
164 #error
165 #error REARRANGE your #include directives, or DISABLE the UNICODE mode.
166 #error --------------------------------------------------------------------------------------------------------
167 #error
168
169 #endif
170
171#endif
172
173#if defined (__STRICT_ANSI__) // Try to extend strict ANSI rules
174
175 #ifdef __GNUC__
176 #warning TXLib.h: Trying to extend strict ANSI compatibility
177 #endif
178
179 #undef __STRICT_ANSI__
180 #define __STRICT_ANSI__UNDEFINED
181
182 #if defined (_STRING_H_) || defined (_INC_STRING) || defined (_STDIO_H_) || defined (_INC_STDIO)
183
184 #ifdef __GNUC__
185 #error
186 #error --------------------------------------------------------------------------------------------------------
187 #endif
188 #error TXLib.h: Should include "TXLib.h" BEFORE <string.h> or <stdio.h> in Strict ANSI mode.
189 #error
190 #error REARRANGE your #include directives, or DISABLE ANSI-compliancy.
191 #error --------------------------------------------------------------------------------------------------------
192 #error
193
194 #endif
195
196#endif
197
198#if defined (__GNUC__)
199
200 #define _GCC_VER ( __GNUC__*100 + __GNUC_MINOR__*10 + __GNUC_PATCHLEVEL__ )
201
202 #if defined (_GCC_VER) && (_GCC_VER >= 420)
203
204 #if (_GCC_VER >= 460)
205 #pragma GCC diagnostic push
206 #endif
207
208 #pragma GCC optimize ("no-strict-aliasing")
209 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
210
211 #pragma GCC diagnostic ignored "-Wshadow"
212
213 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
214 #pragma GCC diagnostic ignored "-Wunreachable-code"
215 #pragma GCC diagnostic ignored "-Wold-style-cast"
216 #pragma GCC diagnostic ignored "-Wunused-label" // Just for fun in _txCanvas_OnCmdAbout()
217 #pragma GCC diagnostic ignored "-Winline"
218
219 #define _TX_THREAD __thread
220
221 #else
222 #define _TX_THREAD
223
224 #endif
225
226 #define _TX_CHECK_FORMAT( at ) __attribute__ (( format (printf, (at), (at)+1) ))
227
228 template <typename T>
229 inline T _txNOP (T value) { return value; } // To suppress performance warnings in assert etc
230
231 // From MinGW\include\float.h which is replaced by MinGW\lib\gcc\i686-pc-mingw32\x.x.x\include\float.h
232 extern "C" unsigned int __cdecl _controlfp (unsigned int unNew, unsigned int unMask);
233 extern "C" void __cdecl _fpreset (void);
234
235#else
236
237 #define _TX_CHECK_FORMAT( at )
238
239 #define _txNOP( value ) ( value )
240
241#endif
242
243#if defined (_MSC_VER)
244
245 #pragma warning (push, 4) // Set maximum warning level
246
247 #pragma warning (disable: 4127) // conditional expression is constant
248 #pragma warning (disable: 4351) // new behavior: elements of array will be default initialized
249 #pragma warning (disable: 4702) // unreachable code
250
251 #define _TX_THREAD __declspec (thread)
252
253#endif
254
255#if defined (_MSC_VER) && (_MSC_VER == 1200) // MSVC 6 (1998)
256
257 #define _MSC_VER_6 // Flag the bad dog
258
259 #pragma warning (disable: 4511) // copy constructor could not be generated
260 #pragma warning (disable: 4512) // assignment operator could not be generated
261 #pragma warning (disable: 4514) // unreferenced inline function has been removed
262 #pragma warning (disable: 4663) // C++ language change: to explicitly specialize class template
263 #pragma warning (disable: 4710) // function not inlined
264 #pragma warning (disable: 4786) // identifier was truncated to '255' characters in the debug information
265
266 #if !defined (WINVER)
267 #define WINVER 0x0400 // MSVC 6: Defaults to Windows 95
268 #endif
269
270 #if !defined (NDEBUG)
271 #define _CRTDBG_MAP_ALLOC 1 // Set debug mode heap allocation
272 #endif
273
274#endif
275
276#if defined (_MSC_VER) && (_MSC_VER >= 1400) // MSVC 8 (2005) or greater
277
278 #pragma warning (disable: 26135) // missing locking annotation
279 #pragma warning (disable: 28125) // the function must be called from within a try/except block
280 #pragma warning (disable: 28159) // consider using another function instead
281
282 #pragma setlocale ("russian") // Set source file encoding, see also _TX_CP
283
284 #if !defined (NDEBUG)
285 #pragma check_stack (on) // Turn on stack probes at runtime
286 #pragma strict_gs_check (push, on) // Detects stack buffer overruns
287 #endif
288
289 #define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
290 #define _TX_TRUNCATE , _TRUNCATE
291
292#else
293
294 #define strcpy_s strcpy // MSVC prior to 8 (2005) versions and GCC
295 #define strncpy_s strncpy // do NOT have secure variants of these
296 #define strncat_s strncat // functions, so use insecure ones.
297 #define wcsncpy_s wcsncpy // ...
298 #define _snprintf_s _snprintf //
299 #define _vsnprintf_s _vsnprintf //
300
301 #define strerror_s( buf, code ) ( strncpy ((buf), strerror (code), sizeof(buf)-1) )
302 #define ctime_s( buf, sizeof_buf, time ) ( strncpy ((buf), ctime (time), (sizeof_buf)-1) )
303 #define getenv_s( sz, buf, sizeof_buf, name ) ( (void)(sz), strncpy ((buf), getenv (name), (sizeof_buf)-1) )
304 #define strtok_s( buf, delim, ctx ) ( (void)(ctx), strtok ((buf), (delim)) )
305
306 #if !( defined (_GCC_VER) && (_GCC_VER == 471) && defined (__x86_64__) ) // GCC 4.7.1 x64 already has it
307 #define _controlfp_s( oldCtl, newCtl, mask ) ( *(oldCtl) = _controlfp (newCtl, mask), 0 )
308 #endif
309
310 #define _TX_TRUNCATE
311
312#endif
313
314#if defined (__INTEL_COMPILER)
315
316 #pragma warning (disable: 174) // remark: expression has no effect
317 #pragma warning (disable: 304) // remark: access control not specified ("public" by default)
318 #pragma warning (disable: 522) // remark: function "..." redeclared "inline" after being called
319 #pragma warning (disable: 981) // remark: operands are evaluated in unspecified order
320 #pragma warning (disable: 1684) // conversion from pointer to same-sized integral type (potential portability problem)
321
322#endif
323
324#if !defined (WINVER)
325 #define WINVER 0x0500 // Defaults to Windows 2000
326 #define WINDOWS_ENABLE_CPLUSPLUS // Allow use of type-limit macros in <basetsd.h>,
327#endif // they allowed by default if WINVER >= 0x0600.
328
329#if !defined (_WIN32_WINNT)
330 #define _WIN32_WINNT WINVER // Defaults to the same as WINVER
331#endif
332
333#if !defined (_WIN32_IE)
334 #define _WIN32_IE WINVER // Defaults to the same as WINVER
335#endif
336
337#define _USE_MATH_DEFINES // math.h's M_PI etc.
338
339//! @} @endcond
340//}
341//-----------------------------------------------------------------------------------------------------------------
342
343//-----------------------------------------------------------------------------------------------------------------
344//{ The Includes
345//-----------------------------------------------------------------------------------------------------------------
346
347#ifdef _MSC_VER_6
348 #pragma warning (push, 3) // MSVC 6: At level 4, some std headers emit warnings O_o
349#endif
350
351//-----------------------------------------------------------------------------------------------------------------
352
353#include <assert.h>
354#include <stdlib.h>
355#include <stdarg.h>
356#include <stdio.h>
357#include <string.h>
358#include <io.h>
359#include <fcntl.h>
360#include <direct.h>
361#include <process.h>
362#include <signal.h>
363#include <locale.h>
364#include <time.h>
365#include <float.h>
366#include <math.h>
367
368#include <map>
369#include <vector>
370#include <string>
371#include <iostream>
372#include <algorithm>
373#include <exception>
374#include <stdexcept>
375
376#include <conio.h>
377
378#include <windows.h>
379#include <tlhelp32.h>
380#include <shellapi.h>
381#include <shlobj.h>
382
383#if defined (_MSC_VER)
384#include <crtdbg.h>
385#endif
386
387//-----------------------------------------------------------------------------------------------------------------
388
389#ifdef _MSC_VER_6
390 #pragma warning (pop) // MSVC 6: Restore max level
391#endif
392
393#ifdef __STRICT_ANSI__UNDEFINED
394 #define __STRICT_ANSI__ // Redefine back
395#endif
396
397//}
398//-----------------------------------------------------------------------------------------------------------------
399
400//-----------------------------------------------------------------------------------------------------------------
401//{ The namespaces
402//-----------------------------------------------------------------------------------------------------------------
403
404//{----------------------------------------------------------------------------------------------------------------
405//! @ingroup Technical
406//! @brief Ðнонимное проÑтранÑтво имен Ð´Ð»Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ от конфликтов при Ñборке многофайлового проекта.
407//}----------------------------------------------------------------------------------------------------------------
408
409#ifdef FOR_DOXYGEN_ONLY
410namespace { namespace TX { }}
411#endif
412
413//}
414//-----------------------------------------------------------------------------------------------------------------
415
416/*! @cond INTERNAL */
417
418namespace { namespace TX { // <<<<<<<<< The main code is here, unfold it <<<<<<<<<<<<<<<<<<<<
419
420/*! @endcond */
421
422//=================================================================================================================
423//{ TXLIB INTERFACE
424// Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¸
425//=================================================================================================================
426
427//=================================================================================================================
428//{ Initialization
429//! @name Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¸
430//=================================================================================================================
431//! @{
432//{----------------------------------------------------------------------------------------------------------------
433//! @ingroup Drawing
434//! @brief Создание окна риÑованиÑ
435//!
436//! @param sizeX Размер окна по горизонтали (в пикÑелÑÑ…)
437//! @param sizeY Размер окна по вертикали (в пикÑелÑÑ…)
438//! @param centered Центрирование окна на диÑплее
439//!
440//! @return ДеÑкриптор (ÑиÑтемный номер) окна TXLib. ЕÑли окно не Ñоздано, возвращаетÑÑ NULL.
441//!
442//! @note УÑтанавливаютÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ умолчанию, Ñм. функцию txSetDefaults().
443//!
444//! @warning ЕÑли иÑпользуетÑÑ Ð¼Ð½Ð¾Ð³Ð¾Ñ„Ð°Ð¹Ð»Ð¾Ð²Ñ‹Ð¹ проект (Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÑŒÐ½Ð¾Ð¹ компилÑцией), то графичеÑкие функции TXLib,
445//! вызванные из файла проекта, будут работать только Ñ Ñ‚ÐµÐ¼ окном, которое Ñоздано <b>в Ñтом же файле</b>
446//! проекта. ЕÑли проект ÑоÑтоит, Ñкажем, из файлов @c main.cpp и @c game.cpp, и в файле @c main.cpp
447//! ÑоздаетÑÑ Ð³Ñ€Ð°Ñ„Ð¸Ñ‡ÐµÑкое окно, то функции из @c game.cpp не Ñмогут риÑовать в нем. (Однако @c game.cpp
448//! Ñможет Ñоздать Ñвое ÑобÑтвенное окно.) @n
449//! ЕÑли такой программе нужно одно окно, то в проект Ñледует включить файл, ответÑтвенный за риÑование,
450//! Ñкажем, @c graphics.cpp, и выводить графику только через функции Ñтого файла. Такой файл (или
451//! библиотеку) в больших проектах чаÑто называют графичеÑким движком. @nn
452//! То же каÑаетÑÑ Ð¸ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ TXLib в @b DLL.
453//!
454//! @note Ð’Ñпомогательные окна могут ÑоздаватьÑÑ Ð¿Ð¾ одному на каждый файл многофайлового проекта или загруженную
455//! DLL. Ð”Ð»Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð²Ñпомогательных окон иÑпользуетÑÑ txDestroyWindow(). Ð”Ð»Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ надо
456//! выйти из main().
457//!
458//! @warning Одновременное Ñоздание неÑкольких окон не потокобезопаÑно (not thread-safe). @nn
459//! ÐœÐ½Ð¾Ð³Ð¾Ð¾ÐºÐ¾Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð° на TXLib тормозит, да и Ð¾Ð´Ð½Ð¾Ð¾ÐºÐ¾Ð½Ð½Ð°Ñ Ñ‚Ð¾Ð¶Ðµ не отличаетÑÑ Ð²Ñ‹Ñокой ÑкороÑтью. Чтобы
460//! избавитьÑÑ Ð¾Ñ‚ Ñтого, броÑьте TXLib и иÑпользуйте другие оконные библиотеки (<a href=http://qt-project.org>Qt</a>,
461//! <a href=http://wxwidgets.org>wxWidgets</a>, <a href=http://gtk.org>GTK+</a> и Ñ‚.д., Ñм. также <a href=http://libsdl.org>
462//! SDL</a>, <a href=http://opengl.org>OpenGL</a> и Ñ‚.п.) или напишите Ñвою. Помните, что цель TXLib -
463//! облегчить первые шаги, но потом Ñтать ненужной.
464//!
465//! @see txOK(), txWindow(), txDC(), _txWindowStyle, _txConsoleMode, _txConsoleFont, _txCursorBlinkInterval,
466//! _txWindowUpdateInterval, _TX_NOINIT, _TX_ALLOW_TRACE, TX_TRACE
467//!
468//! @usage @code
469//! txCreateWindow ( 800, 600); // Окно 800х600, центрировано
470//! txCreateWindow (1024, 768, false); // Окно 1024х768, не центрировано
471//! @endcode
472//}----------------------------------------------------------------------------------------------------------------
473
474HWND txCreateWindow (double sizeX, double sizeY, bool centered = true);
475
476//{----------------------------------------------------------------------------------------------------------------
477//! @ingroup Drawing
478//! @brief УÑтановка параметров риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ умолчанию.
479//!
480//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
481//!
482//! @par Параметры по умолчанию:
483//! - Линии - цвет белый (TX_WHITE), толщина 1
484//! - Заливка - цвет белый (TX_WHITE)
485//! - Шрифт - СиÑтемный шрифт, цвет белый (TX_WHITE)
486//! - РаÑÑ‚Ñ€Ð¾Ð²Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ - копирование цвета (R2_COPYPEN)
487//!
488//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txSelectFont(), txSetROP2()
489//!
490//! @usage @code
491//! txSetDefaults();
492//! @endcode
493//}----------------------------------------------------------------------------------------------------------------
494
495bool txSetDefaults();
496
497//{----------------------------------------------------------------------------------------------------------------
498//! @ingroup Drawing
499//! @brief Проверка правильноÑти работы библиотеки
500//!
501//! @return СоÑтоÑние библиотеки: true - библиотека в порÑдке, false - не в порÑдке.
502//!
503//! "Библиотека не в порÑдке" означает, что ее внутренние данные неверны. Ð¡Ð°Ð¼Ð°Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð° -
504//! не открыто окно, однако могут быть и другие проблемы.
505//!
506//! @see txCreateWindow()
507//!
508//! @usage @code
509//! txCreateWindow (800, 600);
510//! if (!txOK())
511//! {
512//! txMessageBox ("Ðе Ñмогла Ñоздать окно", "Извините", MB_ICONSTOP);
513//! return;
514//! }
515//! @endcode
516//}----------------------------------------------------------------------------------------------------------------
517
518inline bool txOK();
519
520//{----------------------------------------------------------------------------------------------------------------
521//! @ingroup Drawing
522//! @brief Возвращает размер окна риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² виде Ñтруктуры POINT.
523//!
524//! @return Размер окна риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² виде Ñтруктуры POINT, Ñодержащей компоненты @c x и @c y.
525//!
526//! @see txGetExtentX(), txGetExtentY()
527//!
528//! @usage @code
529//! POINT size = txGetExtent();
530//!
531//! txLine (0, 0, size.x, size.y);
532//! txLine (0, size.y, size.x, 0);
533//! @endcode
534//}----------------------------------------------------------------------------------------------------------------
535
536POINT txGetExtent();
537
538//{----------------------------------------------------------------------------------------------------------------
539//! @ingroup Drawing
540//! @brief Возвращает ширину окна риÑованиÑ.
541//!
542//! @return Ширина окна риÑованиÑ.
543//!
544//! @see txGetExtent(), txGetExtentY()
545//!
546//! @usage @code
547//! txSetTextAlign (TA_CENTER);
548//! txTextOut (txGetExtentX() / 2, 100, "Oh, oh, you're in the [army]middle now");
549//! @endcode
550//}----------------------------------------------------------------------------------------------------------------
551
552int txGetExtentX();
553
554//{----------------------------------------------------------------------------------------------------------------
555//! @ingroup Drawing
556//! @brief Возвращает выÑоту окна риÑованиÑ.
557//!
558//! @return Ð’Ñ‹Ñота окна риÑованиÑ.
559//!
560//! @see txGetExtent(), txGetExtentX()
561//!
562//! @usage @code
563//! void DrawHouse (int height);
564//! ...
565//! DrawHouse (txGetExtentY() / 2);
566//! @endcode
567//}----------------------------------------------------------------------------------------------------------------
568
569int txGetExtentY();
570
571//{----------------------------------------------------------------------------------------------------------------
572//! @ingroup Drawing
573//! @brief Возвращает деÑкриптор контекÑта риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñ…Ð¾Ð»Ñта
574//!
575//! @return ДеÑкриптор (ÑиÑтемный номер, handler) контекÑта риÑÐ¾Ð²Ð°Ð½Ð¸Ñ (device context, DC) холÑта (HDC).
576//!
577//! @note HDC возвращаетÑÑ Ð² виде ÑÑылки, что позволÑет подменить его. Перед подменой надо Ñохранить Ñтарый
578//! деÑкриптор или оÑвободить его Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ txDeleteDC(). До подмены риÑование должно быть заблокировано
579//! Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ txLock() и поÑле подмены разблокировано Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ txUnlock().
580//!
581//! @see txWindow(), txLock(), txUnlock(), txGDI()
582//!
583//! @usage @code
584//! txBitBlt (txDC(), 0, 0, 100, 100, txDC(), 0, 0);
585//! txBitBlt (txDC(), 100, 0, 100, 100, txDC(), 0, 0);
586//! txBitBlt (txDC(), 0, 100, 100, 100, txDC(), 0, 0);
587//! txBitBlt (txDC(), 100, 100, 100, 100, txDC(), 0, 0);
588//! @endcode
589//}----------------------------------------------------------------------------------------------------------------
590
591inline HDC& txDC();
592
593//{----------------------------------------------------------------------------------------------------------------
594//! @ingroup Drawing
595//! @brief Возвращает деÑкриптор окна холÑта
596//!
597//! @return ДеÑкриптор (ÑиÑтемный номер, handler) окна холÑта
598//!
599//! @see txDC(), txLock(), txUnlock(), txGDI()
600//!
601//! @usage @code
602//! SetWindowText (txWindow(), "Ðовые заголовки - теперь и в ваших окнах!");
603//! txMessageBox ("РаÑпишитеÑÑŒ", "Получите", MB_ICONINFORMATION);
604//! @endcode
605//}----------------------------------------------------------------------------------------------------------------
606
607inline HWND txWindow();
608
609//{----------------------------------------------------------------------------------------------------------------
610//! @ingroup Technical
611//! @brief Возвращает Ñтроку Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о текущей верÑии библиотеки.
612//!
613//! @return Строка Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о текущей верÑии библиотеки.
614//!
615//! @usage @code
616//! printf ("I personally love %s\n", txVersion());
617//! @endcode
618//}----------------------------------------------------------------------------------------------------------------
619
620inline const char* txVersion();
621
622//{----------------------------------------------------------------------------------------------------------------
623//! @ingroup Technical
624//! @brief Возвращает номер верÑии библиотеки.
625//!
626//! @return Ðомер верÑии библиотеки.
627//!
628//! @usage @code
629//! printf ("My magic number is %x\n", txVersionNumber());
630//! @endcode
631//}----------------------------------------------------------------------------------------------------------------
632
633inline unsigned txVersionNumber();
634
635//{----------------------------------------------------------------------------------------------------------------
636//! @ingroup Technical
637//! @brief Возвращает Ð¸Ð¼Ñ Ð¸ÑполнÑемого файла или изначальный заголовок окна TXLib.
638//!
639//! @param fileNameOnly Возвратить только полное Ð¸Ð¼Ñ Ð¸ÑполнÑемого файла, полученного через Win32 функцию
640//! GetFileModuleName (NULL, ...).
641//!
642//! @return fileNameOnly = true: Ð˜Ð¼Ñ Ð¸ÑполнÑемого файла @n
643//! fileNameOnly = false: Изначальный заголовок окна TXLib
644//!
645//! @note ВозвращаетÑÑ @b ÑтатичеÑÐºÐ°Ñ Ñтрока.
646//!
647//! @see txWindow(), txVersion(), txVersionNumber()
648//!
649//! @usage @code
650//! printf ("Смотрите на заголовок окна!");
651//!
652//! for (int done = 0; done <= 100; done++)
653//! {
654//! char title [1024] = "";
655//! sprintf (title, "%s - [%-10.*s] %d%%", txGetModuleFileName (false), done/10, "||||||||||", done);
656//!
657//! SetWindowText (txWindow(), title);
658//! txSleep (50);
659//! }
660//!
661//! txMessageBox ("Вот такой вот progress bar", "TXLib forever)");
662//! @endcode
663//}----------------------------------------------------------------------------------------------------------------
664
665const char* txGetModuleFileName (bool fileNameOnly = true);
666
667//! @}
668//}
669//=================================================================================================================
670
671//=================================================================================================================
672//{ Setting the parameters
673//! @name УÑтановка цветов и режимов риÑованиÑ
674//=================================================================================================================
675//! @{
676//{----------------------------------------------------------------------------------------------------------------
677//! @ingroup Drawing
678//! @brief ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ñ‹Ñ… цветов.
679//!
680//! См. TX_BLACK, TX_BLUE и другие цвета в ÑпиÑке выше.
681//!
682//! ЕÑли кому-то Ñти цвета не нравÑÑ‚ÑÑ (что неудивительно), вÑегда можно Ñделать Ñвои Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ RGB().
683//! См. пример ниже.
684//!
685//! @see txSetColor(), txSetFillColor(), txGetColor(), txGetFillColor(), txGetPixel(), RGB()
686//!
687//! @usage @code
688//! #include "TXLib.h"
689//!
690//! const COLORREF MY_DEEP_ROMANTIC_BLUE = RGB ( 0, 0, 129),
691//! MY_SHINING_MOONLIGHT = RGB (128, 255, 64);
692//! ...
693//!
694//! txSetColor (TX_RED);
695//! txSetFillColor (TX_NULL);
696//!
697//! txSetFillColor (MY_DEEP_ROMANTIC_BLUE); // Ð.И. Куинджи, "Ð›ÑƒÐ½Ð½Ð°Ñ Ð½Ð¾Ñ‡ÑŒ на Днепре"
698//! txSetColor (MY_SHINING_MOONLIGHT); // http://tanais.info/art/pic/kuindzhi1.html
699//! @endcode
700//!
701//! @hideinitializer
702//}----------------------------------------------------------------------------------------------------------------
703
704const COLORREF
705#ifdef FOR_DOXYGEN_ONLY
706 enum txColors {
707#endif
708
709 TX_BLACK = RGB ( 0, 0, 0), //!< Черный цвет.
710 TX_BLUE = RGB ( 0, 0, 128), //!< Темно-Ñиний цвет. <i>Плохо виден.</i>
711 TX_GREEN = RGB ( 0, 128, 0), //!< Зеленый цвет.
712 TX_CYAN = RGB ( 0, 128, 128), //!< Бирюзовый цвет.
713 TX_RED = RGB (128, 0, 0), //!< Темно-краÑный цвет. <i>Слишком темный.</i>
714 TX_MAGENTA = RGB (128, 0, 128), //!< Темно-малиновый цвет.
715 TX_BROWN = RGB (128, 128, 0), //!< Коричневый цвет. <i>ÐекраÑивый. Do it yourself with RGB().</i>
716 TX_ORANGE = RGB (255, 128, 0), //!< Оранжевый цвет.
717 TX_GRAY = RGB (160, 160, 160), //!< Серый цвет.
718 TX_DARKGRAY = RGB (128, 128, 128), //!< Темно-Ñерый цвет.
719 TX_LIGHTGRAY = RGB (192, 192, 192), //!< Светло-Ñерый цвет.
720 TX_LIGHTBLUE = RGB ( 0, 0, 255), //!< Светло-Ñиний цвет.
721 TX_LIGHTGREEN = RGB ( 0, 255, 128), //!< Светло-зеленый цвет.
722 TX_LIGHTCYAN = RGB ( 0, 255, 255), //!< Светло-бирюзовый цвет.
723 TX_LIGHTRED = RGB (255, 0, 128), //!< Светло-краÑный цвет. <i>Ðе Ñамого лучшего оттенка.</i>
724 TX_LIGHTMAGENTA = RGB (255, 0, 255), //!< Светло-малиновый цвет. <i>Еще менее лучшего оттенка.</i>
725 TX_PINK = RGB (255, 128, 255), //!< Розовый гламурный :)
726 TX_YELLOW = RGB (255, 255, 128), //!< Желтый цвет.
727 TX_WHITE = RGB (255, 255, 255), //!< Белый цвет.
728 TX_TRANSPARENT = 0xFFFFFFFF, //!< Прозрачный цвет. <i>Отключает риÑование.</i>
729 TX_NULL = TX_TRANSPARENT, //!< Прозрачный цвет. <i>Отключает риÑование.</i>
730
731// Цветовые каналы (компоненты) - Ñм. txExtractColor(), txRGB2HSL(), txHSL2RGB()
732
733 TX_HUE = 0x04000000, //!< Цветовой тон цвета в модели HSL
734 TX_SATURATION = 0x05000000, //!< ÐаÑыщенноÑть цвета в модели HSL
735 TX_LIGHTNESS = 0x06000000; //!< Светлота цвета в модели HSL
736
737#ifdef FOR_DOXYGEN_ONLY
738 };
739#endif
740
741//{----------------------------------------------------------------------------------------------------------------
742//! @ingroup Drawing
743//! @brief Создает (Ñмешивает) цвет из трех базовых цветов (компонент).
744//!
745//! @param red КоличеÑтво краÑного цвета в интервале [0; 255]
746//! @param green КоличеÑтво зеленого цвета в интервале [0; 255]
747//! @param blue КоличеÑтво Ñинего цвета в интервале [0; 255]
748//!
749//! @return Созданный цвет в формате COLORREF.
750//!
751//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txExtractColor(),
752//! txRGB2HSL(), txHSL2RGB()
753//!
754//! @usage @code
755//! txSetColor (RGB (255, 128, 0)); // КраÑный + половина зеленого = оранжевый
756//!
757//! int red = 20, green = 200, blue = 20;
758//! COLORREF color = RGB (red, green, blue);
759//! txSetFillColor (color);
760//!
761//! const COLORREF SKY_COLOR = RGB (0, 128, 255); // Создаем конÑтанту Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ цвета
762//!
763//! ...
764//! txSetFillColor (SKY_COLOR); // ИÑпользуем ее
765//! @endcode
766//}----------------------------------------------------------------------------------------------------------------
767
768#ifdef FOR_DOXYGEN_ONLY
769COLORREF RGB (int red, int green, int blue);
770#endif
771
772//{----------------------------------------------------------------------------------------------------------------
773//! @ingroup Drawing
774//! @brief УÑтанавливает текущий цвет и толщину линий, цвет текÑта.
775//!
776//! @param color Цвет линий и текÑта, Ñм. txColors, RGB()
777//! @param thickness Толщина линий
778//!
779//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
780//!
781//! @see txColor(), txGetColor(), txFillColor(), txGetFillColor(), txColors, RGB()
782//!
783//! @usage @code
784//! txSetColor (TX_RED);
785//! txSetColor (RGB (255, 128, 0), 5);
786//! @endcode
787//}----------------------------------------------------------------------------------------------------------------
788
789bool txSetColor (COLORREF color, double thickness = 1);
790
791//! @cond INTERNAL
792#define txSetColour txSetColor
793//! @endcond
794
795//{----------------------------------------------------------------------------------------------------------------
796//! @ingroup Drawing
797//! @brief УÑтанавливает текущий цвет линий и текÑта.
798//!
799//! @param red КоличеÑтво краÑного цвета в интервале [0; 1]
800//! @param green КоличеÑтво зеленого цвета в интервале [0; 1]
801//! @param blue КоличеÑтво Ñинего цвета в интервале [0; 1]
802//!
803//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
804//!
805//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor()
806//!
807//! @usage @code
808//! txColor (1.0, 1.0, 0.0); // КраÑный + зеленый = желтый
809//! txColor (1.0, 0.5, 0.25); // Ðечто оранжевое
810//! @endcode
811//}----------------------------------------------------------------------------------------------------------------
812
813bool txColor (double red, double green, double blue);
814
815//{----------------------------------------------------------------------------------------------------------------
816//! @ingroup Drawing
817//! @brief Возвращает текущий цвет линий и текÑта.
818//!
819//! @return Текущий цвет линий и текÑта, Ñм. txColors, RGB()
820//!
821//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB()
822//!
823//! @usage @code
824//! COLORREF color = txGetColor();
825//! @endcode
826//}----------------------------------------------------------------------------------------------------------------
827
828COLORREF txGetColor();
829
830//{----------------------------------------------------------------------------------------------------------------
831//! @ingroup Drawing
832//! @brief УÑтанавливает текущий цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ„Ð¸Ð³ÑƒÑ€.
833//!
834//! @param color Цвет заполнениÑ, Ñм. txColors, RGB()
835//!
836//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
837//!
838//! @see txFillColor(), txGetFillColor(), txColor(), txGetColor(), txColors, RGB()
839//!
840//! @usage @code
841//! txSetFillColor (TX_RED);
842//! txSetFillColor (RGB (255, 128, 0));
843//! @endcode
844//}----------------------------------------------------------------------------------------------------------------
845
846bool txSetFillColor (COLORREF color);
847
848//! @cond INTERNAL
849#define txSetFillColour txSetFillColor
850//! @endcond
851
852//{----------------------------------------------------------------------------------------------------------------
853//! @ingroup Drawing
854//! @brief УÑтанавливает текущий цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ„Ð¸Ð³ÑƒÑ€.
855//!
856//! @param red КоличеÑтво краÑного цвета в интервале [0; 1]
857//! @param green КоличеÑтво зеленого цвета в интервале [0; 1]
858//! @param blue КоличеÑтво Ñинего цвета в интервале [0; 1]
859//!
860//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
861//!
862//! @see txSetFillColor(), txGetFillColor(), txSetColor(), txGetColor()
863//!
864//! @usage @code
865//! txFillColor (1.0, 0.5, 0.25);
866//! @endcode
867//}----------------------------------------------------------------------------------------------------------------
868
869bool txFillColor (double red, double green, double blue);
870
871//{----------------------------------------------------------------------------------------------------------------
872//! @ingroup Drawing
873//! @brief Возвращает текущий цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ„Ð¸Ð³ÑƒÑ€.
874//!
875//! @return Текущий цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ„Ð¸Ð³ÑƒÑ€, Ñм. txColors, RGB()
876//!
877//! @see txSetFillColor(), txGetFillColor(), txSetColor(), txGetColor(), txColors, RGB()
878//!
879//! @usage @code
880//! COLORREF color = txGetFillColor();
881//! @endcode
882//}----------------------------------------------------------------------------------------------------------------
883
884COLORREF txGetFillColor();
885
886//{----------------------------------------------------------------------------------------------------------------
887//! @ingroup Drawing
888//! @brief УÑтанавливает режим взаимодейÑÑ‚Ð²Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð¾Ð² при риÑовании.
889//!
890//! При риÑовании графичеÑÐºÐ°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ° может не проÑто краÑить пикÑели на Ñкране, а Ñмешивать цвета
891//! Ñкрана и текущие цвета линий и заполнениÑ.
892//!
893//! @param mode Режим ÑÐ¼ÐµÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð¾Ð²
894//!
895//! @return Предыдущий режим взаимодейÑÑ‚Ð²Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð¾Ð², Ñм. txColors, RGB()
896//!
897//! @title Режимы взаимодейÑÑ‚Ð²Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð¾Ð²:
898//! @table @tr R2_COPYPEN @td ПикÑели = цвета киÑти (Ñамый нормальный режим :)
899//! @tr R2_NOTCOPYPEN @td ПикÑели = ~киÑть
900//! @tbr
901//! @tr R2_BLACK @td ПикÑели = черный цвет (цвет киÑти игнорируетÑÑ)
902//! @tr R2_WHITE @td ПикÑели = белый цвет (цвет киÑти игнорируетÑÑ)
903//! @tr R2_NOT @td ПикÑели = ~пикÑели (цвет киÑти игнорируетÑÑ)
904//! @tbr
905//! @tr R2_XORPEN @td ПикÑели = пикÑели ^ киÑть (удобный режим, cм. пример ниже)
906//! @tr R2_NOTXORPEN @td ПикÑели = ~ (пикÑели ^ киÑть)
907//! @tbr
908//! @tr R2_MASKPEN @td ПикÑели = пикÑели & киÑть
909//! @tr R2_NOTMASKPEN @td ПикÑели = ~ (пикÑели & киÑть)
910//! @tr R2_MASKNOTPEN @td ПикÑели = пикÑели & ~киÑть
911//! @tr R2_MASKPENNOT @td ПикÑели = ~пикÑели & киÑть
912//! @tbr
913//! @tr R2_MERGEPEN @td ПикÑели = пикÑели | киÑть
914//! @tr R2_NOTMERGEPEN @td ПикÑели = ~ (пикÑели | киÑть)
915//! @tr R2_MERGENOTPEN @td ПикÑели = пикÑели | ~киÑть
916//! @tr R2_MERGEPENNOT @td ПикÑели = ~пикÑели | киÑть
917//! @tbr
918//! @tr R2_NOP @td ПикÑели вообще не изменÑÑŽÑ‚ÑÑ.
919//! @endtable
920//!
921//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(),
922//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord()
923//!
924//! @usage @code
925//! txSetColor (TX_WHITE, 5); // При риÑовании белым цветом в режиме
926//! txSetROP2 (R2_XORPEN); // R2_XORPEN цвета на Ñкране инвертируютÑÑ
927//!
928//! txLine (100, 100, 200, 200); // РиÑуем первый раз - Ð»Ð¸Ð½Ð¸Ñ Ð¿Ð¾ÑвлÑетÑÑ
929//! txSleep (1000);
930//! txLine (100, 100, 200, 200); // РиÑуем второй раз - Ð»Ð¸Ð½Ð¸Ñ Ð¸Ñчезает (немного уличной магии)
931//!
932//! txSetROP2 (R2_COPYPEN); // ВоÑÑтанавливаем нормальный режим
933//! txLine (100, 100, 200, 200); // РиÑуем первый раз - Ð»Ð¸Ð½Ð¸Ñ Ð¿Ð¾ÑвлÑетÑÑ
934//!
935//! txLine (100, 100, 200, 200); // РиÑуем первый раз - Ð»Ð¸Ð½Ð¸Ñ Ð¾ÑтаетÑÑ, кто бы мог подумать
936//! @endcode
937//}----------------------------------------------------------------------------------------------------------------
938
939bool txSetROP2 (int mode = R2_COPYPEN);
940
941//{----------------------------------------------------------------------------------------------------------------
942//! @ingroup Drawing
943//! @brief Извлекает цветовую компоненту (цветовой канал) из Ñмешанного цвета.
944//!
945//! @param color Смешанный цвет
946//! @param component Ð˜Ð·Ð²Ð»ÐµÐºÐ°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð°, Ñм. txColors
947//!
948//! @return Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð°, Ñм. txColors
949//!
950//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txExtractColor(),
951//! txRGB2HSL(), txHSL2RGB()
952//!
953//! @usage @code
954//! int red = txExtractColor (color, TX_RED);
955//! int lightness = txExtractColor (TX_BLUE, TX_LIGHTNESS);
956//!
957//! Другие примеры Ñм. в функциÑÑ… AppearText(), AppearEarth() Примера 5 ("Циклы").
958//! @endcode
959//}----------------------------------------------------------------------------------------------------------------
960
961int txExtractColor (COLORREF color, COLORREF component);
962
963//{----------------------------------------------------------------------------------------------------------------
964//! @ingroup Drawing
965//! @brief Преобразует цвет из формата RGB в формат HSL.
966//!
967//! @param rgbColor Преобразуемый цвет в формате @strike ЕГР@endstrike RGB
968//!
969//! @return Созданный цвет в виде COLORREF.
970//!
971//! Формат @b RGB определÑетÑÑ ÐºÐ°Ðº
972//!
973//! - КраÑÐ½Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° цвета (Red), от 0 до 255.
974//! - Ð—ÐµÐ»ÐµÐ½Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° цвета (Green), от 0 до 255.
975//! - СинÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° цвета (Blue), от 0 до 255.
976//!
977//! Формат @b HSL определÑетÑÑ ÐºÐ°Ðº
978//!
979//! - Цветовой тон (Hue), от 0 до 255 <b>(не до 360).</b>
980//! - ÐаÑыщенноÑть (Saturation), от 0 до 255.
981//! - Светлота (Lightness), от 0 до 255.
982//!
983//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txExtractColor(),
984//! txRGB2HSL(), txHSL2RGB()
985//!
986//! @usage @code
987//! COLORREF hslColor = txRGB2HSL (TX_RED);
988//! @endcode
989//}----------------------------------------------------------------------------------------------------------------
990
991COLORREF txRGB2HSL (COLORREF rgbColor);
992
993//{----------------------------------------------------------------------------------------------------------------
994//! @ingroup Drawing
995//! @brief Преобразует цвет из формата HSL в формат RGB.
996//!
997//! @param hslColor Преобразуемый цвет в формате HSL
998//!
999//! @return Созданный цвет в виде COLORREF.
1000//!
1001//! Формат @b RGB определÑетÑÑ ÐºÐ°Ðº
1002//!
1003//! - КраÑÐ½Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° цвета (Red), от 0 до 255.
1004//! - Ð—ÐµÐ»ÐµÐ½Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° цвета (Green), от 0 до 255.
1005//! - СинÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° цвета (Blue), от 0 до 255.
1006//!
1007//! Формат @b HSL определÑетÑÑ ÐºÐ°Ðº
1008//!
1009//! - Цветовой тон (Hue), от 0 до 255 <b>(не до 360).</b>
1010//! - ÐаÑыщенноÑть (Saturation), от 0 до 255.
1011//! - Светлота (Lightness), от 0 до 255.
1012//!
1013//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txExtractColor(),
1014//! txRGB2HSL(), txHSL2RGB()
1015//!
1016//! @usage @code
1017//! int hue = 10, saturation = 128, lightness = 128;
1018//! COLORREF hslColor = RGB (hue, saturation, lightness);
1019//! txSetColor (txHSL2RGB (hslColor));
1020//! @endcode
1021//}----------------------------------------------------------------------------------------------------------------
1022
1023COLORREF txHSL2RGB (COLORREF hslColor);
1024
1025//! @}
1026//}
1027//=================================================================================================================
1028
1029//=================================================================================================================
1030//{ Drawing
1031//! @name РиÑование фигур
1032//=================================================================================================================
1033//! @{
1034//{----------------------------------------------------------------------------------------------------------------
1035//! @ingroup Drawing
1036//! @brief Стирает холÑÑ‚ текущим цветом заполнениÑ.
1037//!
1038//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1039//!
1040//! @see txSetFillColor(), txFillColor(), txGetFillColor(), txColors, RGB()
1041//!
1042//! @usage @code
1043//! txClear();
1044//! @endcode
1045//}----------------------------------------------------------------------------------------------------------------
1046
1047bool txClear();
1048
1049//{----------------------------------------------------------------------------------------------------------------
1050//! @ingroup Drawing
1051//! @brief РиÑует пикÑель (точку на Ñкране).
1052//!
1053//! @param x Х-координата точки
1054//! @param y Y-координата точки
1055//! @param color Цвет точки, Ñм. txColors, RGB()
1056//!
1057//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1058//!
1059//! @see txPixel(), txGetPixel(), txColors, RGB()
1060//!
1061//! @usage @code
1062//! txSetPixel (100, 100, TX_RED);
1063//! txSetPixel (100, 100, RGB (255, 128, 0));
1064//! @endcode
1065//}----------------------------------------------------------------------------------------------------------------
1066
1067inline bool txSetPixel (double x, double y, COLORREF color);
1068
1069//{----------------------------------------------------------------------------------------------------------------
1070//! @ingroup Drawing
1071//! @brief РиÑует пикÑель (точку на Ñкране).
1072//!
1073//! @param x Х-координата точки
1074//! @param y Y-координата точки
1075//! @param red КоличеÑтво краÑного цвета в интервале [0; 1]
1076//! @param green КоличеÑтво зеленого цвета в интервале [0; 1]
1077//! @param blue КоличеÑтво Ñинего цвета в интервале [0; 1]
1078//!
1079//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1080//!
1081//! @see txSetPixel(), txGetPixel()
1082//!
1083//! @usage @code
1084//! txSetPixel (100, 100, 1.0, 0.5, 0.25);
1085//! @endcode
1086//}----------------------------------------------------------------------------------------------------------------
1087
1088inline bool txPixel (double x, double y, double red, double green, double blue);
1089
1090//{----------------------------------------------------------------------------------------------------------------
1091//! @ingroup Drawing
1092//! @brief Возвращает текущий цвет точки (пикÑелÑ) на Ñкране.
1093//!
1094//! @param x Х-координата точки
1095//! @param y Y-координата точки
1096//!
1097//! @return Текущий цвет пикÑелÑ, Ñм. txColors, RGB()
1098//!
1099//! @see txSetPixel(), txPixel(), txColors, RGB()
1100//!
1101//! @usage @code
1102//! COLORREF color = txGetPixel (100, 200);
1103//!
1104//! if (txGetPixel (x, y) == TX_RED)
1105//! CarCrash (x, y); // Mess with the red - die like the rest
1106//! @endcode
1107//}----------------------------------------------------------------------------------------------------------------
1108
1109inline COLORREF txGetPixel (double x, double y);
1110
1111//{----------------------------------------------------------------------------------------------------------------
1112//! @ingroup Drawing
1113//! @brief РиÑует линию.
1114//!
1115//! @param x0 X-координата начальной точки
1116//! @param y0 Y-координата начальной точки
1117//! @param x1 X-координата конечной точки
1118//! @param y1 Y-координата конечной точки
1119//!
1120//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1121//!
1122//! Цвет и толщина линии задаетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ txSetColor().
1123//!
1124//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(),
1125//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord()
1126//!
1127//! @usage @code
1128//! txLine (100, 200, 400, 500);
1129//! @endcode
1130//}----------------------------------------------------------------------------------------------------------------
1131
1132bool txLine (double x0, double y0, double x1, double y1);
1133
1134//{----------------------------------------------------------------------------------------------------------------
1135//! @ingroup Drawing
1136//! @brief РиÑует прÑмоугольник.
1137//!
1138//! @param x0 X-координата верхнего левого угла
1139//! @param y0 Y-координата верхнего левого угла
1140//! @param x1 X-координата нижнего правого угла
1141//! @param y1 Y-координата нижнего правого угла
1142//!
1143//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1144//!
1145//! Цвет и толщина линий задаетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ txSetColor(), цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ - txSetFillColor().
1146//!
1147//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(),
1148//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord()
1149//!
1150//! @usage @code
1151//! txRectangle (100, 200, 400, 500);
1152//!
1153//! Win32::RoundRect (txDC(), 100, 200, 400, 500, 30, 30); // И такое еÑть. См. RoundRect в MSDN.com
1154//! @endcode
1155//}----------------------------------------------------------------------------------------------------------------
1156
1157bool txRectangle (double x0, double y0, double x1, double y1);
1158
1159//{----------------------------------------------------------------------------------------------------------------
1160//! @ingroup Drawing
1161//! @brief РиÑует ломаную линию или многоугольник.
1162//!
1163//! @param points МаÑÑив Ñтруктур POINT Ñ ÐºÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ‚Ð°Ð¼Ð¸ точек
1164//! @param numPoints КоличеÑтво точек в маÑÑиве
1165//!
1166//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1167//!
1168//! Цвет и толщина линий задаетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ txSetColor(), цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ - txSetFillColor().
1169//!
1170//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(),
1171//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord()
1172//!
1173//! @usage @code
1174//! POINT star[5] = {{150, 300}, {200, 100}, {250, 300}, {100, 200}, {300, 200}};
1175//! txPolygon (star, 5); // Я ÐºÑ€Ð¸Ð²Ð°Ñ Ð·Ð²ÐµÐ·Ð´Ð¾Ñ‡ÐºÐ°
1176//! @endcode
1177//}----------------------------------------------------------------------------------------------------------------
1178
1179bool txPolygon (const POINT points[], int numPoints);
1180
1181//{----------------------------------------------------------------------------------------------------------------
1182//! @ingroup Drawing
1183//! @brief РиÑует ÑллипÑ.
1184//!
1185//! @param x0 X-координата верхнего левого угла прÑмоугольника, опиÑанного вокруг ÑллипÑа
1186//! @param y0 Y-координата верхнего левого угла опиÑанного прÑмоугольника
1187//! @param x1 X-координата нижнего правого угла опиÑанного прÑмоугольника
1188//! @param y1 Y-координата нижнего правого угла опиÑанного прÑмоугольника
1189//!
1190//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1191//!
1192//! Цвет и толщина линий задаетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ txSetColor(), цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ - txSetFillColor().
1193//!
1194//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(),
1195//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord()
1196//!
1197//! @usage @code
1198//! txEllipse (100, 100, 300, 200);
1199//! @endcode
1200//}----------------------------------------------------------------------------------------------------------------
1201
1202bool txEllipse (double x0, double y0, double x1, double y1);
1203
1204//{----------------------------------------------------------------------------------------------------------------
1205//! @ingroup Drawing
1206//! @brief РиÑует окружноÑть или круг.
1207//!
1208//! @param x Х-координата центра
1209//! @param y Y-координата центра
1210//! @param r РадиуÑ
1211//!
1212//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1213//!
1214//! Цвет и толщина линий задаетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ txSetColor(), цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ - txSetFillColor().
1215//!
1216//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(),
1217//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord()
1218//!
1219//! @usage @code
1220//! txCircle (100, 100, 10);
1221//! @endcode
1222//}----------------------------------------------------------------------------------------------------------------
1223
1224bool txCircle (double x, double y, double r);
1225
1226//{----------------------------------------------------------------------------------------------------------------
1227//! @ingroup Drawing
1228//! @brief РиÑует дугу ÑллипÑа.
1229//!
1230//! @param x0 X-координата верхнего левого угла прÑмоугольника, опиÑанного вокруг ÑллипÑа, Ñодержащего дугу (Ñм. txEllipse)
1231//! @param y0 Y-координата верхнего левого угла прÑмоугольника
1232//! @param x1 X-координата нижнего правого угла прÑмоугольника
1233//! @param y1 Y-координата нижнего правого угла прÑмоугольника
1234//! @param startAngle Угол между направлением оÑи OX и началом дуги (в градуÑах)
1235//! @param totalAngle Величина дуги (в градуÑах)
1236//!
1237//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1238//!
1239//! Цвет и толщина линий задаетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ txSetColor(), цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ - txSetFillColor().
1240//!
1241//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(),
1242//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord()
1243//!
1244//! @usage @code
1245//! txArc (100, 100, 300, 200, 45, 270);
1246//! @endcode
1247//}----------------------------------------------------------------------------------------------------------------
1248
1249bool txArc (double x0, double y0, double x1, double y1, double startAngle, double totalAngle);
1250
1251//{----------------------------------------------------------------------------------------------------------------
1252//! @ingroup Drawing
1253//! @brief РиÑует Ñектор ÑллипÑа.
1254//!
1255//! @param x0 X-координата верхнего левого угла прÑмоугольника, опиÑанного вокруг ÑллипÑа, Ñодержащего дугу (Ñм. txEllipse)
1256//! @param y0 Y-координата верхнего левого угла прÑмоугольника
1257//! @param x1 X-координата нижнего правого угла прÑмоугольника
1258//! @param y1 Y-координата нижнего правого угла прÑмоугольника
1259//! @param startAngle Угол между направлением оÑи OX и началом Ñектора (в градуÑах)
1260//! @param totalAngle Величина Ñектора (в градуÑах)
1261//!
1262//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1263//!
1264//! Цвет и толщина линий задаетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ txSetColor(), цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ - txSetFillColor().
1265//!
1266//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(),
1267//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord()
1268//!
1269//! @usage @code
1270//! txPie (100, 100, 300, 200, 0, 180); // Enter Pacman
1271//! @endcode
1272//}----------------------------------------------------------------------------------------------------------------
1273
1274bool txPie (double x0, double y0, double x1, double y1, double startAngle, double totalAngle);
1275
1276//{----------------------------------------------------------------------------------------------------------------
1277//! @ingroup Drawing
1278//! @brief РиÑует хорду ÑллипÑа.
1279//!
1280//! @param x0 X-координата верхнего левого угла прÑмоугольника, опиÑанного вокруг ÑллипÑа, Ñодержащего дугу (Ñм. txEllipse)
1281//! @param y0 Y-координата верхнего левого угла прÑмоугольника
1282//! @param x1 X-координата нижнего правого угла прÑмоугольника
1283//! @param y1 Y-координата нижнего правого угла прÑмоугольника
1284//! @param startAngle Угол между направлением оÑи OX и началом хорды (в градуÑах)
1285//! @param totalAngle Величина хорды (в градуÑах)
1286//!
1287//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1288//!
1289//! Цвет и толщина линий задаетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ txSetColor(), цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ - txSetFillColor().
1290//!
1291//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(),
1292//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord()
1293//!
1294//! @usage @code
1295//! txChord (100, 100, 300, 200, 45, 270);
1296//! @endcode
1297//}----------------------------------------------------------------------------------------------------------------
1298
1299bool txChord (double x0, double y0, double x1, double y1, double startAngle, double totalAngle);
1300
1301//{----------------------------------------------------------------------------------------------------------------
1302//! @ingroup Drawing
1303//! @brief Заливает произвольный контур текущим цветом заполнениÑ.
1304//!
1305//! @param x Х-координата точки начала заливки
1306//! @param y Y-координата точки начала заливки
1307//! @param color Цвет заливаемой облаÑти (TX_TRANSPARENT - автоопределение)
1308//! @param mode Режим заливки (FLOODFILLSURFACE - заливка однородного фона)
1309//!
1310//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1311//!
1312//! Цвет Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°ÐµÑ‚ÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ txSetFillColor(). Ðе рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ - работает
1313//! довольно медленно.
1314//!
1315//! @title Режимы заливки: @table
1316//! @tr FLOODFILLSURFACE @td - Заливать облаÑть, указанную цветом color.
1317//! @tr FLOODFILLBORDER @td - Заливать до границы, указанной цветом color.
1318//! @endtable
1319//!
1320//! @see txSetFillColor(), txGetFillColor(), txColors, RGB(),
1321//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord()
1322//!
1323//! @usage @code
1324//! txSetFillColor (TX_PINK);
1325//! txLine (100, 200, 150, 100);
1326//! txLine (150, 100, 200, 200);
1327//! txLine (200, 200, 100, 200);
1328//! txFloodFill (150, 150);
1329//! @endcode
1330//}----------------------------------------------------------------------------------------------------------------
1331
1332bool txFloodFill (double x, double y, COLORREF color = TX_TRANSPARENT, DWORD mode = FLOODFILLSURFACE);
1333
1334//{----------------------------------------------------------------------------------------------------------------
1335//! @ingroup Drawing
1336//! @brief ФункциÑ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бы риÑовать треугольник.
1337//!
1338//! @param x1 Х-координата 1 точки
1339//! @param y1 Y-координата 1 точки
1340//! @param x2 Х-координата 2 точки
1341//! @param y2 Y-координата 2 точки
1342//! @param x3 Х-координата 3 точки
1343//! @param y3 Y-координата 3 точки
1344//!
1345//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° бы уÑпешна - true, иначе - false.
1346//!
1347//! @see txSetFillColor(), txGetFillColor(), txColors, RGB(),
1348//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord()
1349//!
1350//! @par См. также:
1351//! @ref Tutor_Params "Пример Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñми Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸"
1352//}----------------------------------------------------------------------------------------------------------------
1353
1354bool txTriangle (double x1, double y1, double x2, double y2, double x3, double y3)
1355 {
1356 (void)x1; (void)y1; (void)x2; (void)y2; (void)x3; (void)y3;
1357
1358 MessageBox (txWindow(),
1359 "Ðта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ðµ реализована в библиотеке, потому что вы Ñами легко можете реализовать ее\n"
1360 "как функцию Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ txPolygon(). См. \"Пример Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñми Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸\". ",
1361 "TXLib Ñообщает", MB_ICONINFORMATION);
1362
1363 return false;
1364 }
1365
1366//{----------------------------------------------------------------------------------------------------------------
1367//! @ingroup Drawing
1368//! @brief РиÑует человечка.
1369//!
1370//! @param x Х-координата человечка
1371//! @param y Y-координата человечка
1372//! @param sizeX Ширина человечка
1373//! @param sizeY Ð’Ñ‹Ñота человечка (также определÑет размер головы)
1374//! @param color Цвет человечка
1375//! @param handL Ð’Ñ‹Ñота подъема левой руки (отноÑительно выÑоты человечка)
1376//! @param handR Ð’Ñ‹Ñота подъема правой руки (отноÑительно выÑоты человечка)
1377//! @param twist Смещение @a Ñпины (отноÑительно ширины человечка)
1378//! @param head Ð’Ñ‹Ñота @a подъема головы (отноÑительно выÑоты человечка)
1379//! @param eyes Величина глаз (отноÑительно размера головы)
1380//! @param wink Моргание глаз (0 - оба открыты, -1 - закрыт левый, +1 - закрыт правый)
1381//! @param crazy Смещение глаз по вертикали (отноÑительно размера головы)
1382//! @param smile Улыбка (отноÑительно размера головы)
1383//! @param hair Длина Ð²Ð¾Ð»Ð¾Ñ (отноÑительно размера головы)
1384//! @param wind Ветер, развевающий волоÑÑ‹ (отноÑительно размера головы)
1385//!
1386//! @see txSetFillColor(), txColors, RGB(), txLine(), txCircle()
1387//!
1388//! @usage @code
1389//! txCreateWindow (800, 600);
1390//!
1391//! //-----------+---+----+-----+-----+----------+-----+-----+-----+----+----+----+-----+-----+----+-----
1392//! // | x | y |sizeX|sizeY| color |handL|handR|twist|head|eyes|wink|crazy|smile|hair|wind
1393//! //-----------+---+----+-----+-----+----------+-----+-----+-----+----+----+----+-----+-----+----+-----
1394//! // | | | | | | | | | | | | | | |
1395//! txDrawMan (125, 250, 200, 200, TX_WHITE, 0, 0, 0, 0, 0.8, 0, 0, 1.0, 0, 0);
1396//! txDrawMan (325, 250, 100, 200, TX_YELLOW, 0, 0, 0, 0, 0.8, 0, 0, -1.0, 2, 0);
1397//! txDrawMan (525, 250, 200, 100, TX_ORANGE, 0, 0, 0, 0, 1.0, 0, -1, 0.3, 1, 0);
1398//! txDrawMan (725, 250, 100, 100, TX_LIGHTRED, 0, 0, 0, 0, 1.0, 0, 1, -0.3, 3, 0);
1399//!
1400//! txDrawMan (125, 550, 200, 200, TX_WHITE, 0.3, 0.3, 0, 0, 0.8, -1, 1, 0.5, 2, -1);
1401//! txDrawMan (325, 550, 100, 200, TX_YELLOW, -0.5, -0.5, 0, 0.1, 0.8, 1, 0, -0.5, 3, 5);
1402//! txDrawMan (525, 550, 200, 100, TX_ORANGE, -0.5, 0.3, 0.2, 0, 0.8, -1, 1, 0.0, 10, -5);
1403//! txDrawMan (725, 550, 100, 100, TX_LIGHTRED, 0.3, -0.5, -0.4, 0, 0.8, 1, -1, 0.0, 1, 1);
1404//! @endcode
1405//}----------------------------------------------------------------------------------------------------------------
1406
1407void txDrawMan (int x, int y, int sizeX, int sizeY, COLORREF color, double handL, double handR, double twist,
1408 double head, double eyes, double wink, double crazy, double smile, double hair, double wind);
1409//! @}
1410//}
1411//=================================================================================================================
1412
1413//=================================================================================================================
1414//{ Drawing text
1415//! @name Работа Ñ Ñ‚ÐµÐºÑтом
1416//=================================================================================================================
1417//! @{
1418//{----------------------------------------------------------------------------------------------------------------
1419//! @ingroup Drawing
1420//! @brief РиÑует текÑÑ‚.
1421//!
1422//! @param x Ð¥-координата начальной точки текÑта
1423//! @param y Y-координата начальной точки текÑта
1424//! @param text ТекÑÑ‚Ð¾Ð²Ð°Ñ Ñтрока
1425//!
1426//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1427//!
1428//! Цвет текÑта задаетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ txSetColor(), выравнивание - txSetTextAlign().
1429//!
1430//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(),
1431//! txSelectFont(), txSetTextAign(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY()
1432//!
1433//! @usage @code
1434//! txTextOut (100, 100, "ЗдеÑÑŒ могла бы быть Ваша реклама.");
1435//! @endcode
1436//}----------------------------------------------------------------------------------------------------------------
1437
1438bool txTextOut (double x, double y, const char text[]);
1439
1440//{----------------------------------------------------------------------------------------------------------------
1441//! @ingroup Drawing
1442//! @brief РиÑует текÑÑ‚, размещенный в прÑмоугольной облаÑти.
1443//!
1444//! @param x0 X-координата верхнего левого угла облаÑти
1445//! @param y0 Y-координата верхнего левого угла облаÑти
1446//! @param x1 X-координата нижнего правого угла облаÑти
1447//! @param y1 Y-координата нижнего правого угла облаÑти
1448//! @param text ТекÑÑ‚Ð¾Ð²Ð°Ñ Ñтрока
1449//! @param format Флаги Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта
1450//!
1451//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1452//!
1453//! Цвет текÑта задаетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ txSetColor(), выравнивание - txSetTextAlign().
1454//!
1455//! @note Ðе выводит ничего, еÑли координаты идут в неверном порÑдке (еÑли x0 > x1 или y0 > y1).
1456//!
1457//! Флаги Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта Ñм. в MSDN (http://msdn.com), иÑкать "DrawText Function (Windows)":
1458//! http://msdn.microsoft.com/en-us/library/dd162498%28VS.85%29.aspx.
1459//!
1460//! <b>ÐвтоматичеÑкий переноÑ</b> текÑта на неÑколько Ñтрок включаетÑÑ, еÑли текÑÑ‚ ÑоÑтоит из неÑкольких
1461//! Ñтрок (еÑть Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один Ñимвол новой Ñтроки @b @c \\n).
1462//!
1463//! ЕÑли надо отформатировать текÑÑ‚ не по центру, а по левому или правому краю, то не забудьте указать
1464//! оÑтальные флаги форматированиÑ, еÑли они нужны: @c DT_VCENTER (вертикальное центрирование) @c |
1465//! @c DT_WORDBREAK (Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ Ð¿Ð¾ Ñловам) @c | @c DT_WORD_ELLIPSIS (Ñтавить многоточие в конце, еÑли текÑÑ‚
1466//! не умещаетÑÑ). См. значение флагов по умолчанию.
1467//!
1468//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(),
1469//! txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY()
1470//!
1471//! @usage @code
1472//! txSetColor (TX_BLACK);
1473//! txSetFillColor (TX_DARKGRAY); Win32::RoundRect (txDC(), 105, 105, 205, 255, 30, 30);
1474//! txSetFillColor (TX_WHITE); Win32::RoundRect (txDC(), 100, 100, 200, 250, 30, 30);
1475//!
1476//! txSelectFont ("Arial", 20, 0, FW_BOLD);
1477//! txDrawText (100, 100, 200, 250, "I hate it when I'm studying "
1478//! "and a Velociraptor throws bananas on me.\n");
1479//! @endcode
1480//}----------------------------------------------------------------------------------------------------------------
1481
1482bool txDrawText (double x0, double y0, double x1, double y1, const char text[],
1483 unsigned format = DT_CENTER | DT_VCENTER | DT_WORDBREAK | DT_WORD_ELLIPSIS);
1484
1485//{----------------------------------------------------------------------------------------------------------------
1486//! @ingroup Drawing
1487//! @brief Выбирает текущий шрифт.
1488//!
1489//! @param name Ðазвание шрифта
1490//! @param sizeY Ð’Ñ‹Ñота букв (размер по Y)
1491//! @param sizeX Ширина букв
1492//! @param bold ЖирноÑть шрифта (от 0 до 1000)
1493//! @param italic КурÑив
1494//! @param underline Подчеркивание
1495//! @param strikeout Зачеркивание
1496//! @param angle Угол поворота текÑта (в градуÑах)
1497//!
1498//! @return Ð’Ñегда true. ЕÑли шрифт не был найден, то уÑтанавливаетÑÑ ÑиÑтемный шрифт Windows
1499//! @c (SYSTEM_FIXED_FONT, Ñм. MSDN). СущеÑтвование шрифта можно проверить функцией txFontExist.
1500//!
1501//! @see txTextOut(), txFontExist()
1502//!
1503//! @usage @code
1504//! txSelectFont ("Comic Sans MS", 40);
1505//! txTextOut (100, 100, "И здеÑÑŒ могла бы быть Ваша реклама.");
1506//! txSelectFont ("Comic Sans MS", 40, 10, false, true, false, true, 15);
1507//! txTextOut (100, 200, "Ðо ее почему-то нет.");
1508//! @endcode
1509//}----------------------------------------------------------------------------------------------------------------
1510
1511bool txSelectFont (const char name[], double sizeY,
1512 double sizeX = -1,
1513 int bold = FW_DONTCARE,
1514 bool italic = false,
1515 bool underline = false,
1516 bool strikeout = false,
1517 double angle = 0);
1518
1519//{----------------------------------------------------------------------------------------------------------------
1520//! @ingroup Drawing
1521//! @brief ВычиÑлÑет размеры текÑтовой надпиÑи.
1522//!
1523//! @param text ТекÑÑ‚Ð¾Ð²Ð°Ñ Ñтрока
1524//!
1525//! @return Размеры надпиÑи в Ñтруктуре SIZE.
1526//!
1527//! @see txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY()
1528//!
1529//! @usage @code
1530//! SIZE size = txGetTextExtent (text);
1531//! txTextOut (100 + size.cx / 2, 200 + size.cy / 2, text);
1532//! @endcode
1533//}----------------------------------------------------------------------------------------------------------------
1534
1535SIZE txGetTextExtent (const char text[]);
1536
1537//{----------------------------------------------------------------------------------------------------------------
1538//! @ingroup Drawing
1539//! @brief ВычиÑлÑет ширину текÑтовой надпиÑи.
1540//!
1541//! @param text ТекÑÑ‚Ð¾Ð²Ð°Ñ Ñтрока
1542//!
1543//! @return Ширина надпиÑи.
1544//!
1545//! @see txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY()
1546//!
1547//! @usage @code
1548//! txTextOut (100 + txGetTextExtentX (text) / 2, 200 + txGetTextExtentY (text) / 2, text);
1549//! @endcode
1550//}----------------------------------------------------------------------------------------------------------------
1551
1552int txGetTextExtentX (const char text[]);
1553
1554//{----------------------------------------------------------------------------------------------------------------
1555//! @ingroup Drawing
1556//! @brief ВычиÑлÑет выÑоту текÑтовой надпиÑи.
1557//!
1558//! @param text ТекÑÑ‚Ð¾Ð²Ð°Ñ Ñтрока
1559//!
1560//! @return Ð’Ñ‹Ñота надпиÑи.
1561//!
1562//! @see txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY()
1563//!
1564//! @usage @code
1565//! txTextOut (100 + txGetTextExtentX (text) / 2, 200 + txGetTextExtentY (text) / 2, text);
1566//! @endcode
1567//}----------------------------------------------------------------------------------------------------------------
1568
1569int txGetTextExtentY (const char text[]);
1570
1571//{----------------------------------------------------------------------------------------------------------------
1572//! @ingroup Drawing
1573//! @brief УÑтанавливает текущее выравнивание текÑта.
1574//!
1575//! @param align Флаги выравниваниÑ
1576//!
1577//! @return Предыдущее ÑоÑтоÑние Ð²Ñ‹Ñ€Ð°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑта.
1578//!
1579//! @title Флаги выравниваниÑ: @table
1580//! @tr TA_BASELINE @td Точка (X,Y) определÑет базовую линию текÑта.
1581//! @tr TA_BOTTOM @td Точка (X,Y) определÑет нижнюю Ñторону опиÑанного прÑмоугольника (текÑÑ‚ лежит выше Ñтой точки).
1582//! @tr TA_TOP @td Точка (X,Y) определÑет верхнюю Ñторону опиÑанного прÑмоугольника (текÑÑ‚ лежит ниже Ñтой точки).
1583//! @tbr
1584//! @tr TA_CENTER @td ТекÑÑ‚ будет выровнен по горизонтали отноÑительно точки (X,Y).
1585//! @tr TA_LEFT @td Точка (X,Y) определÑет левую Ñторону опиÑанного прÑмоугольника (текÑÑ‚ лежит правее Ñтой точки).
1586//! @tr TA_RIGHT @td Точка (X,Y) определÑет правую Ñторону опиÑанного прÑмоугольника (текÑÑ‚ лежит левее Ñтой точки).
1587//! @endtable
1588//!
1589//! @see txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY()
1590//!
1591//! @usage @code
1592//! txSetTextAlign (TA_RIGHT);
1593//! txTextOut (700, 100, "Чтобы доÑтуп был легок и быÑтр,");
1594//! txTextOut (700, 150, "Переменную клади в региÑтр.");
1595//! txSetTextAlign();
1596//! @endcode
1597//}----------------------------------------------------------------------------------------------------------------
1598
1599unsigned txSetTextAlign (unsigned align = TA_CENTER | TA_BASELINE);
1600
1601//{----------------------------------------------------------------------------------------------------------------
1602//! @ingroup Drawing
1603//! @brief Ищет шрифт по его названию.
1604//!
1605//! @param name Ðазвание шрифта
1606//!
1607//! @return Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ шрифте в Ñтруктуре LOGFONT. ЕÑли шрифт не найден, возвращает NULL.
1608//!
1609//! @see txTextOut(), txSelectFont()
1610//!
1611//! @usage @code
1612//! if (txFontExist ("Comic Sans MS")) txSelectFont ("Comic Sans MS", 30);
1613//! else txSelectFont ("Times New Roman", 30);
1614//!
1615//! txTextOut (100, 100, "Комик ли СанÑ?");
1616//! @endcode
1617//}----------------------------------------------------------------------------------------------------------------
1618
1619LOGFONT* txFontExist (const char name[]);
1620
1621//! @}
1622//}
1623//=================================================================================================================
1624
1625//=================================================================================================================
1626//{ Drawing to memory DC and image loading
1627//! @name РиÑование в памÑти (на "виртуальном холÑте") и загрузка изображений
1628//=================================================================================================================
1629//! @{
1630//{----------------------------------------------------------------------------------------------------------------
1631//! @ingroup Drawing
1632//! @brief Создает дополнительный холÑÑ‚ (контекÑÑ‚ риÑованиÑ, Device Context, DC) в памÑти.
1633//!
1634//! @param sizeX Ширина холÑта
1635//! @param sizeY Ð’Ñ‹Ñота холÑта
1636//! @param bitmap Bitmap to be associated with DC
1637//!
1638//! @return ДеÑкриптор (ÑиÑтемный номер, выданный Windows) Ñозданного холÑта (контекÑта риÑованиÑ).
1639//!
1640//! @warning Созданный контекÑÑ‚ затем будет нужно @b обÑзательно удалить при помощи txDeleteDC(). @n
1641//! <small>When the program will be shutting down, TXLib will try to delete DCs which were not deleted,
1642//! but this is not guaranteed.</small>
1643//!
1644//! @see txCreateWindow(), txCreateCompatibleDC(), txLoadImage(), txDeleteDC()
1645//!
1646//! @usage @code
1647//! HDC save = txCreateCompatibleDC (100, 100);
1648//!
1649//! txBitBlt (save, 0, 0, 100, 100, txDC(), 0, 0); // СохранÑем фон
1650//!
1651//! txTextOut (20, 20, "Boo!");
1652//! txSleep (2000);
1653//!
1654//! txBitBlt (txDC(), 0, 0, 100, 100, save, 0, 0); // ТекÑÑ‚ иÑчезает
1655//!
1656//! txDeleteDC (save);
1657//! @endcode
1658//}----------------------------------------------------------------------------------------------------------------
1659
1660HDC txCreateCompatibleDC (double sizeX, double sizeY, HBITMAP bitmap = NULL);
1661
1662//{----------------------------------------------------------------------------------------------------------------
1663//! @ingroup Drawing
1664//! @brief Загружает из файла изображение в формате BMP. Делает Ñто довольно медленно.
1665//!
1666//! @param filename Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ в формате BMP
1667//! @param imageFlags Тип загружаемого изображениÑ, Ñм. ниже
1668//! @param loadFlags Флаги загрузки изображениÑ, Ñм. ниже
1669//!
1670//! @return ДеÑкриптор Ñозданного контекÑта риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² памÑти, Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð½Ñ‹Ð¼ изображением.
1671//! ЕÑли изображение не загружено (не найден файл, неверный формат файла и Ñ‚.д.), то NULL.
1672//!
1673//! @warning Изображение загружаетÑÑ Ð² Ñоздаваемый контекÑÑ‚ риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² памÑти ("виртуальный холÑÑ‚"), который затем
1674//! будет нужно <b>обÑзательно удалить</b> при помощи txDeleteDC(). @n
1675//! <small>When the program will be shutting down, TXLib will try to delete DCs which were not deleted,
1676//! but this is not guaranteed.</small>
1677//!
1678//! @note Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÑŽÑ‚ÑÑ <b>только в формате BMP.</b> ЕÑли взÑть файл другого формата, например JPG,
1679//! и переименовать его Ñо Ñменой раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ð° BMP, то от Ñтого формат не изменитÑÑ. Такое изображение
1680//! загружено не будет.
1681//!
1682//! ЕÑли Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²ÐµÑ€Ð½ÑƒÐ»Ð° NULL, то надо прежде вÑего <b>проверить наличие файла изображениÑ</b> по
1683//! указанному в программе пути и формат файла. ЕÑли путь к файлу не указан (или указан как неполный),
1684//! то путь отÑчитываетÑÑ Ð¾Ñ‚ текущей папки программы, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ не Ñовпадать текущей папкой Ñреды
1685//! программированиÑ. Текущую папку программы можно поÑмотреть по команде About в ÑиÑтемном меню
1686//! (она указана там как "Run from").
1687//!
1688//! @note <b>Ðе надо чаÑто загружать</b> одно и то же изображение, оÑобенно в цикле. От Ñтого программа начинает
1689//! тормозить! @n
1690//! @note Загрузите один раз @a перед циклом, потом иÑпользуйте много раз. ПоÑмотрите, как Ñто Ñделано в примере
1691//! TX\Examples\Tennis\Tennis.cpp.
1692//!
1693//! @title Типы изображений:
1694//! @table @tr IMAGE_BITMAP @td Загружает риÑунок в формате BMP
1695//! @tr IMAGE_CURSOR @td Загружает курÑор
1696//! @tr IMAGE_ICON @td Загружает иконку
1697//! @endtable
1698//!
1699//! @title Флаги загрузки:
1700//! @table @tr LR_CREATEDIBSECTION @td Создает DIB (device-indepandent bitmap), удобную Ð´Ð»Ñ Ð¿Ñ€Ñмого доÑтупа к данным
1701//! @tr LR_LOADFROMFILE @td Загружает из файла (еÑли Ñтот флаг не указан, то загружает из реÑурÑа)
1702//! @tr ОÑтальные флаги загрузки @td Ñм. на MSDN.com, поиÑк "LoadImage function".
1703//! @endtable
1704//!
1705//! @see txCreateWindow(), txCreateCompatibleDC(), txLoadImage(), txDeleteDC(), txBitBlt(), txAlphaBlend(), txTransparentBlt()
1706//!
1707//! @usage Пример иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñм. в файле TX\Examples\Tennis\Tennis.cpp.
1708//! @code
1709//! HDC background_FromTXLibHelp = txLoadImage ("Resources\\Images\\Background.bmp");
1710//!
1711//! if (!background_FromTXLibHelp)
1712//! txMessageBox ("Ðе могу загрузить фон из Background.bmp", "Да, Ñ Ñкопировал Ñто из примера");
1713//!
1714//! // Ðе надо чаÑто загружать одно и то же изображение, оÑобенно в цикле - программа будет тормозить!
1715//! // Загрузите один раз перед циклом, потом иÑпользуйте много раз.
1716//! // ПоÑмотрите, как Ñделано в примере TX\Examples\Tennis\Tennis.cpp.
1717//!
1718//! txBitBlt (txDC(), 0, 0, 800, 600, background_FromTXLibHelp, 0, 0);
1719//!
1720//! ...
1721//! txDeleteDC (background_FromTXLibHelp);
1722//! @endcode
1723//}----------------------------------------------------------------------------------------------------------------
1724
1725HDC txLoadImage (const char filename[], unsigned imageFlags = IMAGE_BITMAP, unsigned loadFlags = LR_LOADFROMFILE);
1726
1727//{----------------------------------------------------------------------------------------------------------------
1728//! @ingroup Drawing
1729//! @brief Уничтожает холÑÑ‚ (контекÑÑ‚ риÑованиÑ, DC) в памÑти.
1730//!
1731//! @param dc КонтекÑÑ‚ риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑƒÐ½Ð¸Ñ‡Ñ‚Ð¾Ð¶ÐµÐ½Ð¸Ñ. @n
1732//! ЕÑли передан указатель, то поÑле ÑƒÐ½Ð¸Ñ‡Ñ‚Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ указателю запиÑываетÑÑ NULL.
1733//!
1734//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1735//!
1736//! @see txCreateWindow(), txCreateCompatibleDC(), txLoadImage(), txDeleteDC()
1737//!
1738//! @usage Пример иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñм. в файле TX\Examples\Tennis\Tennis.cpp.
1739//! @code
1740//! HDC background_FromTXLibHelp = txLoadImage ("Resources\\Images\\Background.bmp");
1741//!
1742//! if (!background_FromTXLibHelp)
1743//! txMessageBox ("Ðе могу загрузить фон из Background.bmp, и Ñ Ñкопировал Ñто из примера.", "Oh, not now");
1744//!
1745//! // См. важный комментарий в примере к функции txLoadImage!
1746//!
1747//! txBitBlt (txDC(), 0, 0, 800, 600, background_FromTXLibHelp, 0, 0);
1748//!
1749//! ...
1750//! txDeleteDC (background_FromTXLibHelp);
1751//! @endcode
1752//}----------------------------------------------------------------------------------------------------------------
1753//@ {
1754
1755bool txDeleteDC (HDC dc);
1756
1757//! @cond INTERNAL
1758bool txDeleteDC (HDC* dc);
1759//! @endcond
1760
1761//@ }
1762//{----------------------------------------------------------------------------------------------------------------
1763//! @ingroup Drawing
1764//! @brief Копирует изображение Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ холÑта (контекÑта риÑованиÑ, DC) на другой.
1765//!
1766//! @param dest КонтекÑÑ‚ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (куда копировать)
1767//! @param xDest Ð¥-координата верхнего левого угла изображениÑ-приемника
1768//! @param yDest Y-координата верхнего левого угла изображениÑ-приемника
1769//! @param width Ширина копируемого изображениÑ
1770//! @param height Ð’Ñ‹Ñота копируемого изображениÑ
1771//! @param src КонтекÑÑ‚ иÑточника (откуда копировать)
1772//! @param xSrc Ð¥-координата верхнего левого угла изображениÑ-иÑточника
1773//! @param ySrc Y-координата верхнего левого угла изображениÑ-иÑточника
1774//! @param rOp РаÑÑ‚Ñ€Ð¾Ð²Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ
1775//!
1776//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1777//!
1778//! @warning ЕÑли контекÑты Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ иÑточника равны NULL, то они не ÑущеÑтвуют и копирование вызовет ошибку.
1779//! Ðаиболее чаÑÑ‚Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð° - ошибка при загрузке файла Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ отÑутÑтвие проверки на Ñту ошибку.
1780//! Пример Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¾Ð¹ на правильноÑть загрузки Ñм. ниже.
1781//!
1782//! @title Режимы копированиÑ:
1783//! @table @tr SRCCOPY @td ПроÑто копирует :) - Ñамый раÑпроÑтраненный режим
1784//! @tbr
1785//! @tr BLACKNESS @td ЗаполнÑет холÑÑ‚-приемник черным цветом (холÑÑ‚-иÑточник игнорируетÑÑ).
1786//! @tr WHITENESS @td ЗаполнÑет холÑÑ‚-приемник белым цветом (холÑÑ‚-иÑточник игнорируетÑÑ).
1787//! @tr DSTINVERT @td Инвертирует цвета на холÑте-приемнике (холÑÑ‚-иÑточник игнорируетÑÑ).
1788//! @tr PATCOPY @td Копирует цвет текущей киÑти холÑта-приемника.
1789//! @tbr
1790//! @tr MERGECOPY @td Приемник = приемник & цвет текущей киÑти иÑточника.
1791//! @tr MERGEPAINT @td Приемник = ~ приемник | иÑточник
1792//! @tr NOTSRCCOPY @td Приемник = ~ иÑточник
1793//! @tr NOTSRCERASE @td Приемник = ~ (приемник | иÑточник)
1794//! @tr PATINVERT @td Приемник = киÑть приемника ^ приемник
1795//! @tr PATPAINT @td Приемник = (киÑть приемника | ~иÑточник) | приемник
1796//! @tr SRCAND @td Приемник = приемник & иÑточник
1797//! @tr SRCERASE @td Приемник = ~приемник & иÑточник
1798//! @tr SRCINVERT @td Приемник = приемник ^ иÑточник
1799//! @tr SRCPAINT @td Приемник = приемник | иÑточник
1800//! @endtable
1801//!
1802//! @see txAlphaBlend(), txTransparentBlt(), txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB()
1803//!
1804//! @usage Пример иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñм. в файле TX\Examples\Tennis\Tennis.cpp.
1805//! @code
1806//! HDC background_FromTXLibHelp = txLoadImage ("Resources\\Images\\Background.bmp");
1807//!
1808//! if (!background_FromTXLibHelp)
1809//! ("Ðе могу фон из загрузить Background.bmp, и да, Ñ Ð²Ð·Ñл Ñтот код из примера.", "Once again :(");
1810//!
1811//! // См. важный комментарий в примере к функции txLoadImage!
1812//!
1813//! txBitBlt (txDC(), 0, 0, 800, 600, background_FromTXLibHelp, 0, 0);
1814//!
1815//! ...
1816//! txDeleteDC (background_FromTXLibHelp);
1817//! @endcode
1818//}----------------------------------------------------------------------------------------------------------------
1819
1820bool txBitBlt (HDC dest, double xDest, double yDest, double width, double height,
1821 HDC src, double xSrc = 0, double ySrc = 0, DWORD rOp = SRCCOPY);
1822
1823//{----------------------------------------------------------------------------------------------------------------
1824//! @ingroup Drawing
1825//! @brief Копирует изображение Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ холÑта (контекÑта риÑованиÑ, DC) на другой
1826//! Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ прозрачноÑти.
1827//!
1828//! @param dest КонтекÑÑ‚ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (куда копировать)
1829//! @param xDest Ð¥-координата верхнего левого угла изображениÑ-приемника
1830//! @param yDest Y-координата верхнего левого угла изображениÑ-приемника
1831//! @param width Ширина копируемого изображениÑ, неотрицательнаÑ
1832//! @param height Ð’Ñ‹Ñота копируемого изображениÑ, неотрицательнаÑ
1833//! @param src КонтекÑÑ‚ иÑточника (откуда копировать)
1834//! @param xSrc Ð¥-координата верхнего левого угла изображениÑ-иÑточника
1835//! @param ySrc Y-координата верхнего левого угла изображениÑ-иÑточника
1836//! @param transColor Цвет, который будет ÑчитатьÑÑ Ð¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ñ‹Ð¼
1837//!
1838//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1839//!
1840//! @warning ЕÑли контекÑты Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ иÑточника равны NULL, то они не ÑущеÑтвуют и копирование вызовет ошибку.
1841//! Ðаиболее чаÑÑ‚Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð° - ошибка при загрузке файла Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ отÑутÑтвие проверки на Ñту ошибку.
1842//! Пример Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¾Ð¹ на правильноÑть загрузки Ñм. ниже.
1843//!
1844//! Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ TransparentBlt из Win32 API может маÑштабировать изображение. Ð’ txTransparentBlt
1845//! Ñто убрано Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð¸Ñ Ð¸ÑпользованиÑ. If you need image scaling, use original function
1846//! TransparentBlt and don't mess with stupid TX-based tools. (See implementation of txTransparentBlt
1847//! in TXLib.h).
1848//!
1849//! @note ЕÑли TransparentBlt не работает, иÑпользуйте функцию AlphaBlend, она вообще лучше.
1850//!
1851//! @see txBitBlt(), txTransparentBlt(), txLoadImage(), txCreateCompatibleDC()
1852//!
1853//! @usage Пример иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñм. в файле TX\Examples\Tennis\Tennis.cpp.
1854//! @code
1855//! HDC superman_FromTXLibHelp = txLoadImage ("Resources\\Images\\Superman.bmp");
1856//!
1857//! if (!superman_FromTXLibHelp)
1858//! txMessageBox ("Cannot load superman, all the monsters will succeed (I copied them from TXLib Help)", "Sorry");
1859//!
1860//! // См. важный комментарий в примере к функции txLoadImage!
1861//!
1862//! txTransparentBlt (txDC(), 0, 0, 800, 600, superman_FromTXLibHelp, 0, 0);
1863//!
1864//! // Рможно и так:
1865//! Win32::TransparentBlt (txDC(), 0, 0, 800, 600, superman_FromTXLibHelp, 0, 0, 80, 60, -1); // 10-кратное увеличение
1866//! // Познай мощь Win32 GDI, отказавшиÑÑŒ от TXLib'а! :) Ñм. TransparentBlt в MSDN.com.
1867//!
1868//! ...
1869//! txDeleteDC (superman_FromTXLibHelp); // So pity :( But he was only a copy from TXLib Help.
1870//! @endcode
1871//}----------------------------------------------------------------------------------------------------------------
1872
1873bool txTransparentBlt (HDC dest, double xDest, double yDest, double width, double height,
1874 HDC src, double xSrc = 0, double ySrc = 0, COLORREF transColor = TX_BLACK);
1875
1876//{----------------------------------------------------------------------------------------------------------------
1877//! @ingroup Drawing
1878//! @brief Копирует изображение Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ холÑта (контекÑта риÑованиÑ, DC) на другой
1879//! Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ прозрачноÑти.
1880//!
1881//! @param dest КонтекÑÑ‚ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (куда копировать)
1882//! @param xDest Ð¥-координата верхнего левого угла изображениÑ-приемника
1883//! @param yDest Y-координата верхнего левого угла изображениÑ-приемника
1884//! @param width Ширина копируемого изображениÑ, неотрицательнаÑ
1885//! @param height Ð’Ñ‹Ñота копируемого изображениÑ, неотрицательнаÑ
1886//! @param src КонтекÑÑ‚ иÑточника (откуда копировать). Должен иметь 32-битовый формат и альфа-канал (Ñм. ниже).
1887//! @param xSrc Ð¥-координата верхнего левого угла изображениÑ-иÑточника, должна быть в пределах размера иÑточника.
1888//! @param ySrc Y-координата верхнего левого угла изображениÑ-иÑточника, должна быть в пределах размера иÑточника.
1889//! @param alpha ÐžÐ±Ñ‰Ð°Ñ Ð¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð¾Ñть изображениÑ, в дополнение к альфа-каналу (0 - вÑе прозрачно, 1 - иÑпользовать только альфа-канал).
1890//!
1891//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
1892//!
1893//! @warning ЕÑли контекÑты Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ иÑточника равны NULL, то они не ÑущеÑтвуют и копирование вызовет ошибку.
1894//! Ðаиболее чаÑÑ‚Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð° - ошибка при загрузке файла Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ отÑутÑтвие проверки на Ñту ошибку.
1895//! Пример Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¾Ð¹ на правильноÑть загрузки Ñм. ниже.
1896//!
1897//! Изображение-иÑточник и изображение-приемник не могут налагатьÑÑ Ð´Ñ€ÑƒÐ³ на друга.
1898//!
1899//! @note Изображение должно быть загружено Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ txLoadImage() и иметь <b>32-битовый RGBA-формат.</b>
1900//! Дополнительный канал <b>(A, альфа-канал)</b> Ñтого формата отвечает за прозрачноÑть учаÑтков
1901//! изображениÑ. 24-битовый формат (TrueColor RGB) Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ txAlphaBlend не поддерживает.
1902//!
1903//! Ðльфа-канал можно Ñделать, например, в Adobe Photoshop, командой "Ðовый канал (New Channel)" в палитре
1904//! каналов (Channels). Черный цвет в альфа-канале ÑоответÑтвует полной прозрачноÑти, белый - полной
1905//! непрозрачноÑти. <b>При Ñтом в прозрачных облаÑÑ‚ÑÑ… Ñамо изображение (в каналах R, G, B) должно быть
1906//! черным, и чем прозрачнее, тем чернее.</b> См. изображение Ñ Ð°Ð»ÑŒÑ„Ð°-каналом в примере
1907//! TX\Examples\Tennis\Tennis.cpp (файл Ñ Ñ‚ÐµÐ½Ð½Ð¸Ñной ракеткой: TX\Examples\Tennis\Resources\Images\Racket.bmp).
1908//!
1909//! Строго говорÑ, надо домножить каналы R,G,B на альфа-канал: <tt>R,G,B *= A</tt>. ПолучитÑÑ Ð²Ð¾Ñ‚ что:
1910//!
1911//! - ЕÑли значение альфа-канала Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ пикÑÐµÐ»Ñ Ñ€Ð°Ð²Ð½Ð¾ 0 (Ð¿Ð¾Ð»Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð¾Ñть), тогда значениÑ
1912//! каналов R,G,B Ð´Ð»Ñ Ñтого пикÑÐµÐ»Ñ Ñ‚Ð°ÐºÐ¶Ðµ Ñтанут 0 (Ñто черный цвет).
1913//! - ЕÑли значение альфа-канала Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ пикÑÐµÐ»Ñ Ñ€Ð°Ð²Ð½Ð¾ 255 (Ð¿Ð¾Ð»Ð½Ð°Ñ Ð½ÐµÐ¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð¾Ñть), тогда значениÑ
1914//! каналов R,G,B Ð´Ð»Ñ Ñтого пикÑÐµÐ»Ñ Ð½Ðµ изменÑÑ‚ÑÑ.
1915//! - Ð”Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… значений альфа-канала, пикÑели Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñтанут темнее.
1916//!
1917//! Ð’ Photoshop Ñто можно Ñделать командой <b>Image @d Apply Image</b> Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸:
1918//! @table @tr Source: @td <i>Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ¾Ð¹</i>
1919//! @tr Layer: @td Background
1920//! @tr @b Channel: @td <b> Alpha 1</b>
1921//! @tr Blending: @td Multiply
1922//! @tr Opacity: @td 100%
1923//! @endtable
1924//!
1925//! @note Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ AlphaBlend из Win32 API может маÑштабировать изображение. Ð’ txAlphaBlend Ñто
1926//! убрано Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð¸Ñ Ð¸ÑпользованиÑ. If you still need image scaling, use original function AlphaBlend
1927//! and don't mess with stupid TX-based tools. (See implementation of txAlphaBlend in TXLib.h).
1928//!
1929//! @see txBitBlt(), txTransparentBlt(), txLoadImage(), txCreateCompatibleDC()
1930//!
1931//! @usage Пример иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñм. в файле TX\Examples\Tennis\Tennis.cpp.
1932//! @code
1933//! HDC batman_FromTXLibHelp = txLoadImage ("Resources\\Images\\Batman.bmp");
1934//!
1935//! if (!batman_FromTXLibHelp)
1936//! txMessageBox ("Call to Batman failed because I copied it from TXLib Help", "Do save yourself");
1937//!
1938//! // См. важный комментарий в примере к функции txLoadImage!
1939//!
1940//! txAlphaBlend (txDC(), 0, 0, 800, 600, batman_FromTXLibHelp, 0, 0);
1941//!
1942//! ...
1943//! txDeleteDC (batman_FromTXLibHelp); // Don't worry, batman will return in "Batman returns" movie, later...
1944//! ...
1945//!
1946//! return batman_FromTXLibHelp; // ...and there he comes -- in TXLib copy form
1947//! @endcode
1948//}----------------------------------------------------------------------------------------------------------------
1949
1950bool txAlphaBlend (HDC dest, double xDest, double yDest, double width, double height,
1951 HDC src, double xSrc = 0, double ySrc = 0, double alpha = 1.0);
1952//! @}
1953//}
1954
1955//=================================================================================================================
1956//{ Utility functions
1957//! @name Ð’Ñпомогательные функции
1958//=================================================================================================================
1959//! @{
1960//{----------------------------------------------------------------------------------------------------------------
1961//! @ingroup Drawing
1962//! @brief Задерживает выполнение программы на определенное времÑ.
1963//!
1964//! @param time Задержка в миллиÑекундах.
1965//!
1966//! @return Задержка в миллиÑекундах, Ð¿Ñ€Ð¾Ð¸Ð·Ð¾ÑˆÐµÐ´ÑˆÐ°Ñ Ð² дейÑтвительноÑти.
1967//!
1968//! @note <b>Перед началом задержки изображение в окне обÑзательно обновитÑÑ,</b> даже еÑли риÑование
1969//! заблокировано через txBegin().
1970//!
1971//! @see txBegin(), txEnd(), txUpdateWindow()
1972//!
1973//! @usage @code
1974//! txSleep (500); // ПП: ПоÑпать ПолÑекунды
1975//! @endcode
1976//}----------------------------------------------------------------------------------------------------------------
1977
1978double txSleep (double time);
1979
1980//{----------------------------------------------------------------------------------------------------------------
1981//! @ingroup Drawing
1982//! @brief Блокирует обновление Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð°, во избежание миганиÑ.
1983//!
1984//! Ð”Ð»Ñ ÑнÑÑ‚Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ иÑпользуетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ txEnd().
1985//!
1986//! ЕÑли в программе требуетÑÑ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ°, то иÑпользуйте функцию txSleep(), так как она автоматичеÑки
1987//! обновлÑет изображение, незавиÑимо от ÑоÑтоÑÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸.
1988//!
1989//! @warning Избегайте Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° долгое времÑ. Ðто может привеÑти к дефектам Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² окне.
1990//!
1991//! @note ЕÑли нажата клавиша Alt+PrintScreen, то блокировка временно отменÑетÑÑ.
1992//!
1993//! @return Значение Ñчетчика блокировки (еÑли 0, то риÑование разблокировано).
1994//!
1995//! @see txEnd(), txSleep(), txUpdateWindow(), txTextCursor()
1996//!
1997//! @usage @code
1998//! txBegin(); // ЗдеÑÑŒ изображение "замерзнет"
1999//! txSetFillColor (TX_WHITE);
2000//! txClear(); // Ðто вызвало бы мигание без txBegin()
2001//! txSetFillColor (TX_RED);
2002//! txRectangle (100, 100, 200, 200);
2003//! txEnd(); // ЗдеÑÑŒ мы Ñразу увидим окончательный риÑунок
2004//! @endcode
2005//}----------------------------------------------------------------------------------------------------------------
2006
2007inline int txBegin();
2008
2009//{----------------------------------------------------------------------------------------------------------------
2010//! @ingroup Drawing
2011//! @brief Разблокирует обновление окна, заблокированное функцией txBegin().
2012//!
2013//! @warning ЕÑли txBegin() вызывалаÑÑŒ неÑколько раз, то Ð´Ð»Ñ ÑнÑÑ‚Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ требуетÑÑ Ñтолько же раз вызвать
2014//! txEnd().
2015//!
2016//! @note ЕÑли нажата клавиша Alt+PrintScreen, то блокировка временно отменÑетÑÑ.
2017//!
2018//! @return Значение Ñчетчика блокировки (еÑли 0, то риÑование разблокировано).
2019//!
2020//! @see txBegin(), txSleep(), txUpdateWindow(), txTextCursor()
2021//!
2022//! @usage @code
2023//! txBegin(); // ЗдеÑÑŒ изображение "замерзнет"
2024//! txSetFillColor (TX_WHITE);
2025//! txClear(); // Ðто вызвало бы мигание без txBegin()
2026//! txSetFillColor (TX_RED);
2027//! txRectangle (100, 100, 200, 200);
2028//! txEnd(); // ЗдеÑÑŒ мы Ñразу увидим окончательный риÑунок
2029//! @endcode
2030//}----------------------------------------------------------------------------------------------------------------
2031
2032inline int txEnd();
2033
2034//{----------------------------------------------------------------------------------------------------------------
2035//! @ingroup Service
2036//! @brief Разрешает или запрещает автоматичеÑкое обновление Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² окне.
2037//!
2038//! @param update Режим Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (true - разрешить, false - запретить).
2039//!
2040//! @return Предыдущее ÑоÑтоÑние режима обновлениÑ.
2041//!
2042//! Ð’ отличие от txBegin() и txEnd(), которые поддерживают вложенные вызовы и работают как "Ñкобки длÑ
2043//! Ð·Ð°Ð¼ÐµÑ€Ð·Ð°Ð½Ð¸Ñ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ¸", txUpdateWindow() позволÑет Ñвно уÑтановить или ÑнÑть блокировку автоматичеÑкого
2044//! обновлениÑ.
2045//!
2046//! Более полную информацию о блокировке Ñм. в функциÑÑ… txBegin(), txEnd() и txSleep().
2047//!
2048//! @see txBegin(), txEnd(), txSleep(), txUpdateWindow(), txTextCursor(), txLock(), txUnlock(), txGDI()
2049//!
2050//! @usage @code
2051//! txUpdateWindow (false);
2052//! ...
2053//! txUpdateWindow();
2054//! @endcode
2055//}----------------------------------------------------------------------------------------------------------------
2056
2057inline int txUpdateWindow (int update = true);
2058
2059//{----------------------------------------------------------------------------------------------------------------
2060//! @ingroup Service
2061//! @brief УÑтанавливает текущий объект GDI.
2062//!
2063//! @param obj ДеÑкриптор объекта GDI
2064//!
2065//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
2066//!
2067//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txSelectFont()
2068//!
2069//! @usage @code
2070//! HPEN pen = CreatePen (PS_DASH, 1, RGB (255, 128, 0));
2071//! txSelectObject (pen);
2072//! @endcode
2073//}----------------------------------------------------------------------------------------------------------------
2074
2075bool txSelectObject (HGDIOBJ obj);
2076
2077//{----------------------------------------------------------------------------------------------------------------
2078//! @ingroup Service
2079//! @brief Делает нечто иногда удобное. См. название функции.
2080//!
2081//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
2082//!
2083//! У Ñтой функции еÑть Ñиноним Ñ Ð¿Ñ€Ð¾Ñтым понÑтным названием, поищите его в файле библиотеки, около
2084//! @a Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñтой функции. Или можно @strike Ñкопировать @endstrike набрать Ñто километровое имÑ
2085//! и поÑмотреть, что получитÑÑ.
2086//!
2087//! @see txCreateWindow(), txSleep()
2088//!
2089//! @usage @code
2090//! int main()
2091//! {
2092//! txCreateWindow (800, 600);
2093//!
2094//! txSetTextAlign (TA_CENTER);
2095//! txTextOut (txGetExtentX()/2, txGetExtentY()/2, "Press any key to exit!");
2096//! @endcode
2097//
2098// +--<<< Ðто текÑÑ‚ помощи, который вы уже читали. Ищите дальше! Жмите [F3] или "Ðайти далее"
2099// |
2100// v
2101// txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture();
2102//! @code txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture();
2103//! return 0;
2104//! }
2105//! @endcode
2106//}----------------------------------------------------------------------------------------------------------------
2107
2108// +--<<< Ðто _прототип_ функции, а надо найти ее _определение_. Ищите дальше! Жмите [F3] или "Ðайти далее"
2109// |
2110// v
2111bool txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture();
2112
2113//{----------------------------------------------------------------------------------------------------------------
2114//! @ingroup Drawing
2115//! @brief Уничтожает окно TXLib.
2116//!
2117//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
2118//!
2119//! @warning ЕÑли уничтожаетÑÑ Ð³Ð»Ð°Ð²Ð½Ð¾Ðµ окно TXLib, Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ main() прерываетÑÑ Ð¸ программа автоматичеÑки завершаетÑÑ.
2120//! При Ñтом @b не гарантируетÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ðµ завершение программы, поÑтому так делать @b не рекомендуетÑÑ.
2121//!
2122//! @see txCreateWindow()
2123//!
2124//! @usage @code
2125//! txDestroyWindow(); // Farewell to the world
2126//! @endcode
2127//}----------------------------------------------------------------------------------------------------------------
2128
2129bool txDestroyWindow();
2130
2131//{----------------------------------------------------------------------------------------------------------------
2132//! @ingroup Drawing
2133//! @brief Оценивает ÑкороÑть работы компьютера.
2134//!
2135//! @return СкороÑть работы (графичеÑких операций) в уÑловных единицах.
2136//!
2137//! @see txSleep()
2138//!
2139//! @usage @code
2140//! if (txQueryPerformance() < 1) printf ("ХочетÑÑ Ð½Ð¾Ð²Ñ‹Ð¹ компьютер");
2141//! @endcode
2142//}----------------------------------------------------------------------------------------------------------------
2143
2144double txQueryPerformance();
2145
2146//! @}
2147//}
2148
2149//=================================================================================================================
2150//{ Mouse functions
2151//! @name Работа Ñ Ð¼Ñ‹ÑˆÑŒÑŽ
2152//=================================================================================================================
2153//! @{
2154//{----------------------------------------------------------------------------------------------------------------
2155//! @ingroup Mouse
2156//! @brief Возвращает позицию Мыши!
2157//!
2158//! @return ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð¼Ñ‹ÑˆÐ¸ как Ñтруктура POINT.
2159//!
2160//! @see txMouseX(), txMouseY(), txMousePos(), txMouseButtons()
2161//!
2162//! @usage @code
2163//! RECT area = { 100, 100, 110, 110 };
2164//!
2165//! while (txMouseButtons() != 1)
2166//! {
2167//! if (In (txMousePos(), area)) txTextOut (100, 100, "What are you doing here?!");
2168//! txSleep (0);
2169//! }
2170//! @endcode
2171//}----------------------------------------------------------------------------------------------------------------
2172
2173inline POINT txMousePos();
2174
2175//{----------------------------------------------------------------------------------------------------------------
2176//! @ingroup Mouse
2177//! @brief Возвращает Х-Координату Мыши!
2178//!
2179//! @return Х-координата мыши.
2180//!
2181//! @see txMouseX(), txMouseY(), txMousePos(), txMouseButtons()
2182//!
2183//! @usage @code
2184//! while (txMouseButtons() != 1)
2185//! {
2186//! txCircle (txMouseX(), txMouseY(), 20);
2187//! txSleep (0);
2188//! }
2189//! @endcode
2190//}----------------------------------------------------------------------------------------------------------------
2191
2192inline int txMouseX();
2193
2194//{----------------------------------------------------------------------------------------------------------------
2195//! @ingroup Mouse
2196//! @brief Возвращает Y-Координату Мыши!
2197//!
2198//! @return Y-координата мыши.
2199//!
2200//! @see txMouseX(), txMouseY(), txMousePos(), txMouseButtons()
2201//!
2202//! @usage @code
2203//! while (txMouseButtons() != 1)
2204//! {
2205//! txCircle (txMouseX(), txMouseY(), 20);
2206//! txSleep (0);
2207//! }
2208//! @endcode
2209//}----------------------------------------------------------------------------------------------------------------
2210
2211inline int txMouseY();
2212
2213//{----------------------------------------------------------------------------------------------------------------
2214//! @ingroup Mouse
2215//! @brief Возвращает ÑоÑтоÑние Кнопок Мыши!
2216//!
2217//! @return СоÑтоÑние Кнопок Мыши!
2218//!
2219//! Ð’ возвращаемом значении выÑтавленный в единицу 1-й (младший) бит означает нажатую левую Кнопку Мыши,
2220//! 2-й - правую. @n
2221//! Ðапример, возвращенное чиÑло 3 (двоичное 11) означает одновременное нажатие левой и правой Кнопок.
2222//!
2223//! @see txMouseX(), txMouseY(), txMousePos(), txMouseButtons()
2224//!
2225//! @usage @code
2226//! while (txMouseButtons() != 3)
2227//! {
2228//! if (txMouseButtons() & 1) txCircle (txMouseX(), txMouseY(), 20);
2229//! if (txMouseButtons() & 2) txLine (txMouseX(), txMouseY(), 0, 0);
2230//! txSleep (0);
2231//! }
2232//! @endcode
2233//}----------------------------------------------------------------------------------------------------------------
2234
2235inline int txMouseButtons();
2236
2237//! @}
2238//}
2239//=================================================================================================================
2240
2241//=================================================================================================================
2242//{ Console functions
2243//! @name Функции конÑоли
2244//=================================================================================================================
2245//! @{
2246//{----------------------------------------------------------------------------------------------------------------
2247//! @ingroup Drawing
2248//! @brief УÑтанавливает цветовые атрибуты конÑоли.
2249//!
2250//! @param colors Цветовые атрибуты конÑоли.
2251//!
2252//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
2253//!
2254//! @b Ðтрибуты - Ñто цвет текÑта (colorText) и цвет фона (colorBackground), объединенные вмеÑте: @nn
2255//! <tt>colors = colorText + colorBackground * 16</tt> @nn
2256//! либо @nn
2257//! <tt>colors = colorText | (colorBackground \<\< 4)</tt> @nn
2258//! Цвета атрибутов @b не имеют никакого Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ðº цветам риÑованиÑ, задаваемыми @ref txColors "TX_..."
2259//! конÑтантами, RGB(), txSetColor(), txColor(), txSetFillColor(), txFillColor() и Ñ‚.д. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð¾Ð²
2260//! Ñм. ниже.
2261//!
2262//! @title Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð¾Ð² атрибутов
2263//! @table @tr Dec @td @c Hex @td @td Dec @td @c Hex @td
2264//! @tbr
2265//! @tr 0 = @td @c 0x0 @td = Черный, @td 8 = @td @c 0x8 @td = Темно-Ñерый,
2266//! @tr 1 = @td @c 0x1 @td = Синий, @td 9 = @td @c 0x9 @td = Светло-Ñиний,
2267//! @tr 2 = @td @c 0x2 @td = Зеленый, @td 10 = @td @c 0xA @td = Светло-зеленый,
2268//! @tr 3 = @td @c 0x3 @td = Сине-зеленый, @td 11 = @td @c 0xB @td = Светло-Ñине-зеленый,
2269//! @tr 4 = @td @c 0x4 @td = КраÑный, @td 12 = @td @c 0xC @td = Светло-краÑный,
2270//! @tr 5 = @td @c 0x5 @td = Малиновый, @td 13 = @td @c 0xD @td = Светло-малиновый,
2271//! @tr 6 = @td @c 0x6 @td = Темно-желтый, @td 14 = @td @c 0xE @td = Желтый,
2272//! @tr 7 = @td @c 0x7 @td = Серый, @td 15 = @td @c 0xF @td = Белый.
2273//! @endtable
2274//!
2275//! Ð’ шеÑтнадцатиричной ÑиÑтеме ÑчиÑÐ»ÐµÐ½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñ‹ задавать можно проще: еÑли нужен, Ñкажем, желтый цвет
2276//! на Ñинем фоне, то его код будет @c 0x1e (ÑÑ‚Ð°Ñ€ÑˆÐ°Ñ Ñ†Ð¸Ñ„Ñ€Ð° - Ñтаршие 4 бита - Ñто цвет фона, младшаÑ
2277//! цифра - младшие 4 бита - Ñто цвет текÑта).
2278//!
2279//! @see txTextCursor(), txGetConsoleAttr(), txSetConsoleCursorPos(), txGetConsoleCursorPos(),
2280//! txGetConsoleFontSize(), txClearConsole()
2281//!
2282//! @usage @code
2283//! txSetConsoleAttr (0x1E);
2284//! printf ("Рв небе 0x1 еÑть город 0xE"); // (c) Б. Гребенщиков
2285//! @endcode
2286//}----------------------------------------------------------------------------------------------------------------
2287
2288bool txSetConsoleAttr (unsigned colors = 0x07);
2289
2290//{----------------------------------------------------------------------------------------------------------------
2291//! @ingroup Drawing
2292//! @brief Возвращает текущие цветовые атрибуты конÑоли.
2293//!
2294//! @return Текущие цветовые атрибуты конÑоли. См. txSetConsoleAttr().
2295//!
2296//! @see txTextCursor(), txSetConsoleAttr(), txSetConsoleCursorPos(), txGetConsoleCursorPos(),
2297//! txGetConsoleFontSize(), txClearConsole()
2298//!
2299//! @usage @code
2300//! unsigned attr = txGetConsoleAttr();
2301//! @endcode
2302//}----------------------------------------------------------------------------------------------------------------
2303
2304unsigned txGetConsoleAttr();
2305
2306//{----------------------------------------------------------------------------------------------------------------
2307//! @ingroup Drawing
2308//! @brief Стирает текÑÑ‚ конÑоли.
2309//!
2310//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
2311//!
2312//! При Ñтирании иÑпользуютÑÑ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ðµ атрибуты (цвета текÑта и фона) конÑоли.
2313//!
2314//! @see txTextCursor(), txSetConsoleAttr(), txGetConsoleAttr(), txGetConsoleCursorPos(),
2315//! txGetConsoleFontSize(), txClearConsole()
2316//!
2317//! @usage @code
2318//! txClearConsole(); // Ðу вот и вÑе, дружок
2319//! @endcode
2320//}----------------------------------------------------------------------------------------------------------------
2321
2322bool txClearConsole();
2323
2324//{----------------------------------------------------------------------------------------------------------------
2325//! @ingroup Drawing
2326//! @brief УÑтанавливает позицию мигающего курÑора конÑоли.
2327//!
2328//! @param x X-координата курÑора в пикÑелÑÑ….
2329//! @param y Y-координата курÑора в пикÑелÑÑ….
2330//!
2331//! @return Предыдущее положение мигающего курÑора в Ñтруктуре POINT.
2332//!
2333//! @note ÐÐµÐ»ÑŒÐ·Ñ ÑƒÑтановить ÑовÑем любую позицию. ТекÑÑ‚ в конÑоли раÑположен по прÑмоугольной Ñетке, размер
2334//! которой завиÑит от размеров шрифта конÑоли. УÑÑ‚Ð°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð¾ÐºÑ€ÑƒÐ³Ð»ÑетÑÑ, чтобы курÑор попал
2335//! в Ñчейку Ñетки. См. пример к функции txGetConsoleFontSize().
2336//!
2337//! @see txTextCursor(), txSetConsoleAttr(), txGetConsoleAttr(), txGetConsoleCursorPos(),
2338//! txGetConsoleFontSize(), txClearConsole()
2339//!
2340//! @usage @code
2341//! txSetConsoleCursorPos (txGetExtentX(), txGetExtentY()); // Центр Ð’Ñеленной
2342//! @endcode
2343//}----------------------------------------------------------------------------------------------------------------
2344
2345POINT txSetConsoleCursorPos (double x, double y);
2346
2347//{----------------------------------------------------------------------------------------------------------------
2348//! @ingroup Drawing
2349//! @brief Возвращает позицию мигающего курÑора конÑоли.
2350//!
2351//! @return Положение мигающего курÑора в Ñтруктуре POINT.
2352//!
2353//! @see txTextCursor(), txSetConsoleAttr(), txGetConsoleAttr(), txSetConsoleCursorPos(),
2354//! txGetConsoleFontSize(), txClearConsole()
2355//!
2356//! @usage @code
2357//! POINT pos = txGetConsoleCursorPos();
2358//! @endcode
2359//}----------------------------------------------------------------------------------------------------------------
2360
2361POINT txGetConsoleCursorPos();
2362
2363//{----------------------------------------------------------------------------------------------------------------
2364//! @ingroup Drawing
2365//! @brief Возвращает размеры шрифта конÑоли.
2366//!
2367//! @return Размеры шрифта конÑоли в пикÑелÑÑ…, в Ñтруктуре POINT.
2368//!
2369//! @see txTextCursor(), txSetConsoleAttr(), txGetConsoleAttr(), txSetConsoleCursorPos(),
2370//! txGetConsoleFontSize(), txClearConsole()
2371//!
2372//! @usage @code
2373//! POINT size = txGetConsoleFontSize();
2374//! txSetConsoleCursorPos (5 * size.x, 10 * size.y); // Ртеперь мигай там
2375//! @endcode
2376//}----------------------------------------------------------------------------------------------------------------
2377
2378POINT txGetConsoleFontSize();
2379
2380//{----------------------------------------------------------------------------------------------------------------
2381//! @ingroup Drawing
2382//! @brief Запрещает или разрешает риÑование мигающего курÑора в окне.
2383//!
2384//! @param blink false - запретить мигающий курÑор
2385//!
2386//! @return Предыдущее значение ÑоÑтоÑÐ½Ð¸Ñ ÐºÑƒÑ€Ñора.
2387//!
2388//! @see txSetConsoleAttr(), txGetConsoleAttr(), txSetConsoleCursorPos(), txGetConsoleCursorPos(),
2389//! txGetConsoleFontSize(), txClearConsole(), txCreateWindow(), txUpdateWindow(), txLock(), txUnlock(), txGDI()
2390//!
2391//! @usage @code
2392//! txTextCursor (false);
2393//! ...
2394//! txTextCursor();
2395//! @endcode
2396//}----------------------------------------------------------------------------------------------------------------
2397
2398bool txTextCursor (bool blink = true);
2399
2400//! @}
2401//}
2402//=================================================================================================================
2403
2404//=================================================================================================================
2405//{ Other staff not related to drawing
2406//! @name Другие полезные функции, не ÑвÑзанные Ñ Ñ€Ð¸Ñованием
2407//=================================================================================================================
2408//! @{
2409//{----------------------------------------------------------------------------------------------------------------
2410//! @ingroup Misc
2411//! @brief ВоÑпроизводит звуковой файл.
2412//!
2413//! @param filename Ð˜Ð¼Ñ Ð·Ð²ÑƒÐºÐ¾Ð²Ð¾Ð³Ð¾ файла. ЕÑли NULL - оÑтанавливает звук.
2414//! @param mode Режим воÑпроизведениÑ
2415//!
2416//! @return ЕÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° уÑпешна - true, иначе - false.
2417//!
2418//! @title Режимы воÑпроизведениÑ: @table
2419//! @tr SND_ASYNC @td Звук проигрываетÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð¾Ð¹ программы. @n
2420//! Чтобы отменить звучание, вызовите txPlaySound (NULL).
2421//! @tr SND_SYNC @td Выполнение программы приоÑтанавливаетÑÑ Ð´Ð¾ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð²Ð¾ÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð²ÑƒÐºÐ°.
2422//! @tr SND_LOOP @td Зацикливать звук при воÑпроизведении. @n
2423//! Чтобы отменить звучание, вызовите txPlaySound (NULL).
2424//! @tbr
2425//! @tr SND_NODEFAULT @td Ðе иÑпользовать звук по умолчанию, еÑли Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ð¸Ð³Ñ€Ð°Ñ‚ÑŒ указанный звуковой файл.
2426//! @tr SND_NOSTOP @td ЕÑли какой-либо звук уже проигрываетÑÑ, не оÑтанавливать его Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка указанного звука.
2427//! @tr SND_APPLICATION @td Проигрывать звук, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñƒ, зарегиÑтрированную Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ типа звуковых файлов.
2428//! @endtable
2429//!
2430//! @note ПоддерживаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ файлы в формате WAV. ОÑтальные форматы (MP3 и др.) надо перекодировать.
2431//! Переименование Ñо Ñменой раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ поможет, как и в Ñлучае Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð¼ картинок в txLoadImage().
2432//!
2433//! @usage @code
2434//! txPlaySound ("tada.wav"); // So happy that this always exists
2435//! @endcode
2436//}----------------------------------------------------------------------------------------------------------------
2437
2438bool txPlaySound (const char filename[] = NULL, DWORD mode = SND_ASYNC);
2439
2440//{----------------------------------------------------------------------------------------------------------------
2441//! @ingroup Misc
2442//! @brief Выводит Ñообщение в окне Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ функции MessageBox.
2443//!
2444//! @param text ТекÑÑ‚ ÑообщениÑ
2445//! @param header Заголовок ÑообщениÑ
2446//! @param flags Флаги Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÑообщениÑ
2447//!
2448//! @return Значение, возвращаемое функцией MessageBox.
2449//!
2450//! @warning ТекÑÑ‚ не должен превышать _TX_BIGBUFSIZE Ñимволов, а заголовок @d _TX_BIGBUFSIZE Ñимволов, иначе они
2451//! обрезаютÑÑ.
2452//!
2453//! @note ВмеÑто <tt><b>txMessageBox (text, header, flags)</b></tt> можно иÑпользовать Ñтандартную функцию Win32
2454//! <tt><b>MessageBox (txWindow(), text, header, flags)</b></tt>. ÐžÑ‚Ð»Ð¸Ñ‡Ð¸Ñ txMessageBox в том, что она
2455//! автоматичеÑки подÑтавлÑет окно-родитель, и в том, что при выводе в окно Ñтрочки переводÑÑ‚ÑÑ Ð² формат
2456//! UNICODE. Ðто важно лишь в том Ñлучае, когда <i>в региональных наÑтройках контрольной панели Windows
2457//! неверно уÑтановлена ÐºÐ¾Ð´Ð¾Ð²Ð°Ñ Ñтраница Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼, не поддерживающих UNICODE.</i> Ð’ оÑтальных ÑлучаÑÑ…
2458//! нужды в @c txMessageBox нет.
2459//!
2460//! @see TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txNotifyIcon()
2461//!
2462//! @usage @code
2463//! if (txMessageBox ("ПолучилоÑÑŒ?", "Прочти менÑ", MB_YESNO) == IDYES)
2464//! {
2465//! MessageBox (txWindow(), "Хватит и обычного MessageBox()", "Win32 Ñообщает", 0);
2466//! }
2467//! else
2468//! txMessageBox ("СпаÑаем от кракозÑбл вмеÑто руÑÑких букв. ГарантиÑ. Ðедорого.");
2469//! @endcode
2470//}----------------------------------------------------------------------------------------------------------------
2471
2472unsigned txMessageBox (const char* text, const char* header = "TXLib Ñообщает", unsigned flags = 0);
2473
2474//{----------------------------------------------------------------------------------------------------------------
2475//! @ingroup Misc
2476//! @brief Выводит вÑплывающее Ñообщение в ÑиÑтемном трее.
2477//!
2478//! @param flags Флаги ÑообщениÑ
2479//! @param title Заголовок ÑообщениÑ
2480//! @param format Строка Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸, как в printf().
2481//!
2482//! @title Флаги ÑообщениÑ:
2483//! @table @tr @c NIIF_INFO @td ИнформациÑ
2484//! @tr @c NIIF_WARNING @td Предупреждение
2485//! @tr @c NIIF_ERROR @td Сообщение об ошибке
2486//! @endtable
2487//!
2488//! @return УдалоÑÑŒ ли отобразить Ñообщение.
2489//!
2490//! Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€ÑƒÐµÑ‚ Ñообщение по правилам printf() и выводит во вÑплывающем окне.
2491//!
2492//! @warning
2493//! - Ðта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚, чтобы при компилÑции конÑтанта верÑии Internet Explorer @c (_WIN32_IE) была
2494//! задана не ниже 0x0500. Ð”Ð»Ñ Ñтого надо либо <b>включить TXLib.h вмеÑто @c windows.h или перед ним.</b>
2495//! Либо надо ÑамоÑтоÑтельно определить @c (\#define) Ñту конÑтанту.
2496//! <small>С верÑией Internet Explorer Ñто ÑвÑзано потому, что при его уÑтановке в Windows обновлÑÑŽÑ‚ÑÑ
2497//! многие компоненты (например, @c shell32.dll и @c comctl32.dll), которые влиÑÑŽÑ‚ на функциональноÑть
2498//! ÑиÑтемы незавиÑимо от иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð°). Сам Internet Explorer в отображении ÑообщениÑ
2499//! не учаÑтвует.</small>
2500//! - Сообщение не должно превышать _TX_BUFSIZE Ñимволов, иначе оно обрезаетÑÑ.
2501//!
2502//! @see TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox()
2503//!
2504//! @usage @code
2505//! int hours = 3, minutes = 10;
2506//! const char station[] = "Юму";
2507//! ...
2508//! txNotifyIcon (NIIF_INFO, "Уважаемые паÑÑажиры",
2509//! "Поезд на %s отправлÑетÑÑ Ð² %d:%d.", station, hours, minutes);
2510//! @endcode
2511//}----------------------------------------------------------------------------------------------------------------
2512
2513bool txNotifyIcon (unsigned flags, const char title[], const char format[], ...) _TX_CHECK_FORMAT (3);
2514
2515//{----------------------------------------------------------------------------------------------------------------
2516//! @ingroup Misc
2517//! @brief Выводит Ñообщение в отладчике.
2518//!
2519//! @param format Строка Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸, как в printf().
2520//!
2521//! @return КоличеÑтво напечатанных Ñимволов.
2522//!
2523//! Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€ÑƒÐµÑ‚ Ñообщение по правилам printf() и передает его в OutputDebugString(). Ее вывод можно
2524//! перехватить отладчиком или утилитами-логгерами, например,
2525//! <a href=http://technet.microsoft.com/ru-ru/sysinternals/bb896647%28en-us%29.aspx>DbgView</a>.
2526//! ЕÑли Ñтого не Ñделать, и не задать первый Ñимвол @c '\\a' (Ñм. ниже), то о Ñообщении никто не узнает. :(
2527//! @note
2528//! - ЕÑли первый Ñимвол в Ñтроке @c '\\a', то Ñообщение также дублируетÑÑ txMessageBox().
2529//! - ЕÑли первый или второй Ñимвол в Ñтроке @c '\\f', то Ñообщение также дублируетÑÑ printf().
2530//!
2531//! @warning Сообщение не должно превышать _TX_BIGBUFSIZE Ñимволов, иначе оно обрезаетÑÑ.
2532//!
2533//! @see TX_ERROR(), TX_DEBUG_ERROR(), txNotifyIcon(), txMessageBox()
2534//!
2535//! @usage @code
2536//! int x = 42;
2537//! ...
2538//! txOutputDebugPrintf ("Ðикто не узнает, что %d.", x);
2539//! @endcode
2540//}----------------------------------------------------------------------------------------------------------------
2541
2542int txOutputDebugPrintf (const char format[], ...) _TX_CHECK_FORMAT (1);
2543
2544//{----------------------------------------------------------------------------------------------------------------
2545//! @ingroup Misc
2546//! @brief ВычиÑление размера маÑÑива в Ñлементах
2547//!
2548//! @param arr Ð˜Ð¼Ñ Ð¼Ð°ÑÑива
2549//!
2550//! @return Размер маÑÑива в Ñлементах (не в байтах).
2551//!
2552//! ÐœÐ°ÐºÑ€Ð¾Ñ sizearr() вычиÑлÑет размер маÑÑива в Ñлементах, проверÑÑ, можно ли его правильно вычиÑлить при
2553//! компилÑции.
2554//!
2555//! ÐœÐ°ÐºÑ€Ð¾Ñ SIZEARR() проÑто делит размер вÑего маÑÑива в байтах на размер его Ñлемента, получаетÑÑ Ñ€Ð°Ð·Ð¼ÐµÑ€
2556//! маÑÑива в Ñлементах.
2557//! Он <b>не проверÑет,</b> можно ли его правильно вычиÑлить, и при неправильном иÑпользовании может
2558//! выдать <b>неверный размер.</b>
2559//!
2560//! @warning SIZEARR() выдает неверный размер, еÑли определение маÑÑива вмеÑте Ñ ÐµÐ³Ð¾ размером, извеÑтным при
2561//! компилÑции, недоÑтупно в меÑте иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SIZEARR(). См. пример ниже.
2562//!
2563//! @note Ð’ Microsoft Visual Studio 6 Ð¼Ð°ÐºÑ€Ð¾Ñ sizearr() недоÑтупен - у ее компилÑтора недоÑтаточно Ñил, чтобы
2564//! Ñкомпилировать его. :(
2565//!
2566//! @usage @code
2567//! void test()
2568//! {
2569//! // Размер Ñтого маÑÑива, хоть и не указан, но может быть автоматичеÑки определен
2570//! // компилÑтором при компилÑции программы. Он равен 4 (четыре Ñтруктуры POINT).
2571//!
2572//! POINT coord[] = { {110, 110}, {120, 120}, {130, 110}, {140, 120} };
2573//!
2574//! // ЗдеÑÑŒ размер маÑÑива извеÑтен при компилÑции, Ñ‚.к. он был определен тут же.
2575//!
2576//! for (int i = 0; i < sizearr (coord) - 1; i++)
2577//! txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y);
2578//!
2579//! DrawLines1 (coord); // Попытка передать маÑÑив без передачи размера.
2580//! DrawLines2 (coord, sizearr (coord)); // ÐŸÑ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° размера маÑÑива.
2581//!
2582//! DrawLines3 (coord); // Ð’ принципе, можно и так, но тут ВОДЯТСЯ ШÐБЛОÐЫ.
2583//! }
2584//!
2585//! // Функции DrawLines1 и DrawLines2 определены так:
2586//!
2587//! void DrawLines1 (const POINT coord[])
2588//! {
2589//! // МаÑÑивы в Си передаютÑÑ ÐºÐ°Ðº указатели на начало маÑÑива. ПоÑтому:
2590//! // 1) sizearr здеÑÑŒ выдаÑÑ‚ ошибку компилÑции, и ее легко будет найти.
2591//! // 2) SIZEARR здеÑÑŒ неверно поÑчитает размер, что намного хуже,
2592//! // т.к. он будет равен sizeof (POINT*) / sizeof (POINT) == 4/8 == 0.
2593//!
2594//! for (int i = 0; i < sizearr (coord) - 1; i++)
2595//! txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y);
2596//! }
2597//!
2598//! void DrawLines2 (const POINT coord[], int n)
2599//! {
2600//! // ЗдеÑÑŒ размер приходит как параметр n, так что вÑе проÑто.
2601//!
2602//! for (int i = 0; i < n - 1; i++)
2603//! txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y);
2604//! }
2605//!
2606//! // HIC SVNT TEMPLATES
2607//!
2608//! template <int size>
2609//! void DrawLines3 (const POINT (&coord) [size])
2610//! {
2611//! for (int i = 0; i < size - 1; i++)
2612//! txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y);
2613//! }
2614//! @endcode
2615//!
2616//! @hideinitializer
2617//}----------------------------------------------------------------------------------------------------------------
2618//! @{
2619
2620#ifndef _MSC_VER_6
2621
2622 #define sizearr( arr ) ( sizeof (get_size_of_an_array_with_unknown_or_nonconst_size_ (arr)) )
2623
2624 //! @cond INTERNAL
2625 // See explanation here: http://blogs.msdn.com/b/the1/archive/2004/05/07/128242.aspx
2626
2627 template <typename T, int N> char (&get_size_of_an_array_with_unknown_or_nonconst_size_ (T (&) [N])) [N]; // ;)
2628
2629 //! @endcond
2630
2631#endif
2632
2633//! Замена макроÑу sizearr() Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ в Microsoft Visual Studio 6
2634
2635#define SIZEARR( arr ) ( sizeof (arr) / sizeof (0[arr]) )
2636
2637//! @}
2638//{----------------------------------------------------------------------------------------------------------------
2639//! @ingroup Misc
2640//! @brief Проверка, находитÑÑ Ð»Ð¸ параметр Ñ… внутри замкнутого интервала [a; b]
2641//!
2642//! @param x ПроверÑемый параметр
2643//! @param a Ð›ÐµÐ²Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° (включительно)
2644//! @param b ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° (включительно)
2645//!
2646//! @return ЕÑли a <= x && x <= b, то иÑтина, еÑли нет - ложь
2647//!
2648//! @usage @code
2649//! while (txMouseButtons() != 1)
2650//! {
2651//! if (In (txMouseX(), 110, 120)) txTextOut (100, 100, "Meet the wall!");
2652//! txSleep (0);
2653//! }
2654//! @endcode
2655//}----------------------------------------------------------------------------------------------------------------
2656
2657template <typename T>
2658inline bool In (T x, T a, T b);
2659
2660//{----------------------------------------------------------------------------------------------------------------
2661//! @ingroup Misc
2662//! @brief Проверка, находитÑÑ Ð»Ð¸ точка pt внутри прÑмоугольника rect
2663//!
2664//! @param pt ПроверÑÐµÐ¼Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° в виде <tt> POINT {x, y} </tt>
2665//! @param rect ПрÑмоугольник в виде <tt> RECT {left, top, right, bottom} </tt>
2666//!
2667//! @return Результат проверки
2668//!
2669//! Удобно Ð´Ð»Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ Ñкранных кнопок, нажимаемых курÑором мыши.
2670//!
2671//! @usage @code
2672//! RECT button = { 100, 100, 150, 120 };
2673//!
2674//! txSetFillColor (TX_LIGHTGRAY);
2675//! txRectangle (button.left, button.top, button.right, button.bottom);
2676//!
2677//! txSetTextAlign();
2678//! txSetFillColor (TX_WHITE);
2679//! txTextOut (125, 115, "Cookie");
2680//!
2681//! for (;;)
2682//! {
2683//! if (In (txMousePos(), button))
2684//! {
2685//! txSetFillColor (TX_TRANSPARENT);
2686//! txRectangle (button.left, button.top, button.right, button.bottom);
2687//!
2688//! if (txMouseButtons())
2689//! {
2690//! txSetFillColor (TX_DARKGRAY);
2691//! txRectangle (button.left, button.top, button.right, button.bottom);
2692//!
2693//! txSetFillColor (TX_WHITE);
2694//! txTextOut (125, 115, "You got cookie");
2695//!
2696//! break;
2697//! }
2698//! }
2699//!
2700//! txSleep (0);
2701//! }
2702//! @endcode
2703//}----------------------------------------------------------------------------------------------------------------
2704//! @{
2705
2706inline bool In (const POINT& pt, const RECT& rect);
2707
2708inline bool In (const COORD& pt, const SMALL_RECT& rect);
2709
2710//! @}
2711//{----------------------------------------------------------------------------------------------------------------
2712//! @ingroup Misc
2713//! @brief Генератор Ñлучайных чиÑел
2714//!
2715//! @param range ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° диапазона (@b не Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñаму границу).
2716//!
2717//! @return Случайное целое чиÑло в диапазоне [0; range).
2718//!
2719//! Ð’Ñ‹ еще помните, что означают разные Ñкобочки в обозначении интервалов? :)
2720//!
2721//! @usage @code
2722//! char message[100] = "Maybe...";
2723//! sprintf ("You SUDDENLY got %d bucks now. But note that tax rate is $%d.", random (100), 100);
2724//! txMessageBox (message, "Lottery");
2725//! @endcode
2726//}----------------------------------------------------------------------------------------------------------------
2727
2728inline int random (int range);
2729
2730//{----------------------------------------------------------------------------------------------------------------
2731//! @ingroup Misc
2732//! @brief Генератор Ñлучайных чиÑел
2733//!
2734//! @param left Ð›ÐµÐ²Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° диапазона (@b Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñаму границу).
2735//! @param right ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° диапазона (@b Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñаму границу).
2736//!
2737//! @return Случайное целое чиÑло в диапазоне [left; right].
2738//!
2739//! Ð’Ñ‹ вÑе еще помните, что означают разные Ñкобочки в обозначении интервалов? :)
2740//!
2741//! @usage @code
2742//! int money = random (-100, +100);
2743//! if (money < 0)
2744//! {
2745//! char message[100] = "Maybe...";
2746//! sprintf ("Проиграли в лотерею? Отдайте долг в %d рублей", -money);
2747//! txMessageBox (message, "БыÑтро!");
2748//! }
2749//! @endcode
2750//}----------------------------------------------------------------------------------------------------------------
2751
2752inline double random (double left, double right);
2753
2754//{----------------------------------------------------------------------------------------------------------------
2755//! @ingroup Misc
2756//! @brief Возвращает макÑимальное из двух чиÑел
2757//!
2758//! @param a Одно из чиÑел :)
2759//! @param b Другое из чиÑел :)
2760//!
2761//! @return МакÑимальное из двух чиÑел a и b
2762//!
2763//! @see MIN()
2764//!
2765//! @usage @code
2766//! if (MAX (3, 7) != 7) printf ("Your CPU is broken, throw it away.");
2767//! @endcode
2768//!
2769//! @hideinitializer
2770//}----------------------------------------------------------------------------------------------------------------
2771
2772#define MAX( a, b ) ( (a) > (b) ? (a) : (b) )
2773
2774//{----------------------------------------------------------------------------------------------------------------
2775//! @ingroup Misc
2776//! @brief Возвращает минимальное из двух чиÑел
2777//!
2778//! @param a Одно из чиÑел :)
2779//! @param b Другое из чиÑел :)
2780//!
2781//! @return Минимальное из двух чиÑел a и b
2782//!
2783//! @see MAX()
2784//!
2785//! @usage @code
2786//! if (MIN (3, 7) != 3) printf ("Your CPU is still broken, throw it away twice.");
2787//! @endcode
2788//!
2789//! @hideinitializer
2790//}----------------------------------------------------------------------------------------------------------------
2791
2792#define MIN( a, b ) ( (a) < (b) ? (a) : (b) )
2793
2794//{----------------------------------------------------------------------------------------------------------------
2795//! @ingroup Misc
2796//! @brief ОкруглÑет чиÑло до целого
2797//!
2798//! @param x ЧиÑло
2799//!
2800//! @return Округленное чиÑло, преобразованное в тип @c int
2801//!
2802//! @usage @code
2803//! double weight = 5.5; // 5.5 kilos is the weight of Maru in 2012.
2804//! int Maru = ROUND (weight); // Should use ROUND() because Maru is so round.
2805//! @endcode
2806//!
2807//! @hideinitializer
2808//}----------------------------------------------------------------------------------------------------------------
2809
2810#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L // C99 case
2811
2812 #define ROUND( x ) ( (int) round (x) )
2813
2814#else
2815
2816 #define ROUND( x ) ( (int) floor ((x) + 0.5) )
2817
2818#endif
2819
2820//{----------------------------------------------------------------------------------------------------------------
2821//! @ingroup Misc
2822//! @brief ЧиÑло Пи
2823//!
2824//! @usage @code
2825//! if (txPI == 1) txMessageBox ("Ð’Ñ‹ попали в другую Ð’Ñеленную.", "ПоздравлÑем", MB_ICONSTOP);
2826//! @endcode
2827//!
2828//! @hideinitializer
2829//}----------------------------------------------------------------------------------------------------------------
2830
2831const double txPI = asin (1.0) * 2;
2832
2833//{----------------------------------------------------------------------------------------------------------------
2834//! @ingroup Misc
2835//! @brief <i>Очень удобное</i> возведение чиÑла в квадрат.
2836//!
2837//! @param x ЧиÑло Ð´Ð»Ñ Ð²Ð¾Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² него
2838//!
2839//! @return Квадрат, полученный путем Ð²Ð¾Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² него чиÑла, заданного Ð´Ð»Ñ Ð²Ð¾Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² квадрат
2840//!
2841//! @note Ðто пример, как <b> не надо </b> пиÑать код: txSqr() @d Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ "медвежьей уÑлугой". Иногда вÑтречаютÑÑ
2842//! те, кто любит печатать в функции результат ее вычиÑлений <small> (не данные Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸, а именно результат),
2843//! </small> вмеÑто того, чтобы проÑто возвращать его туда, где Ñту функцию вызывали. ПуÑть Ñти люди воÑпользуютÑÑ
2844//! приведенной txSqr() Ð´Ð»Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾-нибудь нужного дела, оÑобенно в цикле. Пример, конечно, неÑколько преувеличен.
2845//! См. в иÑходном текÑте код Ñтой навÑзчивой радоÑти.
2846//!
2847//! @usage @code
2848//! printf ("\n" "РадиуÑ\t\t" "Площадь круга\n\n");
2849//!
2850//! for (double r = 100; r > 0; r--)
2851//! {
2852//! printf ("%6.2lf...", r);
2853//!
2854//! double square = M_PI * txSqr (r); // Ðадолго запомним Ñту площадь!
2855//! printf ("\b\b\b \t");
2856//!
2857//! printf ("%-.2lf\n", square);
2858//! }
2859//! @endcode
2860//}----------------------------------------------------------------------------------------------------------------
2861
2862inline
2863double txSqr (double x)
2864 {
2865 double sqr = pow (sqrt (x) * sqrt (x), sqrt (4.0)); // Ð‘ÑƒÑ€Ð½Ð°Ñ Ð²Ñ‹Ñ‡Ð¸ÑÐ»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð´ÐµÑтельноÑть
2866
2867 char str[1024] = "";
2868 _snprintf_s (str, sizeof (str), "Возведение дало %g!" "!!" "!!" " Вы рады???? ", sqr);
2869 txMessageBox (str, "Получен ОТВЕТ!" "!!", MB_ICONEXCLAMATION | MB_YESNO) != IDNO ||
2870 (
2871 txMessageBox ("Жаль...", "Ð Ñ Ñ‚Ð°Ðº ÑтаралаÑÑŒ", MB_ICONINFORMATION),
2872 txMessageBox ("Уйду Ñ Ð¾Ñ‚ Ð²Ð°Ñ ", "Злые вы...", MB_ICONSTOP),
2873 exit (EXIT_FAILURE), 0
2874 );
2875
2876 txNotifyIcon (1, NULL, "\n%s\n", "Ð’Ñ‹ÑÑˆÐ°Ñ Ð¼Ð°Ñ‚ÐµÐ¼Ð°Ñ‚Ð¸ÐºÐ°! \0" // Ркак Ñто работает, а?
2877 "С ума Ñойти... \0" //
2878 "а КÐП подтверждает \0" // и кто Ñто будет
2879 "Главное - отчитатьÑÑ\0" // поддерживать?..
2880 "ÐевероÑтно, но факт \0"
2881 "Кто бы мог подумать?\0" + GetTickCount() % 6 * 21);
2882
2883 return sqr; // Ð’Ñе же вернем значение. Мы же не звери
2884 }
2885
2886//{----------------------------------------------------------------------------------------------------------------
2887//! @ingroup Misc
2888//! @brief Обнулитель типов, не имеющих конÑтрукторов
2889//!
2890//! @param type Ð˜Ð¼Ñ Ñ‚Ð¸Ð¿Ð°
2891//!
2892//! @return Значение типа @p type, покомпонентно инициализированное по умолчанию (Ð´Ð»Ñ Ð²Ñтроенных типов - нулем).
2893//!
2894//! @usage @code
2895//! void f (POINT p);
2896//! ...
2897//!
2898//! POINT z = {}; f (z); // Так без ZERO
2899//!
2900//! f (ZERO (POINT)); // Так Ñ ZERO
2901//! @endcode
2902//!
2903//! @hideinitializer
2904//}----------------------------------------------------------------------------------------------------------------
2905
2906#define ZERO( type ) zero <type> ()
2907
2908//! @cond INTERNAL
2909template <typename T> inline T zero();
2910//! @endcond
2911
2912//{----------------------------------------------------------------------------------------------------------------
2913//! @ingroup Misc
2914//! @brief ÐвтоматичеÑкий вызов функции при завершении другой функции (аналог @c __finally)
2915//!
2916//! @param param_t Тип параметра автоматичеÑки вызываемой функции
2917//! @param param Ð˜Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° автоматичеÑки вызываемой функции
2918//! @param func Тело автоматичеÑки вызываемой функции (фигурные Ñкобки не обÑзательны)
2919//!
2920//! @par ÐœÐ°ÐºÑ€Ð¾Ñ <tt>TX_AUTO_FUNC (param_t, param, func)</tt>
2921//! @note
2922//! - Ð”Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки вызываемой функции допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ @a один параметр.
2923//! - Его тип @c param_t и Ð¸Ð¼Ñ @c param должны ÑоответÑтвовать определению переменной, доÑтупной в текущей
2924//! облаÑти видимоÑти.
2925//! Параметр вызываемой функции будет ÑвÑзан Ñ Ñтой переменной через ÑÑылку.
2926//! - Синоним: TX_FINALLY
2927//!
2928//! @warning Ð’ Microsoft Visual Studio 6 и 2003 в отладочной конфигурации (Debug) Ñтот Ð¼Ð°ÐºÑ€Ð¾Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ñ‚ÑŒ не будет,
2929//! Ñм. <a href="http://support.microsoft.com/kb/199057">MS KB Article 199057</a>. Можно обходитьÑÑ
2930//! макроÑом @c _TX_AUTO_FUNC, Ñм. его определение в иÑходном текÑте Ñ€Ñдом Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ @c TX_AUTO_FUNC.
2931//!
2932//! @par ÐœÐ°ÐºÑ€Ð¾Ñ <tt>tx_auto_func (func)</tt>
2933//! @note
2934//! - @a Ð’Ñе переменные вызываемой функции ÑвÑзываютÑÑ Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼Ð¸ внешней функции по ÑÑылке.
2935//! - Их Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¸ типы @a не указываютÑÑ. УказываетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ тело вызываемой функции.
2936//! - Ðта форма иÑпользует лÑмбда-функции @c C++0x, поÑтому при компилÑции требуетÑÑ <i>MSVS 2010</i>
2937//! или <i>GCC не ниже верÑии 4.5 Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ компилÑции @c -std=c++0x или @c -std=c++11.</i>
2938//! - Синоним: tx_finally
2939//!
2940//! @see txAutoLock
2941//!
2942//! @usage @code
2943//! void f1()
2944//! {
2945//! int x = 1;
2946//! TX_AUTO_FUNC (int, x, $(x)); // Will be printed at return
2947//!
2948//! FILE* f = fopen (__FILE__".o.txt", "w"); // Will be closed at return
2949//! TX_AUTO_FUNC (FILE*, f, fclose (f));
2950//!
2951//! fprintf (f, "start: x = %d\n", x); // Do some job
2952//! x = 2; // Do some job
2953//! }
2954//!
2955//! void f2() // Do the same. For C++0x only
2956//! {
2957//! int x = 1;
2958//! tx_auto_func ($(x)); // More simple usage
2959//!
2960//! FILE* f = fopen (__FILE__".o.txt", "w");
2961//! tx_auto_func (fclose (f)); // More simple usage
2962//!
2963//! fprintf (f, "start: x = %d\n", x);
2964//! x = 2;
2965//! }
2966//! @endcode
2967//!
2968//! @hideinitializer
2969//}----------------------------------------------------------------------------------------------------------------
2970//! @{
2971
2972//{ C++03 version
2973
2974#define TX_AUTO_FUNC( param_t, param, func ) \
2975 _TX_AUTO_FUNC( __LINE__, param_t, param, func )
2976
2977#define _TX_AUTO_FUNC( n, param_t, param, func ) \
2978 _TX_AUTO_FUN2( n, param_t, param, func )
2979
2980#define _TX_AUTO_FUN2( n, param_t, param, func ) \
2981 struct _TX_AUTO_FUNC_##n \
2982 { \
2983 typedef _TX_AUTO_FUNC_##n this_t; \
2984 param_t& param; \
2985 \
2986 _TX_AUTO_FUNC_##n (param_t& __p) : param (__p) { } \
2987 ~_TX_AUTO_FUNC_##n () { func; } \
2988 \
2989 private: this_t& operator= (const this_t&) { return *this; } \
2990 } \
2991 _TX_AUTO_FUNC_##n (param)
2992//}
2993
2994//{ C++0x version, use MSVS 2010 or GCC v.4.5+ and -std=c++0x in command line
2995
2996#define tx_auto_func( func ) _tx_auto_fun1 ( __LINE__, func )
2997#define _tx_auto_fun1( n, func ) _tx_auto_fun2 ( n, func )
2998#define _tx_auto_fun2( n, func ) auto _tx_auto_func_##n = _tx_auto_func ([&]() { func; })
2999
3000template <typename T>
3001struct _tx_auto_func_
3002 {
3003 typedef _tx_auto_func_ this_t;
3004 T func_;
3005
3006 _tx_auto_func_ (T func) : func_ (func) {}
3007 ~_tx_auto_func_ () { func_(); }
3008
3009 private: this_t& operator= (const this_t&) { return *this; }
3010 };
3011
3012template <typename T>
3013_tx_auto_func_<T> _tx_auto_func (T func)
3014 {
3015 return _tx_auto_func_ <T> (func);
3016 }
3017//}
3018
3019//{ Compatibility
3020
3021#define TX_FINALLY( param_t, param, func ) TX_AUTO_FUNC (param_t, param, func)
3022#define tx_finally( func ) tx_auto_func (func)
3023
3024//}
3025
3026//! @}
3027
3028//{----------------------------------------------------------------------------------------------------------------
3029//! @ingroup Misc
3030//! @brief Замена Ñтандартного макроÑа assert(), Ñ Ð²Ñ‹Ð´Ð°Ñ‡ÐµÐ¹ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· txMessageBox(), конÑоль и
3031//! OutputDebugString().
3032//!
3033//! @param cond УÑловие Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸
3034//!
3035//! @return Ðе определено
3036//!
3037//! ЕÑли уÑловие, проверÑемое assert(), иÑтинно, то Ð¼Ð°ÐºÑ€Ð¾Ñ Ð½Ð¸Ñ‡ÐµÐ³Ð¾ не делает. @n
3038//! ЕÑли уÑловие оказываетÑÑ Ð»Ð¾Ð¶Ð½Ð¾, то выводитÑÑ Ð´Ð¸Ð°Ð³Ð½Ð¾ÑтичеÑкое Ñообщение и программа аварийно
3039//! завершаетÑÑ.
3040//!
3041//! @warning <b>При компилÑции в режиме Release (или еÑли определен NDEBUG) assert превращаетÑÑ Ð² пуÑтой оператор.</b> @n
3042//! Ðе надо помещать в assert() дейÑтвиÑ, которые важны Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ алгорима!
3043//!
3044//! @note ЕÑли уÑловие @c cond может быть вычиÑлено уже во Ð²Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ñции как ложное, компилÑтор может
3045//! предупредить об Ñтом (как о делении на 0).
3046//! @note <small>See: <a href=http://lars-lab.jpl.nasa.gov/JPL_Coding_Standard_C.pdf> "JPL Institutional Coding
3047//! Standard for the C Programming Language", Jet Propulsion Laboratory, California Institute of
3048//! Technology, JPL DOCID D-60411, Ver. 1.0, March 3, 2009</a>, page 15.</small>
3049//!
3050//! @see asserted, verified, verify(), TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(),
3051//! txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__
3052//!
3053//! @usage @code
3054//! assert (0 <= i && i < ARRAY_SIZE);
3055//!
3056//! FILE* input = fopen ("a.txt", "r");
3057//! assert (input);
3058//!
3059//! // Ðтот вызов fgets() ÐЕ будет выполнен в режиме Release:
3060//! assert (fgets (str, sizeof (str) - 1, input));
3061//!
3062//! // ЗдеÑÑŒ вÑе будет правильно:
3063//! bool ok = (fclose (input) == 0);
3064//! assert (ok);
3065//! @endcode
3066//!
3067//! @hideinitializer
3068//}----------------------------------------------------------------------------------------------------------------
3069
3070#if !defined (NDEBUG)
3071 #undef assert
3072 #define assert( cond ) _txNOP ( !(cond)? (TX_ERROR ("\a" "Ð’ÐЕЗÐПÐО: ЛогичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°: " \
3073 "Ðеверно, что \"%s\"." TX_COMMA #cond), \
3074 0/(int)!!(cond)) : 1 )
3075#else
3076 #undef assert
3077 #define assert( cond ) ((void) 1)
3078
3079#endif
3080
3081//{----------------------------------------------------------------------------------------------------------------
3082//! @ingroup Misc
3083//! @brief Выводит диагноÑтичеÑкое Ñообщение в Ñлучае нулевого или ложного результата.
3084//!
3085//! @return Ð’Ñегда 0
3086//!
3087//! СуффикÑÐ½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° макроÑа assert(), не терÑÑŽÑ‰Ð°Ñ Ð² режиме Release иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¸ÐºÐ°Ñ‚Ð°.
3088//!
3089//! @note <b>ПредполагаетÑÑ, что Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð² Ñлучае неуÑпеха возвращает 0 или false.</b> @n@n
3090//! <b>При компилÑции в режиме Release (или еÑли определен NDEBUG) asserted превращаетÑÑ Ð² пуÑтое меÑто.</b>
3091//!
3092//! @see assert(), verify(), verified, TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(),
3093//! txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__
3094//!
3095//! @usage @code
3096//! FILE* input = fopen ("a.txt", "r"); assert (input);
3097//!
3098//! // Ðтот вызов fgets() будет выполнен в любом Ñлучае:
3099//! fgets (str, sizeof (str) - 1, input) asserted;
3100//!
3101//! // Ðтот вызов fgets() ÐЕ будет выполнен в режиме Release:
3102//! assert (fgets (str, sizeof (str) - 1, input));
3103//!
3104//! (fclose (input) != 0) asserted;
3105//! @endcode
3106//!
3107//! @hideinitializer
3108//}----------------------------------------------------------------------------------------------------------------
3109
3110#if !defined (NDEBUG)
3111 #define asserted || TX_ERROR ("\a" "Обнаружен нулевой или ложный результат.")
3112
3113#else
3114 #define asserted || _txNOP (0)
3115
3116#endif
3117
3118#define verified asserted //!< For compatibility with assert macro
3119
3120//! @cond INTERNAL
3121#define TX_NEEDED asserted //!< For compatibility with earlier releases
3122//! @endcond
3123
3124//{----------------------------------------------------------------------------------------------------------------
3125//! @ingroup Misc
3126//! @brief ВыполнÑет команду (вычиÑлÑет выражение) и проверÑет результат.
3127//!
3128//! @param expr Команда (выражение)
3129//!
3130//! @return 1, еÑли выражение @p expr иÑтинно, иначе 0.
3131//!
3132//! ЕÑли уÑловие, проверÑемое verify(), иÑтинно, то Ð¼Ð°ÐºÑ€Ð¾Ñ Ð½Ð¸Ñ‡ÐµÐ³Ð¾ не делает. @n
3133//! ЕÑли уÑловие оказываетÑÑ Ð»Ð¾Ð¶Ð½Ð¾, то выводитÑÑ Ð´Ð¸Ð°Ð³Ð½Ð¾ÑтичеÑкое Ñообщение и программа аварийно
3134//! завершаетÑÑ.
3135//!
3136//! @note ДейÑтвие макроÑа аналогично assert(), но при компилÑции в режиме Release (или еÑли определен NDEBUG)
3137//! verify @b не превращаетÑÑ Ð² пуÑтой оператор.
3138//!
3139//! @see verified, assert(), asserted, TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(),
3140//! txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__
3141//!
3142//! @usage @code
3143//! FILE* input = verify (fopen ("a.txt", "r"));
3144//!
3145//! // Ðтот вызов fgets() БУДЕТ выполнен в режиме Release:
3146//! verify (fgets (str, sizeof (str) - 1, input));
3147//!
3148//! // ЗдеÑÑŒ вÑе тоже будет правильно:
3149//! verify (fclose (input) == 0);
3150//! @endcode
3151//!
3152//! @hideinitializer
3153//}----------------------------------------------------------------------------------------------------------------
3154
3155#if !defined (NDEBUG)
3156 #undef verify
3157 #define verify assert
3158
3159#else
3160 #undef verify
3161 #define verify( expr ) ( expr )
3162
3163#endif
3164
3165//{----------------------------------------------------------------------------------------------------------------
3166//! @ingroup Misc
3167//! @brief Выводит развернутое диагноÑтичеÑкое Ñообщение.
3168//!
3169//! @param msg Сообщение Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð»ÑŒÐ½Ñ‹Ð¼ количеÑтвом параметров в Ñтиле функции @c printf().
3170//!
3171//! @note @c GCC в режиме Ñтрогого ÑоответÑÑ‚Ð²Ð¸Ñ Ñтандарту ANSI (Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ командной Ñтроки <tt>-ansi</tt>) и
3172//! Microsoft Visual Studio верÑий 6 и 2003 не поддерживают макроÑÑ‹ Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼ чиÑлом параметров.
3173//! ПоÑтому, еÑли параметров неÑколько, они разделÑÑŽÑ‚ÑÑ @b _ (@ref _ "Ñимволом подчеркиваниÑ",
3174//! переопределенным в запÑтую) или Ñимволом TX_COMMA, вмеÑто наÑтоÑщей запÑтой, так как TX_ERROR @d макроÑ. @n
3175//! ЕÑли в проекте иÑпользуютÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¸ <a href=http://boost.org><tt>boost</tt></a>, то их надо включать
3176//! @b до @c TXLib.h и вмеÑто Ñимвола Ð¿Ð¾Ð´Ñ‡ÐµÑ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÑŒÑÑ TX_COMMA, так как @c boost иÑпользует
3177//! Ñимвол Ð¿Ð¾Ð´Ñ‡ÐµÑ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ðº Ñвой ÑобÑтвенный Ñлужебный Ð¼Ð°ÐºÑ€Ð¾Ñ Ð² модуле @c boost::preprocessor, @strike
3178//! где творитÑÑ Ð´ÐµÑ„Ð°Ð¹Ð½Ð¾Ð²Ñ‹Ð¹ адЪ. @endstrike
3179//!
3180//! @return Ð’Ñегда false
3181//!
3182//! @see _, TX_COMMA, assert(), asserted, verify(), verified, TX_DEBUG_ERROR(), txOutputDebugPrintf(),
3183//! txMessageBox(), txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__
3184//!
3185//! @usage @code
3186//! TX_ERROR ("Ðе Ñмог прочитать 'Войну и мир'. Отмазка %d: не нашел '%s'", reasonNum, fileName);
3187//! @endcode
3188//!
3189//! @hideinitializer
3190//}----------------------------------------------------------------------------------------------------------------
3191
3192// Variadic macros not supported in Strict ANSI mode and in MSVC prior to MSVC 8 (2005)
3193
3194#if defined (__STRICT_ANSI__) || defined (_MSC_VER) && (_MSC_VER < 1400)
3195 #define TX_ERROR( msg ) _txError (__FILE__, __LINE__, __TX_FUNCTION__, msg)
3196
3197#else
3198 #define TX_ERROR( ... ) _txError (__FILE__, __LINE__, __TX_FUNCTION__, __VA_ARGS__)
3199
3200#endif
3201
3202//! @cond INTERNAL
3203#define TX_THROW TX_ERROR //!< For compatibility with earlier releases
3204//! @endcond
3205
3206//{----------------------------------------------------------------------------------------------------------------
3207//! @ingroup Misc
3208//! @brief Выводит развернутое диагноÑтичеÑкое Ñообщение в отладочном режиме.
3209//!
3210//! ОпиÑание Ñм. в TX_ERROR.
3211//!
3212//! @note Ð’ режиме Release Ñтот Ð¼Ð°ÐºÑ€Ð¾Ñ Ð½Ðµ выводит ничего.
3213//!
3214//! @see _, TX_COMMA, assert(), asserted, verify(), verified, TX_ERROR(), txOutputDebugPrintf(),
3215//! txMessageBox(), txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__
3216//!
3217//! @usage @code
3218//! TX_DEBUG_ERROR ("Так и не Ñмог прочитать 'Войну и мир'. Отмазка %d: потерÑл '%s'", reasonNum, fileName);
3219//! @endcode
3220//!
3221//! @hideinitializer
3222//}----------------------------------------------------------------------------------------------------------------
3223
3224#if !defined (NDEBUG)
3225 #define TX_DEBUG_ERROR TX_ERROR
3226
3227#else
3228 #define TX_DEBUG_ERROR(m) ((void) 0)
3229
3230#endif
3231
3232//{----------------------------------------------------------------------------------------------------------------
3233//! @ingroup Misc
3234//! @brief РаÑпечатывает дамп облаÑти памÑти в конÑоли.
3235//!
3236//! @param address ÐÐ´Ñ€ÐµÑ Ð½Ð°Ñ‡Ð°Ð»Ð° раÑпечатки.
3237//! @param name Ðазвание раÑпечатки (уÑекаетÑÑ Ð´Ð¾ 8 Ñимволов).
3238//!
3239//! @note РаÑпечатываетÑÑ Ð¾Ð±Ð»Ð°Ñть памÑти размером 256 байт. @nn
3240//! ПоÑле раÑпечатки атрибуты конÑоли ÑбраÑываютÑÑ Ð² 0x07 (Ñветло-Ñерый на черном).
3241//!
3242//! @see TX_ERROR(), TX_DEBUG_ERROR()
3243//!
3244//! @usage @code
3245//! const char text[] = "Каждому лектору - в портфель по вектору";
3246//! txDump (text);
3247//! @endcode
3248//}----------------------------------------------------------------------------------------------------------------
3249
3250void txDump (const void* address, const char name[] = "txDump()");
3251
3252//{----------------------------------------------------------------------------------------------------------------
3253//! @ingroup Misc
3254//! @brief МакроÑ, позволÑющий передать переменное чиÑло параметров в какой-либо другой макроÑ.
3255//!
3256//! @note <b>Символ Ð¿Ð¾Ð´Ñ‡ÐµÑ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¸ Ñимвол TX_COMMA проÑто переопределÑÑŽÑ‚ÑÑ Ð² запÑтую.</b>
3257//!
3258//! @see TX_ERROR(), TX_DEBUG_ERROR()
3259//!
3260//! @usage @code
3261//! TX_ERROR ("Слишком умный абзац: роман 'Война и мир', файл '%s', Ñтрока %d" _ fileName _ lineNum);
3262//! @endcode
3263//!
3264//! @hideinitializer
3265//}----------------------------------------------------------------------------------------------------------------
3266//! @{
3267
3268#define _ ,
3269#define TX_COMMA , //!< Синоним макроÑа _ (@ref _ "Ñимвол подчеркиваниÑ")
3270
3271//! @}
3272
3273//{----------------------------------------------------------------------------------------------------------------
3274//! @ingroup Misc
3275//! @brief Ð˜Ð¼Ñ Ð¸ верÑÐ¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ компилÑтора
3276//! @hideinitializer
3277//}----------------------------------------------------------------------------------------------------------------
3278
3279#if defined (__GNUC__)
3280 #define __TX_COMPILER__ "GNU g++ " TX_PREPROCESS (__GNUC__) "." \
3281 TX_PREPROCESS (__GNUC_MINOR__) "." \
3282 TX_PREPROCESS (__GNUC_PATCHLEVEL__) \
3283 ", std=" TX_PREPROCESS (__cplusplus)
3284#elif defined (_MSC_VER)
3285 #define __TX_COMPILER__ "MSVS " TX_PREPROCESS (_MSC_VER) \
3286 ", std=" TX_PREPROCESS (__cplusplus)
3287
3288#elif defined (__INTEL_COMPILER)
3289 #define __TX_COMPILER__ "Intel C++ " TX_PREPROCESS (__INTEL_COMPILER) \
3290 ", std=" TX_PREPROCESS (__cplusplus)
3291
3292#else
3293 #define __TX_COMPILER__ "Unknown C++, std=" TX_PREPROCESS (__cplusplus)
3294
3295#endif
3296
3297//{----------------------------------------------------------------------------------------------------------------
3298//! @ingroup Misc
3299//! @brief МакроÑ, раÑкрывающийÑÑ Ð² Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° и номер Ñтроки файла, где он вÑтретилÑÑ.
3300//! @hideinitializer
3301//}----------------------------------------------------------------------------------------------------------------
3302
3303#define __TX_FILELINE__ __FILE__ " (" TX_PREPROCESS (__LINE__) ")"
3304
3305//{----------------------------------------------------------------------------------------------------------------
3306//! @ingroup Misc
3307//! @brief Ð˜Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ функции
3308//!
3309//! @warning ЕÑли определение имени функции не поддерживаетÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ñтором, то __TX_FUNCTION__ раÑкрываетÑÑ Ð² имÑ
3310//! иÑходного файла и номер Ñтроки.
3311//!
3312//! @hideinitializer
3313//}----------------------------------------------------------------------------------------------------------------
3314
3315#if defined (__GNUC__)
3316 #define __TX_FUNCTION__ __PRETTY_FUNCTION__
3317
3318#elif defined (__FUNCSIG__)
3319 #define __TX_FUNCTION__ __FUNCSIG__
3320
3321#elif defined (__FUNCTION__)
3322 #define __TX_FUNCTION__ __FUNCTION__
3323
3324#elif defined (__INTEL_COMPILER) && (__INTEL_COMPILER >= 600)
3325 #define __TX_FUNCTION__ __FUNCTION__
3326
3327#elif defined (__BORLANDC__) && (__BORLANDC__ >= 0x550)
3328 #define __TX_FUNCTION__ __FUNC__
3329
3330#elif defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
3331 #define __TX_FUNCTION__ __func__
3332
3333#elif defined (__PYTHON__)
3334 #error No Python. No. Using parseltongue languages can lead you to Slytherin.
3335
3336#else
3337 #define __TX_FUNCTION__ "(" __TX_FILELINE__ ")"
3338
3339#endif
3340
3341//{----------------------------------------------------------------------------------------------------------------
3342//! @ingroup Misc
3343//! @brief Ð˜Ð¼Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° Ñборки
3344//! @hideinitializer
3345//}----------------------------------------------------------------------------------------------------------------
3346
3347#if !defined (NDEBUG) && defined (_DEBUG)
3348 #define _TX_BUILDMODE "DEBUG"
3349
3350#elif !defined (NDEBUG) && !defined (_DEBUG)
3351 #define _TX_BUILDMODE "Debug"
3352
3353#elif defined (NDEBUG)
3354 #define _TX_BUILDMODE "Release"
3355#endif
3356
3357//! @{ @cond INTERNAL
3358
3359#define TX_PREPROCESS( sym ) _TX_QUOTE (sym)
3360#define _TX_QUOTE( sym ) #sym
3361
3362//! @endcond
3363
3364//{----------------------------------------------------------------------------------------------------------------
3365//! @ingroup Misc
3366//! @brief Ð˜Ð¼Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ TXLib, входит в диагноÑтичеÑкие ÑообщениÑ.
3367//!
3368//! @note Можно переопределÑть до Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° TXLib.h.
3369//!
3370//! @hideinitializer
3371//}----------------------------------------------------------------------------------------------------------------
3372
3373#if !defined (_TX_MODULE)
3374 #define _TX_MODULE "TXLib"
3375#endif
3376
3377//! @}
3378//}
3379//=================================================================================================================
3380
3381//=================================================================================================================
3382//{ Back-hole (I hope, not an ass-hole:) of the library)
3383//! @name Очень Ñлужебные функции
3384//=================================================================================================================
3385//! @{
3386//{----------------------------------------------------------------------------------------------------------------
3387//! @ingroup Service
3388//! @brief УÑтанавливает альтернативную функцию обработки оконных Ñообщений Windows (оконную функцию) Ð´Ð»Ñ Ð¾ÐºÐ½Ð°
3389//! TXLib.
3390//!
3391//! @param wndProc ÐÐ¾Ð²Ð°Ñ Ð¾ÐºÐ¾Ð½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾ÐºÐ½Ð° TXLib. @n
3392//! ЕÑли NULL, то Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¾ÐºÐ¾Ð½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÑƒÐ´Ð°Ð»ÑетÑÑ Ð¸ уÑтанавливаетÑÑ ÑтандартнаÑ.
3393//!
3394//! @return ÐÐ´Ñ€ÐµÑ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÐµÐ¹ оконной функции Ð´Ð»Ñ Ð¾ÐºÐ½Ð° TXLib.
3395//!
3396//! Ð—Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ð¾ÐºÐ¾Ð½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ вызыватьÑÑ @b до обработки ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ ÑредÑтвами TXLib.
3397//! Она должна быть функцией Ñо Ñледующим прототипом:
3398//! @code
3399//! LRESULT CALLBACK NewWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam);
3400//! @endcode
3401//!
3402//! @warning ÐžÐºÐ¾Ð½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ вызыватьÑÑ Ð¸Ð· вÑпомогательного (второго) потока, Ñоздаваемого @ref
3403//! txCreateWindow(). Ðто @b не тот же Ñамый поток, в котором выполнÑетÑÑ main(). Ð’ ÑвÑзи Ñ Ñтим будьте
3404//! внимательны при работе Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ переменными или их аналогами, Ñ‚.к. может возникнуть "гонка
3405//! потоков" (race condition).
3406//!
3407//! @warning ЕÑли Ð¾ÐºÐ¾Ð½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²ÐµÑ€Ð½ÐµÑ‚ значение, не равное 0, то ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° Ñообщений ÑредÑтвами TXLib
3408//! @b не будет произведена. Из-за Ñтого, возможно, окно даже не Ñможет нормально закрытьÑÑ. ПридетÑÑ
3409//! завершать программу Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Alt-Ctrl-Del из диÑпетчера задач, или из более продвинутого диÑпетчера
3410//! <a href=http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx> Process Explorer</a>. ЕÑли Ð’Ñ‹
3411//! берете на ÑÐµÐ±Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÑƒ оконных Ñообщений, делайте ее по правилам Win32 (Ñм. MSDN), Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²Ñ‹Ð·Ð¾Ð²
3412//! DefWindowProc().
3413//!
3414//! @note ПолноÑтью поменÑть оконную функцию можно Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ функций SetWindowLong или SetWindowLongPtr:
3415//! @code
3416//! WNDPROC OldWndProc = (WNDPROC) SetWindowLongPtr (txWindow(), GWL_WNDPROC, (LONG_PTR) NewWndProc);
3417//! @endcode
3418//! При Ñтом надо обÑзательно вÑегда вызывать Ñтарую оконную функцию Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ CallWindowProc, (Ñм. MSDN),
3419//! иначе поÑледÑÑ‚Ð²Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ такими же плачевными, как опиÑаны выше.
3420//!
3421//! @see txCreateWindow(), txDialog, txInputBox()
3422//!
3423//! @usage @code
3424//! LRESULT CALLBACK MyWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam);
3425//!
3426//! int main()
3427//! {
3428//! txCreateWindow (GetSystemMetrics (SM_CXSCREEN) / 4, GetSystemMetrics (SM_CYSCREEN) / 4);
3429//!
3430//! txSetWindowsHook (MyWndProc);
3431//!
3432//! txDrawText (0, 0, txGetExtentX(), txGetExtentY(), "MOV txWindow, eax [please]");
3433//!
3434//! return 0;
3435//! }
3436//!
3437//! LRESULT CALLBACK MyWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam)
3438//! {
3439//! if (message == WM_MOVE) txMessageBox (" I like to MOVe it, MOVe it", "TXLib 2 Real", MB_ICONINFORMATION);
3440//!
3441//! static int i = 0;
3442//! if (i++ % 10 == 0) printf ("\b" "%c", "-\\|/" [i/10 % 4]); // Прропппеллллерррр
3443//!
3444//! return 0; // Продолжить обработку ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÑредÑтвами TXLib
3445//! }
3446//! @endcode
3447//}----------------------------------------------------------------------------------------------------------------
3448
3449WNDPROC txSetWindowsHook (WNDPROC wndProc = NULL);
3450
3451//{----------------------------------------------------------------------------------------------------------------
3452//! @ingroup Service
3453//! @brief Блокировка холÑта (контекÑта риÑованиÑ).
3454//!
3455//! @param wait Ожидать конца перериÑовки окна вÑпомогательным потоком
3456//!
3457//! @return СоÑтоÑние блокировки
3458//!
3459//! Перед вызовом любых функций Win32 GDI необходимо заблокировать холÑÑ‚ функцией txLock() и затем
3460//! разблокировать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ txUnlock(). Ðто ÑвÑзано Ñ Ñ‚ÐµÐ¼, что обновление Ñодержимого окна (Ð´Ð»Ñ Ñ‚ÐµÑ…, кто
3461//! знает Win32: обработка ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ WM_PAINT) в библиотеке TXLib проиÑходит в отдельном вÑпомогательном
3462//! потоке. Ðадолго блокировать его Ð½ÐµÐ»ÑŒÐ·Ñ - при заблокированном потоке окно не обновлÑетÑÑ.
3463//!
3464//! txLock() иÑпользует EnterCriticalSection(), и физичеÑки приоÑтанавливает поток, обновлÑющий окно, так
3465//! что надолго блокировать нельзÑ. Иначе тормозитÑÑ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° оконных Ñообщений, окно переÑтает
3466//! реагировать на дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ перериÑовыватьÑÑ. ÐÐµÐ»ÑŒÐ·Ñ Ñ‚Ð°ÐºÐ¶Ðµ вызывать txSleep() или Sleep()
3467//! при заблокированном потоке.
3468//!
3469//! txLock() / txUnlock() - Ñто низкоуровневый механизм. Он отличаетÑÑ Ð¾Ñ‚ более проÑтого выÑокоуровневого
3470//! механизма txBegin() / txEnd() / txUpdateWindow(), который не приоÑтанавливает поток, а проÑто
3471//! отключает принудительное поÑтоÑнное обновление окна.
3472//!
3473//! @see txDC(), txLock(), txUnlock(), txGDI()
3474//!
3475//! @usage См. иÑходный текÑÑ‚ функций _txCanvas_OnPAINT() и _txConsole_Draw() в TXLib.h.
3476//}----------------------------------------------------------------------------------------------------------------
3477
3478bool txLock (bool wait = true);
3479
3480//{----------------------------------------------------------------------------------------------------------------
3481//! @ingroup Service
3482//! @brief Разблокировка холÑта
3483//!
3484//! @return СоÑтоÑние блокировки (вÑегда false).
3485//!
3486//! Более подробно Ñм. в опиÑании txLock().
3487//!
3488//! @see txDC(), txLock(), txGDI()
3489//!
3490//! @usage См. иÑходный текÑÑ‚ функций _txCanvas_OnPAINT() и _txConsole_Draw() в TXLib.h.
3491//}----------------------------------------------------------------------------------------------------------------
3492//! @{
3493
3494bool txUnlock();
3495
3496//! @cond INTERNAL
3497template <typename T> inline T txUnlock (T value);
3498//! @endcond
3499
3500//! @}
3501
3502//{----------------------------------------------------------------------------------------------------------------
3503//! @ingroup Service
3504//! @brief Вызов функции Win32 GDI Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой блокировкой и разблокировкой.
3505//!
3506//! @param command Команда GDI (возможно, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ)
3507//!
3508//! @return Значение, возвращаемое вызываемой функцией GDI. ЕÑли ÑиÑтема риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ готова, возвращаетÑÑ
3509//! значение false.
3510//!
3511//! @note ЕÑли ÑиÑтема риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ готова (txDC() возвращает NULL), то команда GDI не выполнÑетÑÑ, а txGDI()
3512//! возвращает значение false. @n
3513//!
3514//! @note ЕÑли в вызове функции GDI иÑпользуютÑÑ Ð·Ð°Ð¿Ñтые, то иÑпользуйте двойные Ñкобки, чтобы получилÑÑ Ð¾Ð´Ð¸Ð½
3515//! параметр, так как txGDI() вÑе-таки макроÑ.
3516//!
3517//! @see txDC(), txLock(), txUnlock()
3518//!
3519//! @usage @code
3520//! txGDI (( Rectangle (txDC(), x1, y1, x2, y2) )); // Ðе забудьте про две ((ДВЕ)) Ñкобки
3521//! @endcode
3522//!
3523//! @hideinitializer
3524//}----------------------------------------------------------------------------------------------------------------
3525
3526#define txGDI( command ) txUnlock ( (txLock(), (command)) )
3527
3528//! @}
3529//}
3530//=================================================================================================================
3531
3532//=================================================================================================================
3533//{ Tune-up constants and variables
3534//! @name ÐаÑтроечные конÑтанты и переменные
3535//=================================================================================================================
3536//! @{
3537//{----------------------------------------------------------------------------------------------------------------
3538//! @ingroup Technical
3539//! @brief Запрет ранней инициализации TXLib
3540//!
3541//! ЕÑли конÑтанта определена Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ \#define @a до Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ TXLib.h в программу, раннÑÑ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ
3542//! (до запуÑка функции @c main) @b не проводитÑÑ.
3543//!
3544//! @note РаннÑÑ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚:
3545//! - Открытие окна конÑоли,
3546//! - УÑтановку кодовой Ñтраницы _TX_CP (1251) конÑоли Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ руÑÑкого Ñзыка,
3547//! - УÑтановку руÑÑкой локали Ñтандартной библиотеки,
3548//! - ÐŸÐµÑ€ÐµÐ¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐº stdio и iostream на Ñлучай, еÑли приложение не Ñкомпоновано как конÑольное
3549//! и библиотеки оÑталиÑÑŒ неинициализированы,
3550//! - Перехват ÑиÑтемных Ñигналов (деление на 0, обращение по неверному адреÑу и Ñ‚.д.),
3551//! - Перехват необработанных иÑключений,
3552//! - Смена заголовка конÑольного окна,
3553//! - УÑтановка режима паузы по завершении программы, чтобы окно закрывалоÑÑŒ не Ñразу,
3554//! - Подавление паузы при запуÑке из Ñред программированиÑ, заÑтавлÑющей нажимать на клавишу два раза. @nn
3555//!
3556//! @note ЕÑли раннÑÑ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð°, но в EXE-файле ÑоздаетÑÑ Ð¾ÐºÐ½Ð¾ TXLib Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ txCreateWindow(),
3557//! то библиотека вÑе равно будет инициализирована. Ð’ @b DLL раннÑÑ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° @b не проводитÑÑ. @nn
3558//!
3559//! @note РаннÑÑ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ðµ потокобезопаÑна (not thread-safe).
3560//!
3561//! @see txCreateWindow(), _TX_ALLOW_KILL_PARENT, _TX_WAITABLE_PARENTS, _txConsoleMode
3562//!
3563//! @usage @code
3564//! #define _TX_NOINIT
3565//! #include "TXLib.h"
3566//! @endcode
3567//!
3568//! @hideinitializer
3569//}----------------------------------------------------------------------------------------------------------------
3570
3571#if defined (_TX_NOINIT)
3572
3573 #undef _TX_NOINIT
3574 #define _TX_NOINIT 1
3575
3576#else
3577
3578 #define _TX_NOINIT 0
3579
3580#endif
3581
3582//{----------------------------------------------------------------------------------------------------------------
3583//! @ingroup Technical
3584//! @brief Режим Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñольного окна. ДопуÑтимы любые флаги функции ShowWindow.
3585//!
3586//! По умолчанию: @c SW_HIDE @d Скрывать конÑольное окно.
3587//!
3588//! @note ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑƒÑтанавливаетÑÑ @b до Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¾ÐºÐ½Ð° библиотеки.
3589//!
3590//! @see _TX_NOINIT
3591//!
3592//! @usage @code
3593//! _txConsoleMode = SW_HIDE; // Ð’Ñегда Ñкрывать конÑольное окно
3594//! txCreateWindow (800, 600);
3595//!
3596//! _txConsoleMode = SW_SHOW; // Ð’Ñегда показывать конÑольное окно
3597//! txCreateWindow (800, 600);
3598//! @endcode
3599//}----------------------------------------------------------------------------------------------------------------
3600
3601unsigned _txConsoleMode = SW_HIDE;
3602
3603//{----------------------------------------------------------------------------------------------------------------
3604//! @ingroup Technical
3605//! @brief Стиль графичеÑкого окна библиотеки.
3606//!
3607//! @note
3608//! - ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑƒÑтанавливаетÑÑ @b до Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¾ÐºÐ½Ð° библиотеки.
3609//!
3610//! @usage @code
3611//! _txWindowStyle &= ~WS_CAPTION; // FullScreen: окно без заголовка, размером Ñ Ñкран
3612//! txCreateWindow (GetSystemMetrics (SM_CXSCREEN), GetSystemMetrics (SM_CYSCREEN));
3613//!
3614//! printf ("Закройте Ð¼ÐµÐ½Ñ Ñ‡ÐµÑ€ÐµÐ· Alt+F4\n");
3615//! @endcode
3616//}----------------------------------------------------------------------------------------------------------------
3617
3618unsigned _txWindowStyle = WS_POPUP | WS_BORDER | WS_CAPTION | WS_SYSMENU;
3619
3620//{----------------------------------------------------------------------------------------------------------------
3621//! @ingroup Technical
3622//! @brief Шрифт конÑоли
3623//! @note ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑƒÑтанавливаетÑÑ @b до Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¾ÐºÐ½Ð° библиотеки.
3624//}----------------------------------------------------------------------------------------------------------------
3625
3626const char* _txConsoleFont = "Lucida Console";
3627
3628//{----------------------------------------------------------------------------------------------------------------
3629//! @ingroup Technical
3630//! @brief Интервал Ð¼Ð¸Ð³Ð°Ð½Ð¸Ñ ÐºÑƒÑ€Ñора конÑоли (мÑ)
3631//}----------------------------------------------------------------------------------------------------------------
3632
3633unsigned _txCursorBlinkInterval = 500;
3634
3635//{----------------------------------------------------------------------------------------------------------------
3636//! @ingroup Technical
3637//! @brief Интервал Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ…Ð¾Ð»Ñта (мÑ)
3638//! @note ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑƒÑтанавливаетÑÑ @b до Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¾ÐºÐ½Ð° библиотеки.
3639//}----------------------------------------------------------------------------------------------------------------
3640
3641int _txWindowUpdateInterval = 25;
3642
3643//{----------------------------------------------------------------------------------------------------------------
3644//! @ingroup Technical
3645//! @brief Таймаут операций Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (мÑ)
3646//}----------------------------------------------------------------------------------------------------------------
3647
3648#if !defined (TX_TRACE)
3649 const int _TX_TIMEOUT = 1000
3650
3651#else
3652 const int _TX_TIMEOUT = 5000
3653
3654#endif
3655
3656#if defined (_TX_USE_DEVPARTNER)
3657 * 10
3658#endif
3659 ;
3660
3661//{----------------------------------------------------------------------------------------------------------------
3662//! @ingroup Technical
3663//! @brief Размеры внутренних ÑтатичеÑких Ñтроковых буферов TXLib
3664//}----------------------------------------------------------------------------------------------------------------
3665
3666const unsigned _TX_BUFSIZE = 1024;
3667
3668//{----------------------------------------------------------------------------------------------------------------
3669//! @ingroup Technical
3670//! @brief Размеры внутренних ÑтатичеÑких Ñтроковых буферов TXLib
3671//}----------------------------------------------------------------------------------------------------------------
3672
3673const unsigned _TX_BIGBUFSIZE = 2048;
3674
3675//{----------------------------------------------------------------------------------------------------------------
3676//! @ingroup Technical
3677//! @brief СпиÑок запуÑкающих программ, которые ждут Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ¸ поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа TXLib.
3678//!
3679//! ЕÑли программа перечиÑлена в ÑпиÑке и TXLib запущена из нее, то при завершении TXLib указаннаÑ
3680//! программа будет закрыта. (Ðто произойдет, еÑли не открыто графичеÑкое окно TXLib, а еÑть только окно
3681//! конÑоли.)
3682//!
3683//! Программы разделÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼ или запÑтой. ДопуÑкаетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ðµ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð·Ð°Ð¿ÑƒÑкающей программы, поÑле
3684//! двоеточиÑ.
3685//!
3686//! Может задаватьÑÑ Ð¿ÐµÑ€ÐµÐ´ включением TXLib.h в программу.
3687//!
3688//! @see _TX_ALLOW_KILL_PARENT, _TX_NOINIT
3689//}----------------------------------------------------------------------------------------------------------------
3690
3691 // TX_VEGETABLE_PRINTERS
3692#if !defined (_TX_WAITABLE_PARENTS)
3693 #define _TX_WAITABLE_PARENTS "cmd.exe:devenv.exe, " /* MSVS 2003-2010 */ \
3694 "vcspawn.exe:msdev.exe, " /* MSVS 6 */ \
3695 "cb_console_runner.exe:codeblocks.exe, " /* CodeBlocks 8-10 */ \
3696 "cmd.exe:console_runner.exe, " /* CodeBlocks 1 */ \
3697 "starter.exe:eclipse.exe, " /* Eclipse 4 */ \
3698 "starter.exe:javaw.exe, " /* Eclipse 3 */ \
3699 "consolepauser.exe:devcpp.exe" /* Dev-Cpp */
3700#endif
3701
3702//{----------------------------------------------------------------------------------------------------------------
3703//! @ingroup Technical
3704//! @brief Разрешать принудительное завершение вызывающих программ, ждущих Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ TXLib.
3705//!
3706//! Иначе отменÑетÑÑ ÑобÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð¿Ð°ÑƒÐ·Ð° до Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ¸, вÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ð² TXLib, и пуÑть тогда паузу делает
3707//! вызывающий процеÑÑ.
3708//!
3709//! СпиÑок вызывающих программ, которые могут делать такую паузу, задаетÑÑ Ð² _TX_WAITABLE_PARENTS.
3710//!
3711//! Может задаватьÑÑ Ð¿ÐµÑ€ÐµÐ´ включением TXLib.h в программу.
3712//!
3713//! См. также определение Ñтой конÑтанты в файле TXLib.h.
3714//!
3715//! @see _TX_WAITABLE_PARENTS, _TX_NOINIT
3716//!
3717//! @usage @code
3718//! #define _TX_ALLOW_KILL_PARENT false
3719//! #include "TXLib.h"
3720//! @endcode
3721//}----------------------------------------------------------------------------------------------------------------
3722
3723#if !defined (_TX_ALLOW_KILL_PARENT) // DISCLAIMER: Я не призываю к убийÑтву родителей!
3724#define _TX_ALLOW_KILL_PARENT true // Ðто техничеÑкий термин.
3725#endif // г-дам юриÑтам привет.
3726
3727//! @}
3728//}
3729//=================================================================================================================
3730
3731//=================================================================================================================
3732//{ Internal diagnostics
3733//! @name ВнутреннÑÑ Ð´Ð¸Ð°Ð³Ð½Ð¾Ñтика
3734//=================================================================================================================
3735//! @{
3736//{----------------------------------------------------------------------------------------------------------------
3737//! @ingroup Technical
3738//! @brief Включает/отключает внутреннюю траÑÑировку иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð° библиотеки.
3739//!
3740//! ТраÑÑировка идет через Ð¼Ð°ÐºÑ€Ð¾Ñ TX_TRACE, который подÑтавлÑетÑÑ Ð¿ÐµÑ€ÐµÐ´ каждым оператором (statement).
3741//! По умолчанию траÑÑировка выключена.
3742//!
3743//! По умолчанию траÑÑировка ведетÑÑ Ñ‡ÐµÑ€ÐµÐ· функцию OutputDebugString(), ее вывод можно перехватить
3744//! утилитами-логгерами, например, <a href=http://technet.microsoft.com/ru-ru/sysinternals/bb896647%28en-us%29.aspx>
3745//! DbgView</a>. Ðто можно изменить, переопределив Ð¼Ð°ÐºÑ€Ð¾Ñ TX_TRACE до Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ TXLib.h в программу.
3746//!
3747//! @warning ТраÑÑировка @b очень тормозит выполнение программы, оÑобенно при отладке в Microsoft Visual Studio.
3748//! Ð’ Ñтом Ñлучае лучше пользоватьÑÑ DbgView (Ñм. выше) и запуÑкать отлаживаемую программу отдельно,
3749//! а не из-под отладчика Visual Studio.
3750//!
3751//! _TX_ALLOW_TRACE и TX_TRACE задаютÑÑ Ð¿ÐµÑ€ÐµÐ´ включением TXLib.h в программу.
3752//!
3753//! @usage @code
3754//! #define _TX_ALLOW_TRACE // Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра траÑÑÑ‹ запуÑтить DbgView
3755//! #include "TXLib.h"
3756//! @endcode
3757//!
3758//! @hideinitializer
3759//}----------------------------------------------------------------------------------------------------------------
3760//! @{
3761
3762#ifdef FOR_DOXYGEN_ONLY
3763#define _TX_ALLOW_TRACE
3764#endif
3765
3766#if defined (_TX_ALLOW_TRACE)
3767 #undef $
3768 #define $ { _txFile = __FILE__; _txLine = __LINE__; _txFunc = __TX_FUNCTION__; TX_TRACE; }
3769 #undef $1
3770 #define $1 _txFuncEntry __txFuncEntry; $
3771
3772#elif defined (_DEBUG)
3773 #undef $
3774 #define $ { _txFile = __FILE__; _txLine = __LINE__; _txFunc = __TX_FUNCTION__; }
3775 #undef $1
3776 #define $1 _txFuncEntry __txFuncEntry; $
3777
3778#else
3779 #undef $
3780 #define $ ;
3781 #undef $1
3782 #define $1 ;
3783
3784#endif
3785
3786//! @}
3787
3788//{----------------------------------------------------------------------------------------------------------------
3789
3790//! @cond _OFF
3791
3792extern int _txInitialized;
3793extern unsigned volatile _txMainThreadId;
3794extern unsigned volatile _txCanvas_ThreadId;
3795extern bool _txConsole;
3796extern bool _txMain;
3797extern bool _txIsDll;
3798extern bool volatile _txRunning;
3799extern bool volatile _txExit;
3800extern bool volatile _txAllowTrace;
3801
3802extern const char* volatile _txFile;
3803extern int volatile _txLine;
3804extern const char* volatile _txFunc;
3805extern _TX_THREAD int volatile _txInTX;
3806
3807//! @endcond
3808
3809//! @cond INTERNAL
3810
3811struct _txFuncEntry
3812 {
3813 _txFuncEntry() { _txInTX++; }
3814 ~_txFuncEntry() { _txInTX--; }
3815 };
3816
3817//! @endcond
3818//}----------------------------------------------------------------------------------------------------------------
3819
3820//{----------------------------------------------------------------------------------------------------------------
3821//! @ingroup Technical
3822//! @brief ТраÑÑирует иÑполнение кода через OutputDebugString().
3823//!
3824//! По умолчанию траÑÑировка ведетÑÑ Ñ‡ÐµÑ€ÐµÐ· функцию OutputDebugString(), ее вывод можно перехватить
3825//! утилитами-логгерами, например, <a href=http://technet.microsoft.com/ru-ru/sysinternals/bb896647%28en-us%29.aspx>
3826//! DbgView</a>. Ð”Ð»Ñ "раÑкраÑки" лога еÑть файл <tt>TX\Dev\DbgView.ini,</tt> его надо загрузить в DbgView
3827//! через меню Edit/Filter/Load (Ctrl+L).
3828//!
3829//! С помощью TX_TRACE можно траÑÑировать код Ñамой библиотеки TXLib. Ð”Ð»Ñ Ñтого надо разрешить траÑÑировку
3830//! TXLib, определив Ð¼Ð°ÐºÑ€Ð¾Ñ _TX_ALLOW_TRACE перед включением файла TXLib.h в программу. По умолчанию
3831//! траÑÑировка TXLib выключена.
3832//!
3833//! TX_TRACE можно переопределить в Ñвой код. Тогда, еÑли траÑÑировка библиотеки разрешена, он будет
3834//! вызыватьÑÑ Ð¿Ð¾Ñ‡Ñ‚Ð¸ перед каждой иÑполнÑемой Ñтрокой TXLib. Может быть, Ñто кому-нибудь будет интереÑно.
3835//!
3836//! @usage @code
3837//! int main()
3838//! {
3839//! ...
3840//! TX_TRACE // Через DbgView увидим Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° и номер выполнÑемой Ñтроки
3841//! ...
3842//! }
3843//! @endcode
3844//! @code
3845//! #define TX_TRACE printf (__TX_FILELINE__ "\n");
3846//! #include "TXLib.h"
3847//! @endcode
3848//!
3849//! @hideinitializer
3850//}----------------------------------------------------------------------------------------------------------------
3851//! @{
3852
3853#ifdef FOR_DOXYGEN_ONLY
3854#define TX_TRACE
3855#endif
3856
3857#if !defined (TX_TRACE)
3858 #define TX_TRACE if (_txAllowTrace) _txTrace (__FILE__, __LINE__, __TX_FUNCTION__);
3859#endif
3860
3861//! @}
3862
3863//{----------------------------------------------------------------------------------------------------------------
3864
3865//! @cond INTERNAL
3866
3867void _txTrace (const char file[], int line, const char func[], const char msg[] = NULL, ...);
3868void _txTrace (const char file[], int line, const char func[], const char msg[] /* = NULL */, ...)
3869 {
3870 unsigned id = GetCurrentThreadId();
3871
3872 const char marks[2][2][3] = {{"uU", "cC"}, {"mM", "??"}};
3873
3874 char mark = marks [id == _txMainThreadId] [id == _txCanvas_ThreadId] [(_txInTX > 0)];
3875
3876 char msgStr[_TX_BUFSIZE] = "";
3877 if (msg)
3878 {
3879 va_list arg; va_start (arg, msg);
3880 _vsnprintf_s (msgStr, sizeof (msgStr) - 1 _TX_TRUNCATE, msg, arg);
3881 va_end (arg);
3882 }
3883
3884 txOutputDebugPrintf ("%s - %p %c%c%c%c%c%c [%c] - %s (%d) " "|%*s%s" "%s%s\n",
3885 _TX_VERSION, (void*) &_txInitialized,
3886 "cC"[_txConsole], "mM"[_txMain], "dD"[_txIsDll], "rR"[_txRunning], "eE"[_txExit], "tT"[_txAllowTrace],
3887 mark, (file? file : "(NULL file)"), line, (_txInTX - 1) * 2, "", (func? func : ""),
3888 (*msgStr? ": " : ""), msgStr);
3889 }
3890
3891//! @endcond
3892//}----------------------------------------------------------------------------------------------------------------
3893
3894//=================================================================================================================
3895//{ Sweet critical section blocking: txAutoLock class
3896//=================================================================================================================
3897
3898//{----------------------------------------------------------------------------------------------------------------
3899//! @ingroup Service
3900//! @brief КлаÑÑ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой блокировки и разблокировки критичеÑкой Ñекции.
3901//!
3902//! ÐÐ°Ñ‡Ð¸Ð½Ð°Ñ Ñ <a href=http://progbook.ru/2008/08/03/sovremennoe-proektirovanie-na-c-andrejj.html>
3903//! ÐлекÑандреÑку,</a> его пишут вÑе и он проÑÑ‚, как пробка: в конÑтрукторе @d EnterCriticalSection(),
3904//! в деÑтрукторе @d LeaveCriticalSection(). Ðто @c RAII в чиÑтом виде: вы никогда не забудете разблочить
3905//! Ñекцию and your thread show will always go on.
3906//!
3907//! Ðекоторые добавлениÑ: еÑть возожноÑть вызвать TryEnterCriticalSection(), и, еÑли она не заблочила
3908//! Ñекцию, деÑтруктор ее не разблочивает. ЕÑть оператор Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸, заблочилаÑÑŒ ли ÑÐµÐºÑ†Ð¸Ñ Ð¸Ð»Ð¸ нет
3909//! (Ñм. конÑтрукторы клаÑÑа и оператор @c bool).
3910//!
3911//! @note КлаÑÑ Ð½Ðµ инициализирует и не удалÑет критичеÑкую Ñекцию. Только Ñинхронизирует. ОÑтальное Ñами-Ñами :)
3912//!
3913//! @see txLock(), txUnlock(), txGDI()
3914//}----------------------------------------------------------------------------------------------------------------
3915
3916//! @cond _OFF
3917extern CRITICAL_SECTION _txCanvas_LockBackBuf;
3918//! @endcond
3919
3920class txAutoLock
3921 {
3922 public:
3923
3924//{----------------------------------------------------------------------------------------------------------------
3925//! @brief КонÑтруктор, блокирует критичеÑкую Ñекцию
3926//!
3927//! @param cs КритичеÑÐºÐ°Ñ ÑÐµÐºÑ†Ð¸Ñ Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸
3928//! @param mandatory ЕÑли @c true, то блокировать обÑзательно (EnterCriticalSection). @n
3929//! ЕÑли @c false, то только пытатьÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ (TryEnterCriticalSection).
3930//! @usage @code
3931//! CRITICAL_SECTION cs = {}; // This is not a Counter Strike
3932//!
3933//! void foo()
3934//! {
3935//! txAutoLock lock (&cs); // ЗдеÑÑŒ вызоветÑÑ EnterCriticalSection()
3936//! ...
3937//! } // а здеÑÑŒ LeaveCriticalsection()
3938//!
3939//! void bar()
3940//! {
3941//! txAutoLock lock (&cs, false); // TryEnterCriticalSection()
3942//! if (!lock) return; // ну не Ñмогла
3943//! ...
3944//! }
3945//! @endcode
3946//}----------------------------------------------------------------------------------------------------------------
3947
3948 txAutoLock (CRITICAL_SECTION* cs, bool mandatory = true) :
3949 cs_ (cs)
3950 {
3951$1 if (!cs_) return;
3952
3953 if (mandatory) { $ EnterCriticalSection (cs_); }
3954 else { $ TryEnterCriticalSection (cs_)? 0 : (cs_ = NULL); }
3955 }
3956
3957//{----------------------------------------------------------------------------------------------------------------
3958//! @brief КонÑтруктор Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ холÑта TXLib
3959//!
3960//! @param mandatory ЕÑли @c true, то блокировать @b обÑзательно, как в @ref txLock (true). @n
3961//! ЕÑли @c false, то только @b пытатьÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ, как в @ref txLock (false).
3962//! @usage @code
3963//! void foobar()
3964//! {
3965//! txAutoLock lock; // ЗдеÑÑŒ вызоветÑÑ txLock()
3966//! ...
3967//! } // а здеÑÑŒ txUnlock()
3968//! @endcode
3969//}----------------------------------------------------------------------------------------------------------------
3970
3971 txAutoLock (bool mandatory = true) :
3972 cs_ (NULL)
3973 {
3974$1 new (this) txAutoLock (&_txCanvas_LockBackBuf, mandatory);
3975 }
3976
3977//{----------------------------------------------------------------------------------------------------------------
3978//! @brief ДеÑтруктор, разблокирует Ñекцию
3979//}----------------------------------------------------------------------------------------------------------------
3980
3981 ~txAutoLock()
3982 {
3983$1 if (!cs_) return;
3984$ LeaveCriticalSection (cs_); cs_ = NULL;
3985 }
3986
3987//{----------------------------------------------------------------------------------------------------------------
3988//! @brief ПозволÑет проверить, заблокировалаÑÑŒ ÑÐµÐºÑ†Ð¸Ñ Ð¸Ð»Ð¸ нет
3989//! @usage См. в txAutoLock::AutoLock (CRITICAL_SECTION&, bool)
3990//}----------------------------------------------------------------------------------------------------------------
3991
3992 operator bool () const
3993 {
3994$1 return (cs_ != NULL);
3995 }
3996
3997//{----------------------------------------------------------------------------------------------------------------
3998//! Ð‘Ð»Ð¾ÐºÐ¸Ñ€ÑƒÐµÐ¼Ð°Ñ ÐºÑ€Ð¸Ñ‚Ð¸Ñ‡ÐµÑÐºÐ°Ñ ÑекциÑ
3999//}----------------------------------------------------------------------------------------------------------------
4000
4001// private:
4002 CRITICAL_SECTION* cs_;
4003
4004//{----------------------------------------------------------------------------------------------------------------
4005//! Такой вот копирайт.
4006//}----------------------------------------------------------------------------------------------------------------
4007//! @{
4008
4009 private:
4010 txAutoLock (const txAutoLock&);
4011 txAutoLock& operator = (const txAutoLock&);
4012
4013//! @}
4014
4015 };
4016
4017//}
4018//=================================================================================================================
4019
4020//! @}
4021//}
4022//=================================================================================================================
4023
4024//=================================================================================================================
4025//{ Dialogs: txDialog class
4026//! @name Работа Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð²Ñ‹Ð¼Ð¸ окнами. КлаÑÑ txDialog
4027//=================================================================================================================
4028//! @{
4029//{----------------------------------------------------------------------------------------------------------------
4030//! @ingroup Dialogs
4031//! @brief Базовый клаÑÑ Ð´Ð»Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð²Ñ‹Ñ… окон.
4032//!
4033//! Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñвоего диалогового окна нужно:
4034//! -# УнаÑледовать Ñвой клаÑÑ Ð¸Ð· Ñтого базового клаÑÑа;
4035//! -# Задать ÑоÑтав и раÑположение Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (контролов) функцией txDialog::setLayout(), или
4036//! указать карту раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ показе диалогового окна функцией txDialog::dialogBox();
4037//! -# Переопределить в Ñвоем клаÑÑе функцию txDialog::dialogProc() Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ Ñобытий диалогового
4038//! окна или поÑтроить карту реакций на команды Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ макроÑов TX_BEGIN_MESSAGE_MAP(),
4039//! TX_END_MESSAGE_MAP, TX_COMMAND_MAP.
4040//!
4041//! @see txDialog::setLayout(), txDialog::dialogProc(), txDialog::Layout, TX_BEGIN_MESSAGE_MAP(),
4042//! TX_END_MESSAGE_MAP, TX_COMMAND_MAP
4043//!
4044//! @usage @code
4045//! Cм. реализацию функции txInputBox().
4046//! @endcode
4047//}----------------------------------------------------------------------------------------------------------------
4048
4049struct txDialog
4050 {
4051
4052//{----------------------------------------------------------------------------------------------------------------
4053//! @ingroup Dialogs
4054//! @brief КонÑтанты Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° контрола.
4055//!
4056//! ВмеÑто конÑтант можно иÑпользовать Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¾ÐºÐ¾Ð½Ð½Ñ‹Ñ… клаÑÑов, преобразованные к типу txDialog::CONTROL.
4057//!
4058//! @see txDialog::Layout, txDialog::setLayout()
4059//!
4060//! @usage @code
4061//! Cм. реализацию функции txInputBox().
4062//! @endcode
4063//!
4064//! @hideinitializer
4065//}----------------------------------------------------------------------------------------------------------------
4066
4067 public:
4068 enum CONTROL
4069 {
4070 DIALOG = 0x00000000, //!< Ðачало опиÑÐ°Ð½Ð¸Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð°
4071 BUTTON = 0xFFFF0080, //!< Кнопка
4072 EDIT = 0xFFFF0081, //!< Редактируемый текÑÑ‚
4073 STATIC = 0xFFFF0082, //!< Ðередактируемый Ñлемент (текÑÑ‚, картинка и Ñ‚.д.)
4074 LISTBOX = 0xFFFF0083, //!< СпиÑок Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¾Ð¹
4075 SCROLLBAR = 0xFFFF0084, //!< ПолоÑа прокрутки
4076 COMBOBOX = 0xFFFF0085, //!< Комбинированный ÑпиÑок
4077 END = 0x00000000 //!< Конец опиÑÐ°Ð½Ð¸Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð°
4078 };
4079
4080//{----------------------------------------------------------------------------------------------------------------
4081//! @ingroup Dialogs
4082//! @brief КлаÑÑ Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ñлемента диалогового окна (контрола)
4083//!
4084//! МаÑÑив таких Ñтруктур задает опиÑание макета диалогового окна. Ðто опиÑание похоже на задание диалога
4085//! в реÑурÑном Ñкрипте (.rc):
4086//!
4087//! - Ðулевой Ñлемент опиÑывает диалоговое окно в целом
4088//! - ОÑтальные Ñлементы опиÑывают контролы (порÑдок Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² контрола похож на порÑдок
4089//! параметров в реÑурÑном Ñкрипте)
4090//! - ПоÑледний Ñлемент - txDialog::END или {NULL}
4091//!
4092//! @see txDialog::setLayout(), txDialog::dialogBox(), txDialog::dialogProc()
4093//!
4094//! @usage @code
4095//! Cм. реализацию функции txInputBox().
4096//! @endcode
4097//}----------------------------------------------------------------------------------------------------------------
4098
4099 public:
4100 struct Layout
4101 {
4102 CONTROL wndclass; //!< Тип контрола
4103 const char* caption; //!< Ðазвание или текÑÑ‚
4104 WORD id; //!< Идентификатор контрола
4105 short x; //!< Координата верхнего левого угла
4106 short y; //!< Координата нижнего правого угла
4107 short sx; //!< Размер по X
4108 short sy; //!< Размер по Y
4109 DWORD style; //!< Стиль контрола
4110
4111 const char* font; //!< Шрифт диалогового окна
4112 WORD fontsize; //!< Размер шрифта диалогового окна
4113 };
4114
4115//{----------------------------------------------------------------------------------------------------------------
4116//! @brief КонÑтруктор.
4117//!
4118//! @see txDialog::txDialog (const txDialog::Layout*)
4119//!
4120//! @usage @code
4121//! Cм. реализацию функции txInputBox().
4122//! @endcode
4123//}----------------------------------------------------------------------------------------------------------------
4124
4125 public:
4126 txDialog();
4127
4128//{----------------------------------------------------------------------------------------------------------------
4129//! @brief КонÑтруктор.
4130//!
4131//! @param layout Макет диалогового окна
4132//!
4133//! @see txDialog::Layout, txDialog::setLayout()
4134//!
4135//! @usage @code
4136//! Cм. реализацию функции txInputBox().
4137//! @endcode
4138//}----------------------------------------------------------------------------------------------------------------
4139
4140 txDialog (const Layout* layout);
4141
4142//{----------------------------------------------------------------------------------------------------------------
4143//! @brief ДеÑтруктор.
4144//}----------------------------------------------------------------------------------------------------------------
4145
4146 virtual ~txDialog() {};
4147
4148//{----------------------------------------------------------------------------------------------------------------
4149//! @brief УÑтанавливает текущий макет диалогового окна.
4150//!
4151//! @param layout Макет диалогового окна
4152//!
4153//! @return Предыдущий макет.
4154//!
4155//! @see txDialog::Layout, txDialog::txDialog (const txDialog::Layout*), txDialog::dialogBox()
4156//!
4157//! @usage @code
4158//! Cм. реализацию функции txInputBox().
4159//! @endcode
4160//}----------------------------------------------------------------------------------------------------------------
4161
4162 const Layout* setLayout (const Layout *layout);
4163
4164//{----------------------------------------------------------------------------------------------------------------
4165//! @brief Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ Ñообщений диалогового окна.
4166//!
4167//! @param _wnd ДеÑкриптор
4168//! @param _msg Ðомер ÑообщениÑ
4169//! @param _wParam 1-й параметр ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (WORD)
4170//! @param _lParam 2-й параметр ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (DWORD)
4171//!
4172//! @return Ð’ большинÑтве Ñлучаев false, детальнее Ñм. DialogProc в <a href=msdn.com>MSDN</a>.
4173//!
4174//! Ðту функцию надо переопределить Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ Ñобытий окна, или поÑтроить ее Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ макроÑов
4175//! TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_COMMAND_MAP.
4176//!
4177//! @see txDialog::dialogBox(), TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_COMMAND_MAP
4178//!
4179//! @usage @code
4180//! Cм. реализацию функции txInputBox().
4181//! @endcode
4182//}----------------------------------------------------------------------------------------------------------------
4183
4184 virtual int dialogProc (HWND _wnd, UINT _msg, WPARAM _wParam, LPARAM _lParam);
4185
4186//{----------------------------------------------------------------------------------------------------------------
4187//! @brief ЗапуÑкает диалоговое окно.
4188//!
4189//! @param layout Макет диалогового окна. @n
4190//! ЕÑли не указан - иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ, заданное txDialog::setLayout() или конÑтруктором
4191//! txDialog::txDialog (const txDialog::Layout*).
4192//! @param bufsize Размер буфера Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° диалога (еÑли не указан - размер по умолчанию)
4193//!
4194//! @return Значение, указанное в функции EndDialog(). @n
4195//! По умолчанию - Ð°Ð´Ñ€ÐµÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° <i>(this),</i> Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ была запущена txDialog::dialogBox().
4196//!
4197//! @see txDialog::dialogProc(), txDialog::setLayout(), txDialog::Layout, txDialog
4198//!
4199//! @usage @code
4200//! Cм. реализацию функции txInputBox().
4201//! @endcode
4202//}----------------------------------------------------------------------------------------------------------------
4203
4204 INT_PTR dialogBox (const Layout* layout = NULL, size_t bufsize = 0);
4205
4206//{----------------------------------------------------------------------------------------------------------------
4207//! @brief ЗапуÑкает диалоговое окно.
4208//!
4209//! @param resource Идентификатор диалогового реÑурÑа
4210//!
4211//! @return Значение, указанное в функции EndDialog(). @n
4212//! По умолчанию - Ð°Ð´Ñ€ÐµÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° <i>(this),</i> Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ была запущена txDialog::dialogBox().
4213//!
4214//! @see txDialog::dialogProc()
4215//!
4216//! @usage @code
4217//! Cм. реализацию функции txInputBox().
4218//! @endcode
4219//}----------------------------------------------------------------------------------------------------------------
4220
4221 INT_PTR dialogBox (WORD resource);
4222
4223//{----------------------------------------------------------------------------------------------------------------
4224//! @brief Закрытые конÑтруктор ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ оператор приÑваиваниÑ.
4225//}----------------------------------------------------------------------------------------------------------------
4226
4227 private:
4228 txDialog (const txDialog&);
4229 txDialog& operator = (const txDialog&);
4230
4231//{----------------------------------------------------------------------------------------------------------------
4232//! ÐаÑтоÑÑ‰Ð°Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð²Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ (не txDialog::dialogProc(), Ñ‚.к. Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾ÐºÐ½Ð° in32 должна быть ÑтатичеÑкой).
4233//}----------------------------------------------------------------------------------------------------------------
4234
4235 private:
4236 static ptrdiff_t CALLBACK dialogProc__ (HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam);
4237
4238//{----------------------------------------------------------------------------------------------------------------
4239//! Текущий макет диалога.
4240//}----------------------------------------------------------------------------------------------------------------
4241
4242 private:
4243 const Layout* layout_;
4244 };
4245
4246//! @}
4247//}
4248//=================================================================================================================
4249
4250//=================================================================================================================
4251//{ Dialogs: Message Map macros
4252//! @name МакроÑÑ‹ Ð´Ð»Ñ Ð¿Ð¾ÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ ÑтатичеÑкой карты Ñообщений (Message Map)
4253//=================================================================================================================
4254//! @{
4255//{----------------------------------------------------------------------------------------------------------------
4256//! @ingroup Misc
4257//! @brief Заголовок карты Ñообщений (Message Map).
4258//!
4259//! @see TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog
4260//!
4261//! @usage @code
4262//! Cм. реализацию функции txInputBox().
4263//! @endcode
4264//!
4265//! @hideinitializer
4266//}----------------------------------------------------------------------------------------------------------------
4267
4268#define TX_BEGIN_MESSAGE_MAP() \
4269 virtual int dialogProc (HWND _wnd, UINT _msg, WPARAM _wParam, LPARAM _lParam) \
4270 { \
4271 (void)_wnd; (void)_msg; (void)_wParam; (void)_lParam; \
4272 \
4273 switch (_msg) \
4274 { \
4275 case WM_NULL:
4276
4277//{----------------------------------------------------------------------------------------------------------------
4278//! @ingroup Misc
4279//! @brief Заголовок обработчика ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (Message handler) карты Ñообщений.
4280//!
4281//! @param id Идентификатор ÑообщениÑ
4282//!
4283//! @see TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog
4284//!
4285//! @usage @code
4286//! Cм. реализацию функции txInputBox().
4287//! @endcode
4288//!
4289//! @hideinitializer
4290//}----------------------------------------------------------------------------------------------------------------
4291
4292#define TX_HANDLE( id ) \
4293 break; \
4294 case (id):
4295
4296//{----------------------------------------------------------------------------------------------------------------
4297//! @ingroup Misc
4298//! @brief Ðачало карты команд (Command map) в карте Ñообщений.
4299//!
4300//! @see TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog
4301//!
4302//! @usage @code
4303//! Cм. реализацию функции txInputBox().
4304//! @endcode
4305//!
4306//! @hideinitializer
4307//}----------------------------------------------------------------------------------------------------------------
4308
4309#define TX_COMMAND_MAP \
4310 default: break; \
4311 } \
4312 \
4313 if (_msg == WM_COMMAND) switch (LOWORD (_wParam)) \
4314 { \
4315 case 0:
4316
4317//{----------------------------------------------------------------------------------------------------------------
4318//! @ingroup Misc
4319//! @brief Завершитель карты Ñообщений.
4320//!
4321//! @see TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog
4322//!
4323//! @usage @code
4324//! Cм. реализацию функции txInputBox().
4325//! @endcode
4326//!
4327//! @hideinitializer
4328//}----------------------------------------------------------------------------------------------------------------
4329
4330#define TX_END_MESSAGE_MAP \
4331 default: break; \
4332 } \
4333 \
4334 return FALSE; \
4335 }
4336
4337//! @}
4338//}
4339//=================================================================================================================
4340
4341//=================================================================================================================
4342//{ Dialogs: txDialog example: txInputBox()
4343//! @name Пример иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»Ð°ÑÑа диалога: Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ txInputBox()
4344//=================================================================================================================
4345//! @{
4346//{----------------------------------------------------------------------------------------------------------------
4347//! @ingroup Dialogs
4348//! @brief Ввод Ñтроки в отдельном окне.
4349//!
4350//! @param text ТекÑÑ‚ Ñ Ð²Ð¾Ð¿Ñ€Ð¾Ñом
4351//! @param caption Заголовок окна
4352//! @param input Значение Ñтроки по умолчанию
4353//!
4354//! @return Ð’Ð²ÐµÐ´ÐµÐ½Ð½Ð°Ñ Ñтрока (ÑтатичеÑÐºÐ°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸).
4355//!
4356//! @warning Ð’Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÐ¼Ð°Ñ Ñтрока - ÑтатичеÑкаÑ, и обновлÑетÑÑ Ð¿Ñ€Ð¸ каждом вызове функции. ЕÑли txInputBox() будет
4357//! вызыватьÑÑ Ð½ÐµÑколько раз, то Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñтроки ее необходимо копировать в другую Ñтроку при помощи
4358//! <i>strcpy()</i>.
4359//!
4360//! @see txDialog, TX_BEGIN_MESSAGE_MAP, TX_BEGIN_COMMAND_MAP, TX_HANDLE, TX_END_MESSAGE_MAP
4361//!
4362//! @usage @code
4363//! const char* name = txInputBox ("So what's ur name?!?!", "System", "Sorry I'm Vasya Pupkin");
4364//! txMessageBox (name, "Aaand nooowww.. the winner iiis...");
4365//! @endcode
4366//}----------------------------------------------------------------------------------------------------------------
4367
4368const char* txInputBox (const char* text = NULL, const char* caption = NULL, const char* input = NULL);
4369
4370const char* txInputBox (const char* text, const char* caption, const char* input)
4371 {
4372 //-------------------------------------------------------------------------------------------------------------
4373 // ЕÑли не указаны параметры, приходитÑÑ Ð¸Ñпользовать хоть какие-то надпиÑи.
4374 // txGetModuleFileName() - Ð¸Ð¼Ñ EXE-файла, на Ñлучай, еÑли кое-кто поленилÑÑ Ð·Ð°Ð´Ð°Ñ‚ÑŒ название.
4375 //-------------------------------------------------------------------------------------------------------------
4376
4377 if (!text) text = "Введите Ñтроку:";
4378 if (!caption) caption = txGetModuleFileName (false);
4379 if (!input) input = "";
4380
4381 //-------------------------------------------------------------------------------------------------------------
4382 // Идентификаторы Ñлементов диалога. Они требуютÑÑ Ð² GetDlgItemText().
4383 // ЕÑли диалог ÑтроитÑÑ Ð½Ðµ вручную, а редактором реÑурÑов, то они задаютÑÑ Ð² нем автоматичеÑки.
4384 // У Ð½Ð°Ñ Ð¶Ðµ тут - хардкор Ñтайл, к Ñожалению. Причина в том, что у разных Ñред программированиÑ
4385 // разные редакторы реÑурÑов и ÑиÑтемы Ñборки. ПоÑтому Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ð²Ð¸ÑимоÑти от них вÑе будет
4386 // ÑтроитьÑÑ Ð½Ð° Ñтапе выполнениÑ, динамичеÑки. Ð’Ñ‹ еще глÑньте, как Ñто реализовано в
4387 // txDialog::dialogBox() и функциÑÑ… _tx_DLGTEMPLATE_()... О_о
4388 //-------------------------------------------------------------------------------------------------------------
4389
4390 #define ID_TEXT_ 101
4391 #define ID_INPUT_ 102
4392
4393 //-------------------------------------------------------------------------------------------------------------
4394 // Задание макета (вида) диалога в виде маÑÑива Ñтруктур.
4395 // С помощью оÑобого порÑдка полей в Ñтруктуре txDialog::Layout и конÑтант из клаÑÑа
4396 // txDialog Ñтот маÑÑив ÑтановитÑÑ Ð¿Ð¾Ñ…Ð¾Ð¶ на опиÑание реÑурÑа диалога в .rc - файле.
4397 // См. опиÑание ÑинтакÑиÑа rc-файла в документации по Win32 (MSDN, http://msdn.com).
4398 //-------------------------------------------------------------------------------------------------------------
4399
4400 txDialog::Layout layout[] =
4401
4402 //----------------------+----------+-----------+-----------------+---------------------------------------------
4403 // Тип Ñлемента | Ð˜Ð¼Ñ | Иденти- | Координаты | Флаги Ñлементов
4404 // диалога | Ñлемента | фикатор |-----------------| (Ñм. опиÑание Ñлементов
4405 // | | Ñлемента | X | Y |Шир.|Ð’Ñ‹Ñ.| окон диалога в MSDN)
4406 //----------------------+----------+-----------+---+---+----+----+---------------------------------------------
4407 // | | | | | | |
4408 {{ txDialog::DIALOG, caption, 0, 0, 0, 240, 85 },
4409 { txDialog::STATIC, text, ID_TEXT_, 10, 10, 150, 40, SS_LEFT },
4410 { txDialog::EDIT, input, ID_INPUT_, 10, 60, 220, 15, ES_LEFT | WS_BORDER | ES_AUTOHSCROLL | WS_TABSTOP },
4411 { txDialog::BUTTON, "&OK", IDOK, 180, 10, 50, 15, BS_DEFPUSHBUTTON | WS_TABSTOP },
4412 { txDialog::BUTTON, "&Cancel", IDCANCEL, 180, 30, 50, 15, BS_PUSHBUTTON | WS_TABSTOP },
4413 { txDialog::END }};
4414
4415 //-------------------------------------------------------------------------------------------------------------
4416 // КлаÑÑ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð° Ð´Ð»Ñ InputBox. Внутренний, Ñ‚.к. зачем ему быть внешним.
4417 // Ðужен в оÑновном Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ñтроки ввода (str) и оконной функции диалогового окна,
4418 // требуемой Win32 (она поÑтроена макроÑами TX_BEGIN_MESSAGE_MAP и другими). Можно не делать
4419 // внутреннего клаÑÑа, но тогда оконную функцию придетÑÑ Ð¿Ð¸Ñать в глобальной облаÑти видимоÑти,
4420 // и str объÑвлÑть глобально тоже (или передавать ее Ð°Ð´Ñ€ÐµÑ Ñ‡ÐµÑ€ÐµÐ· DialogBoxParam и запиÑывать
4421 // его в клаÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ WM_INITDIALOG).
4422 //-------------------------------------------------------------------------------------------------------------
4423 struct inputDlg : txDialog
4424 {
4425 char str [1024];
4426
4427 //---------------------------------------------------------------------------------------------------------
4428
4429 inputDlg() :
4430 str() // Обнуление вÑей Ñтроки. Ðе работает на Ñтарых
4431 { // компилÑторах, поÑтому еще раз:
4432 memset (str, 0, sizeof (str)); // Обнуление вÑей Ñтроки
4433 }
4434
4435 //---------------------------------------------------------------------------------------------------------
4436
4437 TX_BEGIN_MESSAGE_MAP() // Карта Ñообщений. Ðа Ñамом деле Ñто начало оконной функции.
4438
4439 TX_COMMAND_MAP // ЗдеÑÑŒ обрабатываютÑÑ WM_COMMAND. Ðа Ñамом деле Ñто switch.
4440
4441 //-------------------------------------------------------------------------------------------------
4442 // При нажатии кнопки OK копируем Ñтроку из Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð° в нашу переменную str,
4443 // Ñ‚.к. поÑле Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð° Ñтрока ввода умрет и текÑÑ‚ уже из нее получить.
4444 // Ðтот Ð¼Ð°ÐºÑ€Ð¾Ñ Ð½Ð° Ñамом деле превращаетÑÑ Ð² case из оператора switch.
4445 // _wnd - Ñто параметр оконной функции, Ñм. определение макроÑа TX_BEGIN_MESSAGE_MAP().
4446 //-------------------------------------------------------------------------------------------------
4447
4448 TX_HANDLE (IDOK) GetDlgItemText (_wnd, ID_INPUT_, str, sizeof (str) - 1);
4449
4450 TX_END_MESSAGE_MAP
4451
4452 //---------------------------------------------------------------------------------------------------------
4453 // Конец внутреннего клаÑÑа диалога
4454 //---------------------------------------------------------------------------------------------------------
4455
4456 };
4457
4458 //-------------------------------------------------------------------------------------------------------------
4459 // Убираем дефайны, чтобы потом не мешали.
4460 // От Ñтого они получаютÑÑ "локального дейÑтвиÑ", как будто у них была бы облаÑть видимоÑти -
4461 // функциÑ. Ðа Ñамом деле Ñто Ñделано вручную через #undef. Чтобы подчеркнуть их локальную
4462 // природу, у них имена заканчиваютÑÑ Ð½Ð° _. Такие дейфайны потом не перекоÑÑчат веÑÑŒ код поÑле
4463 // того как, фактичеÑки, Ñтали уже не нужны.
4464 //-------------------------------------------------------------------------------------------------------------
4465
4466 #undef ID_TEXT_
4467 #undef ID_INPUT_
4468
4469 //-------------------------------------------------------------------------------------------------------------
4470 // Ðто ÑтатичеÑкий объект, потому что Ñтрока в нем должна жить поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸.
4471 //-------------------------------------------------------------------------------------------------------------
4472
4473 static inputDlg dlg;
4474
4475 //-------------------------------------------------------------------------------------------------------------
4476 // Передаем layout и запуÑкаем окно диалога
4477 //-------------------------------------------------------------------------------------------------------------
4478
4479 dlg.dialogBox (layout);
4480
4481 //-------------------------------------------------------------------------------------------------------------
4482 // Возвращаем Ð°Ð´Ñ€ÐµÑ Ñтроки из ÑтатичеÑкого объекта. Так можно делать, потому что ÑтатичеÑкий
4483 // объект не умрет при выходе из функции и Ñтрока в нем, ÑоответÑтвенно, тоже. ÐдреÑ
4484 // неÑтатичеÑких переменных передавать ÑинтакÑичеÑки можно, но ведет к Ñерьезным ошибкам.
4485 //-------------------------------------------------------------------------------------------------------------
4486
4487 return dlg.str;
4488 }
4489
4490//! @}
4491//}
4492//=================================================================================================================
4493
4494//}
4495//=================================================================================================================
4496
4497//=================================================================================================================
4498//{ TXLIB IMPLEMENTATION
4499// Ð ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ библиотеки
4500//=================================================================================================================
4501//! @cond INTERNAL
4502
4503//=================================================================================================================
4504//{ [Internal] Function prototypes, macros and constants
4505// Прототипы внутренних функций, макроÑÑ‹ и конÑтанты
4506//=================================================================================================================
4507
4508const int _TX_CP = 1251; // Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ локали
4509const char _TX_LC_CTYPE[] = "Russian";
4510const wchar_t _TX_LC_CTYPE_W[] = L"Russian_Russia.ACP";
4511
4512const int _TX_IDM_ABOUT = 40000; // Идентификаторы ÑиÑтемного меню окна
4513const int _TX_IDM_CONSOLE = 40001;
4514
4515//-----------------------------------------------------------------------------------------------------------------
4516
4517int _txInitialize();
4518void _txCleanup();
4519
4520HWND _txCanvas_CreateWindow (SIZE* size);
4521inline bool _txCanvas_OK();
4522
4523bool _txCanvas_OnCREATE (HWND wnd);
4524bool _txCanvas_OnDESTROY (HWND wnd);
4525bool _txCanvas_OnCLOSE (HWND);
4526bool _txCanvas_OnPAINT (HWND wnd);
4527bool _txCanvas_OnKEYDOWN (HWND wnd, WPARAM vk, LPARAM info);
4528bool _txCanvas_OnCHAR (HWND wnd, WPARAM ch, LPARAM info);
4529bool _txCanvas_OnTIMER (HWND wnd, WPARAM id);
4530bool _txCanvas_OnMOUSEMOVE (HWND wnd, WPARAM buttons, LPARAM coords);
4531bool _txCanvas_OnCmdCONSOLE (HWND wnd, WPARAM cmd);
4532bool _txCanvas_OnCmdABOUT (HWND wnd, WPARAM cmd);
4533
4534unsigned WINAPI _txCanvas_ThreadProc (void* data);
4535LRESULT CALLBACK _txCanvas_WndProc (HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar);
4536
4537int _txCanvas_SetRefreshLock (int count);
4538
4539HDC _txBuffer_Create (HWND wnd, const POINT* size = NULL, HBITMAP bmap = NULL);
4540bool _txBuffer_Delete (HDC* dc);
4541bool _txBuffer_Select (HGDIOBJ obj, HDC dc = txDC());
4542
4543HWND _txConsole_Attach();
4544bool _txConsole_OK();
4545bool _txConsole_Detach (bool activate);
4546bool _txConsole_Draw (HDC dc);
4547bool _txConsole_SetUnicodeFont();
4548
4549int _txSetFinishedText (HWND wnd);
4550void _txPauseBeforeTermination (HWND canvas);
4551bool _txIsParentWaitable (DWORD* parentPID = NULL);
4552PROCESSENTRY32* _txFindProcess (unsigned pid = GetCurrentProcessId());
4553bool _txKillProcess (DWORD pid);
4554PROC _txSetProcAddress (HMODULE module, const char* dllName, const char* funcName, PROC newFunc);
4555bool _txInDll();
4556int _txGetInput();
4557void _tx_cexit();
4558
4559bool _txCreateShortcut (const char shortcutName[],
4560 const char fileToLink[], const char args[] = NULL, const char workDir[] = NULL,
4561 const char description[] = NULL, int cmdShow = SW_SHOWNORMAL,
4562 const char iconFile[] = NULL, int iconIndex = 0, int fontSize = 0,
4563 COORD bufSize = ZERO (COORD), COORD wndSize = ZERO (COORD), COORD wndOrg = ZERO (COORD));
4564
4565void* _tx_DLGTEMPLATE_Create (void* globalMem, size_t bufsize, DWORD style, DWORD exStyle,
4566 WORD controls, short x, short y, short cx, short cy,
4567 const char caption[], const char font[], WORD fontsize,
4568 HANDLE menu);
4569
4570void* _tx_DLGTEMPLATE_Add (void* dlgTemplatePtr, size_t bufsize, DWORD style, DWORD exStyle,
4571 short x, short y, short cx, short cy,
4572 WORD id, const char wclass[], const char caption[]);
4573
4574const char* _txError (const char file[] = NULL, int line = 0, const char func[] = NULL,
4575 const char msg[] = NULL, ...) _TX_CHECK_FORMAT (4);
4576
4577HICON _txCreateTXIcon (int size);
4578
4579void _txOnSignal (int signal = 0, int fpe = 0);
4580void _txOnTerminate();
4581void _txOnUnexpected();
4582
4583FARPROC _txDllImport (const char dllFileName[], const char funcName[], bool required = true);
4584
4585//-----------------------------------------------------------------------------------------------------------------
4586
4587// These are macros for __FILE__ and __LINE__ to work properly.
4588
4589#if !defined (NDEBUG)
4590 #define _TX_IF_ARGUMENT_FAILED( cond ) if (!assert (cond) && (SetLastErrorEx (ERROR_BAD_ARGUMENTS, 0), 1))
4591
4592 #define _TX_IF_TXWINDOW_FAILED if ( !txOK() && (SetLastErrorEx (ERROR_INVALID_DATA, 0), 1) && \
4593 (TX_ERROR ("\a" "Окно риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ Ñоздано или не в порÑдке"), 1))
4594#else
4595 #define _TX_IF_ARGUMENT_FAILED( cond ) if (! (cond) && (SetLastErrorEx (ERROR_BAD_ARGUMENTS, 0), 1))
4596
4597 #define _TX_IF_TXWINDOW_FAILED if ( !txOK() && (SetLastErrorEx (ERROR_INVALID_DATA, 0), 1))
4598
4599#endif
4600
4601// Take action in debug configuration only.
4602// Definition ({ expr; }) would be better, but some old dinosaurs (yes it is MSVC 6) reject it. So sad. :'(
4603
4604#if !defined (NDEBUG)
4605 #define _TX_ON_DEBUG( code ) { code; }
4606#else
4607 #define _TX_ON_DEBUG( code ) ;
4608#endif
4609
4610// This is a macro because cond is an expression and not always a function. Lack of lambdas in pre-C++0x.
4611
4612#define _txWaitFor( cond, time ) { for (DWORD _t = GetTickCount() + (time); \
4613 !(cond) && GetTickCount() < _t; \
4614 Sleep (_txWindowUpdateInterval)) ; \
4615 if (!(cond)) \
4616 _txTrace (__FILE__, __LINE__, "WARNING: Timeout: " #cond "."); }
4617//}
4618//=================================================================================================================
4619
4620//=================================================================================================================
4621//{ [Internal] DLL functions import
4622//! @name Импорт внешних библиотек
4623//=================================================================================================================
4624//! @{
4625
4626FARPROC _txDllImport (const char dllFileName[], const char funcName[], bool required /*= true*/)
4627 {
4628 _TX_IF_ARGUMENT_FAILED (!(dllFileName && !*dllFileName)) return NULL;
4629 _TX_IF_ARGUMENT_FAILED ( funcName && *funcName) return NULL;
4630
4631 HMODULE dll = GetModuleHandle (dllFileName);
4632 if (!dll && dllFileName) dll = LoadLibrary (dllFileName);
4633 if (!dll && required) TX_ERROR ("\a" "Cannot load library \"%s\"" _ dllFileName);
4634
4635 if (!dll) return NULL;
4636
4637 FARPROC addr = GetProcAddress (dll, funcName);
4638 if (!addr && required) TX_ERROR ("\a" "Cannot import \"%s\" from library \"%s\"" _ funcName _ dllFileName);
4639
4640 return addr;
4641 }
4642
4643//-----------------------------------------------------------------------------------------------------------------
4644// Import helpers
4645// ÐœÐ°Ð»Ð°Ñ Ð¼ÐµÑ…Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ
4646//-----------------------------------------------------------------------------------------------------------------
4647
4648#define _TX_DLLIMPORT( lib, retval, name, params ) \
4649 retval (WINAPI* name) params = (retval (WINAPI*) params) _txDllImport (lib ".dll", #name, true)
4650
4651#define _TX_DLLIMPORT_OPT( lib, retval, name, params ) \
4652 retval (WINAPI* name) params = (retval (WINAPI*) params) _txDllImport (lib ".dll", #name, false)
4653
4654//-----------------------------------------------------------------------------------------------------------------
4655// Some IDEs don't link with these libs by default in console projects, so do sunrise by hand. :(
4656//{ <tears>
4657
4658namespace Win32 {
4659
4660#ifdef _MSC_VER_6
4661struct CONSOLE_FONT_INFO;
4662#endif
4663
4664struct NT_CONSOLE_PROPS;
4665struct CONSOLE_FONT_INFOEX;
4666
4667_TX_DLLIMPORT ("GDI32", HDC, CreateCompatibleDC, (HDC dc));
4668_TX_DLLIMPORT ("GDI32", HBITMAP, CreateCompatibleBitmap, (HDC dc, int width, int height));
4669_TX_DLLIMPORT ("GDI32", HGDIOBJ, GetStockObject, (int object));
4670_TX_DLLIMPORT ("GDI32", HGDIOBJ, SelectObject, (HDC dc, HGDIOBJ object));
4671_TX_DLLIMPORT ("GDI32", HGDIOBJ, GetCurrentObject, (HDC dc, unsigned objectType));
4672_TX_DLLIMPORT ("GDI32", int, GetObjectA, (HGDIOBJ obj, int bufsize, void* buffer));
4673_TX_DLLIMPORT ("GDI32", DWORD, GetObjectType, (HGDIOBJ object));
4674_TX_DLLIMPORT ("GDI32", BOOL, DeleteDC, (HDC dc));
4675_TX_DLLIMPORT ("GDI32", BOOL, DeleteObject, (HGDIOBJ object));
4676_TX_DLLIMPORT ("GDI32", COLORREF, SetTextColor, (HDC dc, COLORREF color));
4677_TX_DLLIMPORT ("GDI32", COLORREF, SetBkColor, (HDC dc, COLORREF color));
4678_TX_DLLIMPORT ("GDI32", int, SetBkMode, (HDC dc, int bkMode));
4679_TX_DLLIMPORT ("GDI32", HFONT, CreateFontA, (int height, int width, int escapement, int orientation,
4680 int weight, DWORD italic, DWORD underline, DWORD strikeout,
4681 DWORD charSet, DWORD outputPrec, DWORD clipPrec,
4682 DWORD quality, DWORD pitchAndFamily, const char face[]));
4683_TX_DLLIMPORT ("GDI32", int, EnumFontFamiliesExA, (HDC dc, LPLOGFONT logFont, FONTENUMPROC enumProc,
4684 LPARAM lParam, DWORD reserved));
4685_TX_DLLIMPORT ("GDI32", COLORREF, SetPixel, (HDC dc, int x, int y, COLORREF color));
4686_TX_DLLIMPORT ("GDI32", COLORREF, GetPixel, (HDC dc, int x, int y));
4687_TX_DLLIMPORT ("GDI32", HPEN, CreatePen, (int penStyle, int width, COLORREF color));
4688_TX_DLLIMPORT ("GDI32", HBRUSH, CreateSolidBrush, (COLORREF color));
4689_TX_DLLIMPORT ("GDI32", BOOL, MoveToEx, (HDC dc, int x, int y, POINT* point));
4690_TX_DLLIMPORT ("GDI32", BOOL, LineTo, (HDC dc, int x, int y));
4691_TX_DLLIMPORT ("GDI32", BOOL, Polygon, (HDC dc, const POINT points[], int count));
4692_TX_DLLIMPORT ("GDI32", BOOL, Rectangle, (HDC dc, int x0, int y0, int x1, int y1));
4693_TX_DLLIMPORT ("GDI32", BOOL, RoundRect, (HDC dc, int x0, int y0, int x1, int y1, int sizeX, int sizeY));
4694_TX_DLLIMPORT ("GDI32", BOOL, Ellipse, (HDC dc, int x0, int y0, int x1, int y1));
4695_TX_DLLIMPORT ("GDI32", BOOL, Arc, (HDC dc, int x0, int y0, int x1, int y1,
4696 int xStart, int yStart, int xEnd, int yEnd));
4697_TX_DLLIMPORT ("GDI32", BOOL, Pie, (HDC dc, int x0, int y0, int x1, int y1,
4698 int xStart, int yStart, int xEnd, int yEnd));
4699_TX_DLLIMPORT ("GDI32", BOOL, Chord, (HDC dc, int x0, int y0, int x1, int y1,
4700 int xStart, int yStart, int xEnd, int yEnd));
4701_TX_DLLIMPORT ("GDI32", BOOL, TextOutA, (HDC dc, int x, int y, const char string[], int length));
4702_TX_DLLIMPORT ("GDI32", UINT, SetTextAlign, (HDC dc, unsigned mode));
4703_TX_DLLIMPORT ("GDI32", BOOL, GetTextExtentPoint32A, (HDC dc, const char string[], int length, SIZE* size));
4704_TX_DLLIMPORT ("GDI32", BOOL, ExtFloodFill, (HDC dc, int x, int y, COLORREF color, unsigned type));
4705_TX_DLLIMPORT ("GDI32", BOOL, BitBlt, (HDC dest, int xDest, int yDest, int width, int height,
4706 HDC src, int xSrc, int ySrc, DWORD rOp));
4707_TX_DLLIMPORT ("GDI32", int, SetDIBitsToDevice, (HDC dc, int xDest, int yDest, DWORD width, DWORD height,
4708 int xSrc, int ySrc, unsigned startLine, unsigned numLines,
4709 const void* data, const BITMAPINFO* info, unsigned colorUse));
4710_TX_DLLIMPORT ("GDI32", int, GetDIBits, (HDC hdc, HBITMAP hbmp, unsigned uStartScan, unsigned cScanLines,
4711 void* lpvBits, BITMAPINFO* lpbi, unsigned usage));
4712_TX_DLLIMPORT ("GDI32", BOOL, PatBlt, (HDC dc, int x0, int y0, int width, int height, DWORD rOp));
4713_TX_DLLIMPORT ("GDI32", int, SetROP2, (HDC dc, int mode));
4714_TX_DLLIMPORT ("GDI32", HRGN, CreateRectRgn, (int x0, int y0, int x1, int y1));
4715_TX_DLLIMPORT ("GDI32", BOOL, GetBitmapDimensionEx, (HBITMAP bitmap, SIZE* dimensions));
4716
4717_TX_DLLIMPORT ("User32", int, DrawTextA, (HDC dc, const char text[], int length, RECT* rect, unsigned format));
4718_TX_DLLIMPORT ("User32", HANDLE, LoadImageA, (HINSTANCE inst, const char name[], unsigned type,
4719 int sizex, int sizey, unsigned mode));
4720_TX_DLLIMPORT_OPT ("User32", BOOL, IsHungAppWindow, (HWND wnd));
4721_TX_DLLIMPORT_OPT ("User32", HWND, GhostWindowFromHungWindow,(HWND wnd));
4722
4723_TX_DLLIMPORT ("WinMM", BOOL, PlaySound, (const char sound[], HMODULE mod, DWORD mode));
4724
4725_TX_DLLIMPORT_OPT ("MSImg32", BOOL, TransparentBlt, (HDC dest, int destX, int destY, int destWidth, int destHeight,
4726 HDC src, int srcX, int srcY, int srcWidth, int srcHeight,
4727 unsigned transparentColor));
4728_TX_DLLIMPORT_OPT ("MSImg32", BOOL, AlphaBlend, (HDC dest, int destX, int destY, int destWidth, int destHeight,
4729 HDC src, int srcX, int srcY, int srcWidth, int srcHeight,
4730 BLENDFUNCTION blending));
4731
4732_TX_DLLIMPORT ("Kernel32", HWND, GetConsoleWindow, (void));
4733_TX_DLLIMPORT_OPT ("Kernel32", BOOL, SetConsoleFont, (HANDLE con, DWORD fontIndex));
4734_TX_DLLIMPORT_OPT ("Kernel32", BOOL, GetConsoleFontInfo, (HANDLE con, bool fullScr, DWORD nFonts, CONSOLE_FONT_INFO* info));
4735_TX_DLLIMPORT_OPT ("Kernel32", DWORD, GetNumberOfConsoleFonts, (void));
4736_TX_DLLIMPORT_OPT ("Kernel32", BOOL, GetCurrentConsoleFont, (HANDLE con, bool maxWnd, CONSOLE_FONT_INFO* curFont));
4737_TX_DLLIMPORT_OPT ("Kernel32", BOOL, GetCurrentConsoleFontEx, (HANDLE con, bool maxWnd, CONSOLE_FONT_INFOEX* curFont));
4738_TX_DLLIMPORT_OPT ("Kernel32", BOOL, SetCurrentConsoleFontEx, (HANDLE con, bool maxWnd, CONSOLE_FONT_INFOEX* curFont));
4739
4740_TX_DLLIMPORT ("OLE32", HRESULT, CoInitialize, (void*));
4741_TX_DLLIMPORT ("OLE32", HRESULT, CoCreateInstance, (REFCLSID clsid, LPUNKNOWN, DWORD, REFIID iid, PVOID* value));
4742_TX_DLLIMPORT ("OLE32", void, CoUninitialize, (void));
4743
4744_TX_DLLIMPORT ("Shell32", HINSTANCE,ShellExecuteA, (HWND wnd, const char operation[], const char file[],
4745 const char parameters[], const char directory[], int showCmd));
4746
4747_TX_DLLIMPORT_OPT ("NTDLL", char*, wine_get_version, (void));
4748
4749_TX_DLLIMPORT_OPT ("MSVCRT", void, _cexit, (void));
4750
4751//-----------------------------------------------------------------------------------------------------------------
4752// Another issue, some of structs, consts and interfaces aren't defined in MinGW some ealry headers.
4753// Copied from Windows SDK 7.0a.
4754
4755#ifndef AC_SRC_ALPHA
4756#define AC_SRC_ALPHA 0x01
4757#endif
4758
4759#ifndef SMTO_ERRORONEXIT
4760#define SMTO_ERRORONEXIT 0x0020
4761#endif
4762
4763#ifndef NT_CONSOLE_PROPS_SIG
4764#define NT_CONSOLE_PROPS_SIG 0xA0000002
4765#endif
4766
4767#ifndef NIIF_INFO
4768#define NIIF_INFO 0x00000001
4769#define NIIF_WARNING 0x00000002
4770#define NIIF_ERROR 0x00000003
4771#endif
4772
4773#ifndef NIF_INFO
4774#define NIF_STATE 0x00000008
4775#define NIF_INFO 0x00000010
4776#endif
4777
4778#pragma pack (push, 1)
4779
4780#ifdef _MSC_VER_6
4781
4782struct CONSOLE_FONT_INFO
4783 {
4784 DWORD nFont;
4785 COORD dwFontSize;
4786 };
4787
4788struct NOTIFYICONDATA
4789 {
4790 DWORD cbSize;
4791 HWND hWnd;
4792 UINT uID;
4793 UINT uFlags;
4794 UINT uCallbackMessage;
4795 HICON hIcon;
4796
4797 CHAR szTip[128];
4798 DWORD dwState;
4799 DWORD dwStateMask;
4800 CHAR szInfo[256];
4801
4802 union {
4803 UINT uTimeout;
4804 UINT uVersion;
4805 } u;
4806
4807 CHAR szInfoTitle[64];
4808 DWORD dwInfoFlags;
4809 };
4810
4811#endif
4812
4813struct CONSOLE_FONT_INFOEX
4814 {
4815 ULONG cbSize;
4816 DWORD nFont;
4817 COORD dwFontSize;
4818 UINT FontFamily;
4819 UINT FontWeight;
4820 WCHAR FaceName[LF_FACESIZE];
4821 };
4822
4823struct DATABLOCK_HEADER
4824 {
4825 DWORD cbSize;
4826 DWORD dwSignature;
4827 };
4828
4829struct NT_CONSOLE_PROPS
4830 {
4831 DATABLOCK_HEADER dbh;
4832
4833 WORD wFillAttribute;
4834 WORD wPopupFillAttribute;
4835 COORD dwScreenBufferSize;
4836 COORD dwWindowSize;
4837 COORD dwWindowOrigin;
4838 DWORD nFont;
4839 DWORD nInputBufferSize;
4840 COORD dwFontSize;
4841 UINT uFontFamily;
4842 UINT uFontWeight;
4843 WCHAR FaceName[LF_FACESIZE];
4844 UINT uCursorSize;
4845 BOOL bFullScreen;
4846 BOOL bQuickEdit;
4847 BOOL bInsertMode;
4848 BOOL bAutoPosition;
4849 UINT uHistoryBufferSize;
4850 UINT uNumberOfHistoryBuffers;
4851 BOOL bHistoryNoDup;
4852
4853 COLORREF ColorTable[16];
4854 };
4855
4856#pragma pack (pop)
4857
4858#undef INTERFACE
4859#define INTERFACE IShellLinkDataList
4860
4861DECLARE_INTERFACE_ (IShellLinkDataList, IUnknown)
4862 {
4863 // *** IUnknown methods ***
4864 STDMETHOD (QueryInterface) (THIS_ REFIID iid, void** value) PURE;
4865 STDMETHOD_(ULONG, AddRef) (THIS) PURE;
4866 STDMETHOD_(ULONG, Release) (THIS) PURE;
4867
4868 // *** IShellLinkDataList methods ***
4869 STDMETHOD (AddDataBlock) (THIS_ void* dataBlock) PURE;
4870 STDMETHOD (CopyDataBlock) (THIS_ DWORD sig, void** dataBlock) PURE;
4871 STDMETHOD (RemoveDataBlock) (THIS_ DWORD sig) PURE;
4872 STDMETHOD (GetFlags) (THIS_ DWORD* flags) PURE;
4873 STDMETHOD (SetFlags) (THIS_ DWORD flags) PURE;
4874
4875 protected:
4876 virtual ~IShellLinkDataList();
4877 };
4878
4879const GUID IID_IShellLink = {0x000214ee, 0x0000, 0x0000, {0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
4880const GUID IID_IShellLinkDataList = {0x45e2b4ae, 0xb1c3, 0x11d0, {0xb9,0x2f,0x00,0xa0,0xc9,0x03,0x12,0xe1}};
4881const GUID IID_IPersistFile = {0x0000010b, 0x0000, 0x0000, {0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
4882
4883#undef INTERFACE
4884
4885} // namespace Win32
4886
4887#ifdef _MSC_VER_6
4888using namespace Win32;
4889#endif
4890
4891//} </tears>
4892
4893//! @}
4894//}
4895//=================================================================================================================
4896
4897//=================================================================================================================
4898//{ [Internal] Global data
4899//! @name Глобальные данные
4900//
4901// Данные не упакованы в Ñтруктуру или клаÑÑ, Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы Ñто Ñделали Ð’Ñ‹ Ñами :)
4902//
4903// ЕÑли вы пишете Ñвою библиотеку и иÑпользуете TXLib.h как примеру, не Ñледуйте ему и не делайте так же.
4904// ЗдеÑÑŒ Ñто Ñделано только в образовательных целÑÑ….
4905//
4906// Будьте практичнее, Ñделайте Ñтруктуру и глобальную функцию Ð´Ð»Ñ Ð´Ð¾Ñтупа к ней.
4907//=================================================================================================================
4908//! @{
4909
4910int _txInitialized = _TX_NOINIT || _txInitialize();
4911
4912unsigned volatile _txMainThreadId = 0; // ID потока, где выполнÑетÑÑ main()
4913
4914unsigned volatile _txCanvas_ThreadId = 0; // ID потока, владеющего окном холÑта TXLib
4915HANDLE volatile _txCanvas_Thread = NULL; // ДекÑриптор Ñтого потока
4916HWND volatile _txCanvas_Window = NULL; // ДеÑкриптор окна холÑта TXLib
4917
4918UINT _txCanvas_RefreshTimer = 0; // Timer to redraw TXLib window
4919int volatile _txCanvas_RefreshLock = 0; // Blocks auto on-timer canvas update, see txBegin/txEnd
4920
4921HDC _txCanvas_BackBuf[2] = {NULL, // [0] Main working TXLib memory DC, where user picture lies
4922 NULL}; // [1] Image ready for auto-refresh, see txCanvas_OnPAINT()
4923CRITICAL_SECTION _txCanvas_LockBackBuf = {0,-1}; // Prevent simultaneous access to back buffer, see txLock()
4924
4925std::vector<HDC>* _txCanvas_UserDCs = NULL; // List of DCs allocated, for auto-free
4926
4927bool volatile _txConsole_IsBlinking = true; // To blink or not to blink, that is the question.
4928
4929bool _txConsole = false; // Only first TXLib module in app owns it
4930bool _txMain = false; // First TXLib wnd opened (closing it terminates program)
4931bool _txIsDll = false; // TXLib module is in DLL
4932bool volatile _txRunning = false; // main() is still running
4933bool volatile _txExit = false; // exit() is active
4934bool volatile _txAllowTrace = true; // Internal TX trace is active
4935
4936POINT _txMousePos = {0}; // Ask Captn Obviouos about it. See txCanvas_OnMOUSE()
4937int _txMouseButtons = 0;
4938
4939WNDPROC volatile _txAltWndProc = NULL; // ÐÐ»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ð¾ÐºÐ¾Ð½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ. См. txSetWindowsHook().
4940
4941const char* volatile _txFile = NULL; // Current execution point tracking, see $ macro
4942int volatile _txLine = 0;
4943const char* volatile _txFunc = NULL;
4944_TX_THREAD int volatile _txInTX = 0; // We are inside one of TXLib's functions
4945
4946//! @}
4947//}
4948//=================================================================================================================
4949
4950//=================================================================================================================
4951//{ TXLib engine init/check/cleanup
4952//! @name ИнициализациÑ/проверка/завершение TXLib
4953//=================================================================================================================
4954//! @{
4955
4956//-----------------------------------------------------------------------------------------------------------------
4957//{ Early initialization
4958//-----------------------------------------------------------------------------------------------------------------
4959
4960int _txInitialize()
4961 {
4962 #if defined (_TX_ALLOC_BREAK) && defined (_MSC_VER)
4963 _CrtSetBreakAlloc (_TX_ALLOC_BREAK);
4964 #endif
4965
4966 _TX_ON_DEBUG (OutputDebugString ("\n");
4967 OutputDebugString (_TX_VERSION " - The Dumb Artist Library, " _TX_AUTHOR ": \"" __FILE__ "\" "
4968 "compiled " __DATE__ " " __TIME__ ", " _TX_BUILDMODE " mode, module: " _TX_MODULE "\n");
4969 OutputDebugString ("\n"));
4970
4971 _txMainThreadId = GetCurrentThreadId();
4972
4973$1 _txIsDll = _txInDll();
4974
4975$ if (!_txIsDll)
4976 {
4977$ _txConsole = ! FindAtom ("_txConsole"); // Not a thread-safe
4978$ (void) AddAtom ("_txConsole");
4979 }
4980
4981$ if (_txConsole)
4982 {
4983$ _txOnSignal();
4984$ SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
4985
4986 #if defined (_MSC_VER)
4987$ _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF);
4988$ _CrtSetReportMode (_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
4989$ _CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW);
4990$ _CrtSetReportMode (_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW);
4991$ _CrtSetReportFile (_CRT_WARN, _CRTDBG_FILE_STDERR);
4992$ _CrtSetReportFile (_CRT_ERROR, _CRTDBG_FILE_STDERR);
4993$ _CrtSetReportFile (_CRT_ASSERT, _CRTDBG_FILE_STDERR);
4994 #endif
4995
4996 #ifndef _MSC_VER_6
4997$ std::set_unexpected (_txOnUnexpected);
4998$ std::set_terminate (_txOnTerminate);
4999 #endif
5000
5001$ HWND console = _txConsole_Attach();
5002$ SetWindowTextA (console, txGetModuleFileName (false));
5003 }
5004
5005$ InitializeCriticalSection (&_txCanvas_LockBackBuf);
5006
5007$ _txCanvas_UserDCs = new std::vector <HDC>;
5008
5009#if defined (_GCC_VER)
5010$ _txSetProcAddress (GetModuleHandle (NULL), "MSVCRT.DLL", "_cexit", (PROC) _tx_cexit); // See _tx_cexit()
5011#endif
5012
5013$ atexit (_txCleanup);
5014
5015$ (void) Win32::SetDIBitsToDevice; // Just to suppress "defined but not used" warning
5016$ (void) Win32::GetDIBits;
5017$ (void) Win32::RoundRect;
5018$ (void) Win32::CreateRectRgn;
5019$ (void) Win32::GetBitmapDimensionEx;
5020$ (void) Win32::GetConsoleFontInfo;
5021
5022$ if (_txConsole)
5023 {
5024$ txSetConsoleAttr (0x07);
5025$ SetLastError (0);
5026
5027$ unsigned old87 = 0, new87 = 0x0008001C; // _EM_INVALID | _EM_DENORMAL | _EM_ZERODIVIDE | _EM_OVERFLOW
5028$ if (_controlfp_s (&old87, 0, 0) == 0)
5029 { $ (void) _controlfp_s (&old87, old87 & ~new87, 0x0008001F /* _MCW_EM */); }
5030 }
5031
5032$ return 1;
5033 }
5034
5035//}
5036//-----------------------------------------------------------------------------------------------------------------
5037
5038HWND txCreateWindow (double sizeX, double sizeY, bool centered /*= true*/)
5039 {
5040$1 if (!_txInitialized) _txInitialized = _txInitialize();
5041
5042$ if (txWindow())
5043 {
5044$ SetLastErrorEx (ERROR_INVALID_DATA, 0);
5045$ _TX_ON_DEBUG (TX_ERROR ("\a" "Окно риÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑƒÐ¶Ðµ Ñоздано"));
5046$ return txWindow();
5047 }
5048
5049$ if (!_txIsDll)
5050 {
5051$ _txMain = ! FindAtom ("_txMain"); // Not a thread-safe
5052$ (void) AddAtom ("_txMain");
5053 }
5054
5055$ if (_txWindowUpdateInterval < 10) { $ _txWindowUpdateInterval = 10; }
5056
5057$ _txRunning = false;
5058
5059 // Store the size
5060
5061$ static SIZE size = { ROUND (sizeX), ROUND (sizeY) };
5062$ if (centered) { size.cx *= -1; size.cy *= -1; }
5063
5064 // In Thread, where REAL creation lies...
5065
5066 #if !( defined (_MSC_VER) && (_MSC_VER < 1400) && !defined (_MT) )
5067$ unsigned id = 0;
5068$ _txCanvas_Thread = (HANDLE) _beginthreadex (NULL, 0, _txCanvas_ThreadProc, &size, 0, &id);
5069 #else
5070$ DWORD id = 0;
5071$ _txCanvas_Thread = CreateThread (NULL, 0, (PTHREAD_START_ROUTINE)_txCanvas_ThreadProc, &size, 0, &id);
5072 #endif
5073
5074$ if (!_txCanvas_Thread) return TX_DEBUG_ERROR ("\a" "Cannot start canvas thread."), (HWND)NULL;
5075
5076$ _txWaitFor (_txRunning, 30*_TX_TIMEOUT);
5077
5078$ if (!_txRunning) return TX_DEBUG_ERROR ("\a" "Cannot create canvas window."),(HWND)NULL;
5079$ if (!txOK()) return TX_DEBUG_ERROR ("\a" "Canvas window is not OK."), (HWND)NULL;
5080
5081$ Sleep (100);
5082
5083$ errno = _doserrno = 0;
5084$ SetLastError (0);
5085
5086$ return txWindow();
5087 }
5088
5089//-----------------------------------------------------------------------------------------------------------------
5090
5091bool txSetDefaults()
5092 {
5093$1 _TX_IF_TXWINDOW_FAILED return false;
5094
5095$ txUpdateWindow (false);
5096$ txAutoLock _lock;
5097
5098$ RECT r = {0};
5099
5100$ GetClientRect (_txCanvas_Window, &r) asserted;
5101$ SIZE szCanvas = { r.right - r.left, r.bottom - r.top };
5102
5103$ GetClientRect (Win32::GetConsoleWindow(), &r) asserted;
5104$ SIZE szCon = { r.right - r.left, r.bottom - r.top };
5105
5106$ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE);
5107
5108$ CONSOLE_SCREEN_BUFFER_INFO con = {{80, 25}, {0}, 0, {0, 0, 80-1, 25-1}, {80, 25}};
5109$ GetConsoleScreenBufferInfo (out, &con);
5110
5111$ SIZE szTxt = { (short) (con.srWindow.Right - con.srWindow.Left + 1),
5112 (short) (con.srWindow.Bottom - con.srWindow.Top + 1) };
5113
5114//{ Set defaults for graphics layer
5115
5116$ _txBuffer_Select (Win32::GetStockObject (WHITE_PEN), txDC()) asserted;
5117$ _txBuffer_Select (Win32::GetStockObject (WHITE_BRUSH), txDC()) asserted;
5118
5119$ _txBuffer_Select (Win32::CreateFont (szCon.cy/szTxt.cy, szCon.cx/szTxt.cx,
5120 0, 0, FW_REGULAR, FALSE, FALSE, FALSE,
5121 RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
5122 DEFAULT_QUALITY, DEFAULT_PITCH, _txConsoleFont),
5123 txDC()) asserted;
5124
5125$ (Win32::SetTextColor (txDC(), TX_WHITE) != CLR_INVALID) asserted;
5126$ Win32::SetBkMode (txDC(), TRANSPARENT) asserted;
5127
5128$ Win32::SetROP2 (txDC(), R2_COPYPEN) asserted;
5129
5130//}
5131
5132//{ Set defaults for console layer
5133
5134$ HGDIOBJ font = txFontExist (_txConsoleFont)?
5135 Win32::CreateFont ((int) (1.0 * szCanvas.cy/szTxt.cy), (int) (1.0 * szCanvas.cx/szTxt.cx),
5136 0, 0, FW_REGULAR, FALSE, FALSE, FALSE,
5137 RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
5138 DEFAULT_QUALITY, FIXED_PITCH, _txConsoleFont)
5139 :
5140 Win32::GetStockObject (SYSTEM_FIXED_FONT);
5141
5142$ _txBuffer_Select (font, _txCanvas_BackBuf[1]) asserted;
5143//}
5144
5145//{ Scroll the console for text to go above top of window and don't mix with graphics
5146
5147$ if (con.dwCursorPosition.X) _putch ('\n');
5148
5149$ short delta = (short) (con.dwCursorPosition.Y - con.srWindow.Top);
5150
5151$ con.srWindow.Top = (short) (con.srWindow.Top + delta);
5152$ con.srWindow.Bottom = (short) (con.srWindow.Bottom + delta);
5153
5154$ SMALL_RECT src = {0, 0, (short) (con.dwSize.X - 1), (short) (con.dwSize.Y - 1) };
5155$ CHAR_INFO fill = {{' '}, 0x07}; // Fill with spaces, light-gray on black
5156$ COORD dest = {0, (short) -delta}; // New UL-corner of src, scroll up
5157
5158$ con.dwCursorPosition.X = 0;
5159$ con.dwCursorPosition.Y = (short) (con.dwCursorPosition.Y - delta);
5160
5161$ (con.srWindow.Bottom < con.dwSize.Y && // Move the "window"
5162 SetConsoleWindowInfo (out, true, &con.srWindow))
5163 ||
5164 (ScrollConsoleScreenBuffer (out, &src, NULL, dest, &fill), // Or scroll the buffer
5165 SetConsoleCursorPosition (out, con.dwCursorPosition));
5166//}
5167
5168$ txUpdateWindow (true);
5169
5170 return true;
5171 }
5172
5173//-----------------------------------------------------------------------------------------------------------------
5174
5175inline bool txOK()
5176 {
5177$1 return _txCanvas_OK();
5178 }
5179
5180//-----------------------------------------------------------------------------------------------------------------
5181
5182// In GCC, implicit std(MSVCRT.dll)::_cexit() call before _txCleanup leads to hands in _cexit handlers chain.
5183// So redefining std::_cexit(). Do it dynamically via PE Import Table hook to avoid duplicate symbols in linking
5184// serveral modules including TXLib.h. See _txSetProcAddress() call in _txInitialize().
5185
5186#if defined (_GCC_VER)
5187
5188void _tx_cexit()
5189 {
5190$1 _txCleanup();
5191
5192 if (Win32::_cexit) { $ Win32::_cexit(); }
5193
5194$ return;
5195 }
5196
5197#endif
5198
5199//-----------------------------------------------------------------------------------------------------------------
5200
5201void _txCleanup()
5202 {
5203$1 if (!_txInitialized) return;
5204 else _txInitialized = false;
5205
5206$ txSleep (_txWindowUpdateInterval);
5207
5208$ _txRunning = false;
5209$ _txConsole_IsBlinking = false;
5210
5211$ HWND canvas = txWindow();
5212$ HWND console = Win32::GetConsoleWindow();
5213$ unsigned thread = GetCurrentThreadId();
5214
5215$ HWND wnd = (canvas)? canvas : console;
5216
5217$ bool externTerm = (thread != _txMainThreadId &&
5218 thread != _txCanvas_ThreadId);
5219$ DWORD parent = 0;
5220$ bool waitableParent = !externTerm && _txIsParentWaitable (&parent);
5221
5222$ if (_txConsole)
5223 {
5224$ if (_txMain) txSetConsoleAttr (0x07);
5225$ if (console) EnableWindow (console, true);
5226 }
5227
5228$ if (_txMain && !externTerm && wnd != NULL)
5229 { $ _txSetFinishedText (wnd); }
5230
5231$ if ((canvas? _txMain : _txConsole && !waitableParent) && !_txExit &&
5232 thread == _txMainThreadId)
5233 {
5234$ if (wnd)
5235 {
5236$ ShowWindow (wnd, SW_SHOW);
5237$ EnableWindow (wnd, true);
5238$ SetForegroundWindow (wnd);
5239$ BringWindowToTop (wnd);
5240$ RedrawWindow (wnd, NULL, NULL, RDW_INVALIDATE | RDW_INTERNALPAINT | RDW_UPDATENOW);
5241 }
5242
5243$ if (console)
5244 { $ _txPauseBeforeTermination (canvas); }
5245 }
5246
5247$ if (txWindow())
5248 { $ SendNotifyMessage (txWindow(), WM_DESTROY, 0, 0); }
5249
5250$ _txWaitFor (!txWindow(), 5*_TX_TIMEOUT);
5251
5252$ if (!txWindow())
5253 { $ DeleteCriticalSection (&_txCanvas_LockBackBuf); _txCanvas_LockBackBuf = ZERO (CRITICAL_SECTION); }
5254
5255$ if (_txCanvas_Thread)
5256 { $ CloseHandle (_txCanvas_Thread) asserted; _txCanvas_Thread = NULL; }
5257
5258$ delete _txCanvas_UserDCs; _txCanvas_UserDCs = NULL;
5259
5260$ if (_txMain && canvas && waitableParent && _txNOP (_TX_ALLOW_KILL_PARENT))
5261 { $ waitableParent |= !_txKillProcess (parent); }
5262
5263$ if (_txMain && _txConsole)
5264 { $ _txConsole_Detach (waitableParent && !externTerm); }
5265
5266 _TX_ON_DEBUG (OutputDebugString ("\n");
5267 OutputDebugString (_TX_VERSION " - FINISHED: " _TX_MODULE "\n");
5268 OutputDebugString ("\n"));
5269 }
5270
5271//-----------------------------------------------------------------------------------------------------------------
5272
5273int _txSetFinishedText (HWND wnd)
5274 {
5275 struct tools
5276 {
5277 static LRESULT getWindowText (HWND window, wchar_t text[], int size)
5278 {
5279$1 memset (text, 0, size * sizeof (*text));
5280
5281$ return SendMessageTimeoutW (window, WM_GETTEXT, (WPARAM) size, (LPARAM) text, SMTO_BLOCK | SMTO_ABORTIFHUNG, _TX_TIMEOUT, NULL);
5282 }
5283
5284 static LRESULT setWindowText (HWND window, wchar_t text[])
5285 {
5286$1 return SendMessageTimeoutW (window, WM_SETTEXT, 0, (LPARAM) text, SMTO_BLOCK | SMTO_ABORTIFHUNG, _TX_TIMEOUT, NULL);
5287 }
5288 };
5289
5290$1 static wchar_t title [_TX_BUFSIZE+15] = L"TXLib";
5291
5292$ tools::getWindowText (wnd, title, _TX_BUFSIZE-1);
5293$ unsigned len = (unsigned) wcslen (title); if (len >= _TX_BUFSIZE) len = _TX_BUFSIZE-1;
5294
5295$ MultiByteToWideChar (_TX_CP, 0, " [ЗÐВЕРШЕÐО]", -1, title + len, _TX_BUFSIZE - len);
5296
5297$ tools::setWindowText (wnd, title);
5298$ tools::getWindowText (wnd, title, _TX_BUFSIZE-1);
5299$ if (len <= _TX_BUFSIZE-1-2 && title [len+2] == /* 'З' */ (wchar_t) 0x0417) return 0;
5300
5301$ MultiByteToWideChar (_TX_CP, 0, " [FINISHED]", -1, title + len, _TX_BUFSIZE - len);
5302
5303$ tools::setWindowText (wnd, title);
5304$ tools::getWindowText (wnd, title, _TX_BUFSIZE-1);
5305$ if (len <= _TX_BUFSIZE-1-2 && title [len+2] == /* 'F' */ (wchar_t) 0x0046) return 1;
5306
5307$ return 2;
5308 }
5309
5310//-----------------------------------------------------------------------------------------------------------------
5311
5312void _txPauseBeforeTermination (HWND canvas)
5313 {
5314$1 while (_kbhit()) (void)_getch();
5315
5316$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}};
5317$ bool kbRedir = !GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &con);
5318$ bool kbWait = (_txGetInput() == EOF);
5319$ bool wine = !!Win32::wine_get_version;
5320
5321$ if (kbWait && !canvas && !kbRedir && !wine)
5322 {
5323$ printf ("\n" "[Ðажмите любую клавишу Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ]");
5324 }
5325
5326$ for (int i = 1; ; i++)
5327 {
5328$ Sleep (_txWindowUpdateInterval);
5329
5330 if (!kbWait || (kbRedir && !canvas)) { $ break; } // No need to run and hide
5331
5332 if (!wine && _txGetInput() != EOF) { $ break; } // Somebody hit something.
5333
5334 if (canvas && !_txCanvas_ThreadId) { $ break; } // There was a window, and now there is not.
5335
5336 if (!Win32::GetConsoleWindow()) { $ break; } // Console was destroyed
5337
5338 if (Win32::GhostWindowFromHungWindow && Win32::GhostWindowFromHungWindow (canvas))
5339 { $ TX_ERROR ("Приложение завиÑло и будет закрыто."); break; }
5340
5341 if (canvas && Win32::IsHungAppWindow && Win32::IsHungAppWindow (canvas))
5342 { $ _txTrace (__FILE__, __LINE__, "WARNING: Приложение завиÑло и будет закрыто."); break; }
5343
5344 if (canvas && !SendMessageTimeout (canvas, WM_NULL, 0,0, SMTO_BLOCK | SMTO_ABORTIFHUNG, _TX_TIMEOUT, NULL))
5345 { $ _txTrace (__FILE__, __LINE__, "WARNING: Приложение не отвечает и будет закрыто."); break; }
5346
5347 if (!wine && !(i % 100500))
5348 { $ printf ("\r" "[Так нажмите же какую-нибудь клавишу Ð´Ð»Ñ Ð¼Ð¾ÐµÐ³Ð¾ завершениÑ]"); }
5349 }
5350
5351$ while (!wine && _kbhit()) (void)_getch();
5352
5353$ printf ("\n");
5354 }
5355
5356//-----------------------------------------------------------------------------------------------------------------
5357
5358int _txGetInput()
5359 {
5360$1 HANDLE con = GetStdHandle (STD_INPUT_HANDLE);
5361
5362$ DWORD nchars = 0;
5363$ if (GetConsoleMode (con, &nchars) == 0 &&
5364 PeekNamedPipe (con, NULL, 0, NULL, &nchars, NULL))
5365 {
5366$ return (nchars)? fgetc (stdin) : EOF;
5367 }
5368
5369$ if (_kbhit())
5370 {
5371$ return _getch();
5372 }
5373
5374#if defined (_MSC_VER) && (_MSC_VER < 1700)
5375
5376$ if (fseek (stdin, 1, SEEK_CUR) != EOF)
5377 {
5378$ (void) fseek (stdin, -1, SEEK_CUR);
5379$ return fgetc (stdin); // This causes blocking in MSVC 2011 beta
5380 }
5381
5382#endif
5383
5384$ return EOF;
5385 }
5386
5387//-----------------------------------------------------------------------------------------------------------------
5388
5389bool _txIsParentWaitable (DWORD* parentPID /*= NULL*/)
5390 {
5391$1 PROCESSENTRY32* info = _txFindProcess();
5392$ if (!info) return false;
5393
5394$ info = _txFindProcess (info->th32ParentProcessID);
5395$ if (!info) return false;
5396
5397$ char parent [MAX_PATH] = "";
5398$ strncpy_s (parent, info->szExeFile, sizeof (parent) - 1);
5399$ if (parentPID) *parentPID = info->th32ProcessID;
5400
5401$ info = _txFindProcess (info->th32ParentProcessID); // info: grandparent
5402
5403$ char list[_TX_BUFSIZE] = _TX_WAITABLE_PARENTS;
5404$ char* ctx = NULL;
5405
5406$ for (char* p = strtok_s (list, ", ", &ctx); p; p = strtok_s (NULL, ", ", &ctx))
5407 {
5408$ char* gp = strchr (p, ':');
5409
5410$ if (gp)
5411 {
5412$ *gp++ = 0;
5413$ if (_stricmp (p, parent) != 0) { continue; }
5414
5415$ if (info) if (_stricmp (gp, info->szExeFile) == 0) // Was &&, but OMG MSVC /analyze..
5416 { $ return true; }
5417 }
5418 else
5419 {
5420$ if (_stricmp (p, parent) == 0)
5421 { $ return true; }
5422 }
5423 }
5424
5425$ return false;
5426 }
5427
5428//-----------------------------------------------------------------------------------------------------------------
5429
5430PROCESSENTRY32* _txFindProcess (unsigned pid /*= GetCurrentProcessId()*/)
5431 {
5432$1 static PROCESSENTRY32 info = { sizeof (info) };
5433$ if (!pid) return &info;
5434
5435$ HANDLE sshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
5436$ assert (sshot); if (!sshot) return NULL;
5437
5438$ for (bool ok = !!Process32First (sshot, &info); ok; ok = !!Process32Next (sshot, &info))
5439 if (info.th32ProcessID == pid) break;
5440
5441$ CloseHandle (sshot);
5442
5443$ return &info;
5444 }
5445
5446//-----------------------------------------------------------------------------------------------------------------
5447
5448bool _txInDll()
5449 {
5450$1 MODULEENTRY32 mod = { sizeof (mod) };
5451
5452$ HANDLE sshot = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, 0);
5453$ assert (sshot); if (!sshot) return false;
5454
5455$ bool inDll = false;
5456
5457$ for (bool ok = !!Module32First (sshot, &mod); ok; ok = !!Module32Next (sshot, &mod))
5458 {
5459$ if (!mod.modBaseAddr) continue;
5460
5461$ IMAGE_DOS_HEADER* dosHdr = (IMAGE_DOS_HEADER*) mod.modBaseAddr;
5462$ IMAGE_NT_HEADERS* ntHdr = (IMAGE_NT_HEADERS*) (mod.modBaseAddr + dosHdr->e_lfanew);
5463
5464$ inDll = (dosHdr->e_magic == IMAGE_DOS_SIGNATURE &&
5465 ntHdr->Signature == IMAGE_NT_SIGNATURE &&
5466 (ntHdr->FileHeader.Characteristics & IMAGE_FILE_DLL) != 0);
5467
5468$ if (In ((BYTE*)(ptrdiff_t)_txInDll, mod.modBaseAddr, mod.modBaseAddr + mod.modBaseSize)) break;
5469 }
5470
5471$ CloseHandle (sshot);
5472$ return inDll;
5473 }
5474
5475//-----------------------------------------------------------------------------------------------------------------
5476
5477// You are here, little hacker?
5478
5479bool _txKillProcess (DWORD pid)
5480 {
5481$1 _TX_IF_ARGUMENT_FAILED (pid) return false;
5482
5483$ HANDLE token = INVALID_HANDLE_VALUE;
5484$ OpenProcessToken (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token) asserted;
5485
5486$ LUID luid = {0};
5487$ LookupPrivilegeValue (NULL, SE_DEBUG_NAME, &luid) asserted;
5488
5489$ TOKEN_PRIVILEGES priv = { 1, {{{ luid.LowPart, luid.HighPart}, SE_PRIVILEGE_ENABLED }}};
5490$ TOKEN_PRIVILEGES old = {0};
5491
5492$ DWORD oldSz = 0;
5493$ AdjustTokenPrivileges (token, false, &priv, sizeof (priv), &old, &oldSz) asserted;
5494
5495$ HANDLE proc = OpenProcess (PROCESS_ALL_ACCESS, 0, pid);
5496$ if (!proc) return false;
5497
5498$ bool ok = !!TerminateProcess (proc, 0);
5499$ CloseHandle (proc);
5500
5501$ return ok;
5502 }
5503
5504//-----------------------------------------------------------------------------------------------------------------
5505
5506// TXLib continues to hack the reality to make your life better, sweeter and easier
5507
5508PROC _txSetProcAddress (HMODULE module, const char* dllName, const char* funcName, PROC newFunc)
5509 {
5510$1 _TX_IF_ARGUMENT_FAILED (module) return NULL;
5511$ _TX_IF_ARGUMENT_FAILED (dllName) return NULL;
5512$ _TX_IF_ARGUMENT_FAILED (newFunc) return NULL;
5513
5514$ HMODULE dll = GetModuleHandle (dllName);
5515$ if (!dll) return NULL;
5516
5517$ PROC oldFunc = GetProcAddress (dll, funcName);
5518$ if (!oldFunc) return NULL;
5519
5520 #define RVA_( type, addr ) ( (type) ((ptrdiff_t) module + (ptrdiff_t) (addr)) )
5521
5522$ IMAGE_DOS_HEADER* dosHdr = RVA_ (IMAGE_DOS_HEADER*, 0);
5523$ IMAGE_NT_HEADERS* ntHdr = RVA_ (IMAGE_NT_HEADERS*, dosHdr->e_lfanew);
5524
5525$ if (dosHdr->e_magic != IMAGE_DOS_SIGNATURE ||
5526 ntHdr ->Signature != IMAGE_NT_SIGNATURE) return NULL;
5527
5528$ DWORD impOffset = ntHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
5529$ IMAGE_IMPORT_DESCRIPTOR* desc = RVA_ (IMAGE_IMPORT_DESCRIPTOR*, impOffset);
5530
5531$ if (desc == (IMAGE_IMPORT_DESCRIPTOR*) ntHdr) return NULL;
5532
5533$ IMAGE_THUNK_DATA* thunk = NULL;
5534$ bool found = false;
5535
5536 for (; desc->Name; desc++)
5537 {
5538$ if (_stricmp (RVA_ (const char*, desc->Name), dllName) != 0) continue;
5539
5540$ for (thunk = RVA_ (IMAGE_THUNK_DATA*, desc->FirstThunk); thunk->u1.Function; thunk++)
5541 if ((ptrdiff_t) thunk->u1.Function == (ptrdiff_t) oldFunc) { found = true; break; }
5542
5543$ if (found) break;
5544 }
5545
5546$ if (!found) return NULL;
5547
5548$ *(PROC*)& thunk->u1.Function = newFunc; // In different MS-SDKs this field has different types (DWORD/DWORD*/etc)
5549
5550$ return oldFunc;
5551
5552 #undef RVA_
5553 }
5554
5555//! @}
5556//}
5557//=================================================================================================================
5558
5559//=================================================================================================================
5560//{ [Internal] TXLib window functions (_txCanvas...)
5561//! @name Функции окна TXLib (_txCanvas...)
5562//=================================================================================================================
5563
5564//{
5565#if defined (_MSC_VER_6) || defined (_GCC_VER) && (_GCC_VER <= 345)
5566
5567 #define SetClassLong_ SetClassLong
5568 #define GCL_HICON_ GCL_HICON
5569 #define GCL_HICONSM_ GCL_HICONSM
5570 #define GCL_HCURSOR_ GCL_HCURSOR
5571
5572#else
5573 #define SetClassLong_ SetClassLongPtr
5574 #define GCL_HICON_ GCLP_HICON
5575 #define GCL_HICONSM_ GCLP_HICONSM
5576 #define GCL_HCURSOR_ GCLP_HCURSOR
5577 #endif
5578//}
5579
5580unsigned WINAPI _txCanvas_ThreadProc (void* data)
5581 {
5582$1 _txCanvas_ThreadId = GetCurrentThreadId();
5583
5584$ _TX_IF_ARGUMENT_FAILED (data) return false;
5585
5586$ HWND wnd = _txCanvas_CreateWindow ((SIZE*) data);
5587$ if (!txWindow()) return TX_DEBUG_ERROR ("\a" "Cannot create canvas"), 0;
5588
5589$ HICON icon32 = LoadIcon (GetModuleHandle (NULL), "_TX_ICON");
5590$ HICON icon16 = LoadIcon (GetModuleHandle (NULL), "_TX_ICONSM");
5591$ HCURSOR cursor = LoadCursor (GetModuleHandle (NULL), "_TX_CURSOR");
5592
5593$ SetClassLong_ (wnd, GCL_HICON_, (DWORD)(ptrdiff_t) (icon32? icon32 : _txCreateTXIcon (32)));
5594$ SetClassLong_ (wnd, GCL_HICONSM_, (DWORD)(ptrdiff_t) (icon16? icon16 : _txCreateTXIcon (16)));
5595$ SetClassLong_ (wnd, GCL_HCURSOR_, (DWORD)(ptrdiff_t) (cursor? cursor : LoadCursor (NULL, IDC_ARROW)));
5596
5597$ HACCEL accel = LoadAccelerators (NULL, "_TX_ACCELERATORS");
5598
5599 _TX_ON_DEBUG (OutputDebugString (_TX_VERSION " - STARTED: " _TX_MODULE "\n"));
5600
5601$ _txRunning = true;
5602
5603$ ShowWindow (wnd, SW_SHOW);
5604$ SetForegroundWindow (wnd);
5605$ UpdateWindow (wnd);
5606
5607$ MSG msg = {0};
5608$ while (GetMessage (&msg, NULL, 0, 0))
5609 {
5610$ if (!msg.hwnd) continue;
5611
5612$ if (accel != NULL && TranslateAccelerator (wnd, accel, &msg)) continue;
5613
5614$ TranslateMessage (&msg);
5615$ DispatchMessage (&msg);
5616
5617$ Sleep (0);
5618 }
5619
5620$ if (icon16) DestroyIcon (icon16); // If Explorer is displaying Tray Notification, these
5621$ if (icon32) DestroyIcon (icon32); // calls will possibly fail, and we'll get resource leak.
5622
5623$ LeaveCriticalSection (&_txCanvas_LockBackBuf);
5624
5625$ if (_txRunning && _txMain) // Main window is destroyed but main() is still running.
5626 { // No chances for good termination, so use exit().
5627$ exit ((int) msg.wParam);
5628 }
5629
5630 _TX_ON_DEBUG (OutputDebugString (_TX_VERSION " - STOPPED: " _TX_MODULE "\n"));
5631
5632$ _txCanvas_ThreadId = 0;
5633$ return true;
5634 }
5635
5636//{
5637#undef SetClassLong
5638#undef GCL_HICON_
5639#undef GCL_HICONSM_
5640#undef GCL_HCURSOR_
5641//}
5642
5643//-----------------------------------------------------------------------------------------------------------------
5644
5645HWND _txCanvas_CreateWindow (SIZE* size)
5646 {
5647$1 _TX_IF_ARGUMENT_FAILED (size) return NULL;
5648
5649$ static char className[_TX_BUFSIZE] = "";
5650$ _snprintf_s (className, sizeof (className) - 1 _TX_TRUNCATE,
5651 "/*---[TXLib]-------------------------- "
5652 _TX_VERSION " " __FILE__ " WndClass %08X "
5653 "--------------------------[TXLib]---*/", (int) GetTickCount());
5654
5655$ WNDCLASSEX wc = { sizeof (wc) };
5656$ wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
5657$ wc.lpfnWndProc = _txCanvas_WndProc;
5658$ wc.hCursor = LoadCursor (NULL, IDC_ARROW);
5659$ wc.hbrBackground = (HBRUSH) Win32::GetStockObject (HOLLOW_BRUSH);
5660$ wc.lpszClassName = className;
5661
5662$ ATOM wndclass = RegisterClassEx (&wc);
5663$ if (!wndclass) return TX_DEBUG_ERROR ("RegisterClass (\"%s\") failed" _ className), (HWND) NULL;
5664
5665$ int centered = false;
5666$ if (size->cx < 0 && size->cy < 0) { size->cx *= -1; size->cy *= -1; centered = true; }
5667
5668$ SIZE scr = { GetSystemMetrics (SM_CXSCREEN), GetSystemMetrics (SM_CYSCREEN) };
5669$ RECT r = { 0, 0, size->cx, size->cy }; AdjustWindowRect (&r, _txWindowStyle, false);
5670$ SIZE sz = { r.right - r.left, r.bottom - r.top };
5671
5672$ HWND wnd = CreateWindowEx (WS_EX_APPWINDOW, className, txGetModuleFileName (false), _txWindowStyle,
5673 centered? scr.cx/2 - sz.cx/2 : CW_USEDEFAULT,
5674 centered? scr.cy/2 - sz.cy/2 : CW_USEDEFAULT,
5675 sz.cx, sz.cy, NULL, NULL, NULL, NULL);
5676
5677$ if (!wnd || !txWindow()) return TX_DEBUG_ERROR ("Cannot create canvas: CreateWindowEx (\"%s\") failed" _ className), (HWND) NULL;
5678$ HMENU menu = GetSystemMenu (txWindow(), false);
5679$ if (!menu) return txWindow();
5680
5681$ AppendMenu (menu, MF_SEPARATOR, 0, NULL) asserted;
5682$ AppendMenu (menu, MF_STRING, _TX_IDM_CONSOLE, "Show &Console") asserted;
5683$ AppendMenu (menu, MF_STRING, _TX_IDM_ABOUT, "&About...") asserted;
5684
5685$ HWND console = Win32::GetConsoleWindow();
5686
5687$ DWORD proc = 0;
5688$ GetWindowThreadProcessId (console, &proc);
5689
5690$ if (console && (proc == GetCurrentProcessId() || _txIsParentWaitable()))
5691 { $ ShowWindow (console, _txConsoleMode); }
5692
5693$ CheckMenuItem (menu, _TX_IDM_CONSOLE, (console? (IsWindowVisible (console)? MF_CHECKED : 0) : MF_DISABLED));
5694
5695$ return txWindow();
5696 }
5697
5698//-----------------------------------------------------------------------------------------------------------------
5699
5700inline bool _txCanvas_OK()
5701 {
5702$1 return _txCanvas_ThreadId &&
5703 _txCanvas_Window &&
5704 _txCanvas_BackBuf[0] &&
5705 _txCanvas_BackBuf[1];
5706 }
5707
5708//-----------------------------------------------------------------------------------------------------------------
5709
5710int _txCanvas_SetRefreshLock (int count)
5711 {
5712$1 int oldCount = _txCanvas_RefreshLock;
5713
5714$ _txCanvas_RefreshLock = count;
5715
5716$ HWND wnd = txWindow();
5717
5718$ if ((_txCanvas_RefreshLock <= 0 || oldCount <= 0) && wnd)
5719 { $ RedrawWindow (wnd, NULL, NULL, RDW_INVALIDATE | RDW_INTERNALPAINT | RDW_UPDATENOW); }
5720
5721$ return oldCount;
5722 }
5723
5724//-----------------------------------------------------------------------------------------------------------------
5725
5726HICON _txCreateTXIcon (int size)
5727 {
5728$1 _TX_IF_ARGUMENT_FAILED (size == 32 || size == 16) return NULL;
5729
5730$ const char image32 [32*32+1] =
5731 "00000000000000000000000000000000""0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0""0F0000000000000000000000000000F0""0F0000000000000000000000000000F0"
5732 "0F0000000000000099999999999900F0""0F0000000000000090300333330900F0""0F0000000990000090000000000900F0""0F00000099990000900BB000000900F0"
5733 "0F0000039999000090B00090900900F0""0F0000009999000090B00999990900F0""0F00000009903799900BB090900900F0""0F000000009BB70090000010000900F0"
5734 "0F0000000B90000090000000000900F0""0F000000B0B0000099999999999900F0""0F00007B30B0000090000000000000F0""0F00007300B0000090000000000000F0"
5735 "0F00000000B3000090000000000000F0""0F0000000B0B000090000000000000F0""0F000000B303B00090000000000000F0""0F000003B000B00090000000000000F0"
5736 "0F00003B00003B0090000000000000F0""0F0000300000030090000000000000F0""0F0000000448888888888844000000F0""0F00004886E6E6E60E66E6EEEE4400F0"
5737 "0F4488866E0E60E00660E06E66EEE4F0""0F868806E06E06E666E66E00E06EE6F0""0F08606E66E0066000E006E66E00E6F0""0F8666E006600E00006600E006E00EF0"
5738 "0F000E066888888888888888606660F0""0F66EEE6EE000E00000E00086EEEE6F0""0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0""00000000000000000000000000000000";
5739
5740$ const char image16 [16*16+1] =
5741 "0000000000000000""0000000999999990""0009000900000090""0099900909973090""0059700909009390""0009799909973090""0099000900000090""0959330999999990"
5742 "0709500900000000""0095930900000000""0090393900000000""0790073900000000""0900000900000000""000EE6E6E6E6E000""0EE6E6E6E6E6EEE0""0000000000000000";
5743
5744$ const COLORREF pal['F'-'0'+1] = { 0x000000, 0x002b2b, 0x555500, 0x005555, 0x808000, 0x008080, 0xaaaa00, 0x00aaaa, 0xd5d500, 0x00d5d5, 0,0,0,0,0,0,0,
5745 0xffff00, 0x00ffff, 0xffffaa, 0xaaffff, 0xd5d500, 0xffffff };
5746
5747$ const char* image = (size == 32)? image32 : image16;
5748
5749$ POINT sz = { size, size };
5750$ HDC dcMask = _txBuffer_Create (txWindow(), &sz); assert (dcMask);
5751$ HDC dcColor = _txBuffer_Create (txWindow(), &sz); assert (dcColor);
5752
5753$ for (int i = 0; i < size*size; i++)
5754 {
5755 assert (In (image[i], '0', '9') || In (image[i], 'A', 'F'));
5756
5757 Win32::SetPixel (dcColor, i % size, i / size, pal [image[i] - '0']);
5758 }
5759
5760$ ICONINFO info = { true, 0, 0, (HBITMAP) Win32::GetCurrentObject (dcMask, OBJ_BITMAP),
5761 (HBITMAP) Win32::GetCurrentObject (dcColor, OBJ_BITMAP) };
5762
5763$ HICON icon = CreateIconIndirect (&info);
5764$ assert (icon);
5765
5766$ _txBuffer_Delete (&dcMask) asserted;
5767$ _txBuffer_Delete (&dcColor) asserted;
5768
5769$ return icon;
5770 }
5771
5772//! @}
5773//}
5774//=================================================================================================================
5775
5776//=================================================================================================================
5777//{ [Internal] Main window event handlers (_txCanvas_On...)
5778//! @name Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñновного окна (_txCanvas_On...)
5779//=================================================================================================================
5780//! @{
5781
5782LRESULT CALLBACK _txCanvas_WndProc (HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar)
5783 {
5784#ifdef _TX_ALLOW_TRACE
5785
5786 _txInTX++;
5787
5788 if (_txAllowTrace) _txTrace (__FILE__, __LINE__, __TX_FUNCTION__,
5789 "%*s" "0x%X <- 0x%03X (0x%08X, 0x%08lX)", 12 - _txInTX*2, "", wnd, msg, wpar, lpar);
5790 _txInTX--;
5791
5792#endif
5793
5794$1 if (msg == WM_KEYDOWN && wpar == VK_F12 &&
5795 GetKeyState (VK_SHIFT) && GetKeyState (VK_CONTROL) && GetKeyState (VK_MENU))
5796 {
5797$ _txCanvas_OnCmdABOUT (wnd, wpar);
5798$ return DefWindowProc (wnd, msg, wpar, lpar);
5799 }
5800
5801 WNDPROC altWndProc = _txAltWndProc; // Cache to prevent change from main thread
5802 if (altWndProc)
5803 {
5804$ LRESULT res = altWndProc (wnd, msg, wpar, lpar);
5805$ if (res) return res;
5806 }
5807
5808 switch (msg)
5809 {
5810 case WM_CREATE: $ _txCanvas_OnCREATE (wnd); return 0;
5811
5812 case WM_CLOSE: $ if (_txCanvas_OnCLOSE (wnd)) break; else return 0;
5813 case WM_DESTROY: $ _txCanvas_OnDESTROY (wnd); return 0;
5814
5815 case WM_PAINT: $ _txCanvas_OnPAINT (wnd); return 0;
5816 case WM_TIMER: $ _txCanvas_OnTIMER (wnd, wpar); return 0;
5817
5818 case WM_KEYDOWN: $ _txCanvas_OnKEYDOWN (wnd, wpar, lpar); return 0;
5819 case WM_CHAR: $ _txCanvas_OnCHAR (wnd, wpar, lpar); return 0;
5820
5821 case WM_LBUTTONUP:
5822 case WM_LBUTTONDOWN:
5823 case WM_RBUTTONUP:
5824 case WM_RBUTTONDOWN:
5825 case WM_MBUTTONUP:
5826 case WM_MBUTTONDOWN:
5827 case WM_MOUSEMOVE: $ _txCanvas_OnMOUSEMOVE (wnd, wpar, lpar); return 0;
5828
5829 default: break;
5830 }
5831
5832 if (msg == WM_SYSCOMMAND) switch (wpar)
5833 {
5834 case _TX_IDM_ABOUT: $ _txCanvas_OnCmdABOUT (wnd, wpar); return 0;
5835 case _TX_IDM_CONSOLE: $ _txCanvas_OnCmdCONSOLE (wnd, wpar); return 0;
5836
5837 default: break;
5838 }
5839
5840$ return DefWindowProc (wnd, msg, wpar, lpar);
5841 }
5842
5843//-----------------------------------------------------------------------------------------------------------------
5844
5845bool _txCanvas_OnCREATE (HWND wnd)
5846 {
5847$1 _TX_IF_ARGUMENT_FAILED (wnd) return false;
5848
5849$ _txCanvas_BackBuf[0] = _txBuffer_Create (wnd); assert (_txCanvas_BackBuf[0]);
5850$ _txCanvas_BackBuf[1] = _txBuffer_Create (wnd); assert (_txCanvas_BackBuf[1]);
5851
5852$ SetTimer (wnd, _txCanvas_RefreshTimer, _txWindowUpdateInterval, NULL) asserted;
5853
5854$ _txCanvas_Window = wnd;
5855
5856$ txSetDefaults();
5857
5858$ return true;
5859 }
5860
5861//-----------------------------------------------------------------------------------------------------------------
5862
5863bool _txCanvas_OnDESTROY (HWND wnd)
5864 {
5865$1 _TX_IF_ARGUMENT_FAILED (wnd) return false;
5866
5867 // Инициируем оÑтановку цикла Ñообщений
5868
5869$ PostQuitMessage (_txRunning? WM_DESTROY : EXIT_SUCCESS);
5870
5871$ if (!_txCanvas_Window) return false;
5872
5873 // Indicate that we are about to manually terminate
5874
5875$ _txExit = true;
5876
5877 // Lock GDI resources
5878
5879$ bool locked = false;
5880$ _txWaitFor ((locked = txLock (false), locked), _TX_TIMEOUT);
5881$ if (!locked) TX_DEBUG_ERROR ("Cannot lock GDI to free resources");
5882
5883 // ОÑвобождаем пользовательÑкие реÑурÑÑ‹
5884
5885$ if (_txCanvas_UserDCs && _txCanvas_UserDCs->size())
5886 {
5887$ txNotifyIcon (NIIF_ERROR, NULL, "Ð’Ñ‹ забыли оÑвободить %d HDC.", (int) _txCanvas_UserDCs->size());
5888$ Sleep (_TX_TIMEOUT);
5889
5890$ for (size_t i = 0; i < _txCanvas_UserDCs->size(); i++) _txBuffer_Delete (&_txCanvas_UserDCs->at (i));
5891$ _txCanvas_UserDCs->clear();
5892 }
5893
5894 // ОÑвобождаем реÑурÑÑ‹, ÑвÑзанные Ñ Ð¾ÐºÐ½Ð¾Ð¼
5895
5896$ if (_txCanvas_RefreshTimer) KillTimer (wnd, _txCanvas_RefreshTimer) asserted;
5897
5898$ if (_txCanvas_BackBuf[1]) _txBuffer_Delete (&_txCanvas_BackBuf[1]) asserted;
5899$ if (_txCanvas_BackBuf[0]) _txBuffer_Delete (&_txCanvas_BackBuf[0]) asserted;
5900
5901$ txUnlock();
5902
5903 // Indicate that we are destroyed
5904
5905$ _txCanvas_Window = NULL;
5906
5907$ return true;
5908 }
5909
5910//-----------------------------------------------------------------------------------------------------------------
5911
5912bool _txCanvas_OnCLOSE (HWND wnd)
5913 {
5914$1 _TX_IF_ARGUMENT_FAILED (wnd && _txCanvas_OK()) return false;
5915
5916$ if (_txMain && _txRunning &&
5917 txMessageBox ("Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ main() не завершена. Программа вÑе еще работает. Прервать аварийно? \n\n"
5918 "Лучше подождать, когда main() завершитÑÑ - Ñто отображаетÑÑ Ð² заголовке окна.",
5919 txGetModuleFileName (false), MB_OKCANCEL | MB_ICONSTOP) != IDOK) return false;
5920$ return true;
5921 }
5922
5923//-----------------------------------------------------------------------------------------------------------------
5924
5925bool _txCanvas_OnTIMER (HWND wnd, WPARAM)
5926 {
5927$1 _TX_IF_ARGUMENT_FAILED (wnd) return false;
5928
5929$ if (_txCanvas_RefreshLock > 0 || !_txRunning) return false;
5930
5931$ InvalidateRect (wnd, NULL, false) asserted;
5932$ UpdateWindow (wnd) asserted;
5933
5934$ return true;
5935 }
5936
5937//-----------------------------------------------------------------------------------------------------------------
5938
5939bool _txCanvas_OnPAINT (HWND wnd)
5940 {
5941$1 _TX_IF_ARGUMENT_FAILED (wnd && _txCanvas_OK()) return false;
5942
5943$ bool forceRedraw = GetAsyncKeyState (VK_MENU) && GetAsyncKeyState (VK_CONTROL) &&
5944 GetAsyncKeyState (VK_SHIFT) && GetAsyncKeyState (VK_SNAPSHOT);
5945
5946$ PAINTSTRUCT ps = {0};
5947$ HDC dc = BeginPaint (wnd, &ps);
5948$ if (!dc) return false;
5949
5950$ RECT r = {0};
5951$ GetClientRect (wnd, &r) asserted;
5952$ POINT size = { r.right - r.left, r.bottom - r.top };
5953
5954$ if ((_txCanvas_RefreshLock <= 0 || forceRedraw) &&
5955 txLock (false))
5956 {
5957$ Win32::BitBlt (_txCanvas_BackBuf[1], 0, 0, size.x, size.y, txDC(), 0, 0, SRCCOPY);
5958
5959$ _txConsole_Draw (_txCanvas_BackBuf[1]);
5960
5961$ txUnlock();
5962 }
5963
5964 // Magic 100500 value is used to completely block screen refresh.
5965 // Since no value can be 100500 or above, this condition is always true and the refresh cannot be blocked IRL.
5966 // Do not use 100501 because it may lead to errors on some compilers and possible may crash the compilers
5967 // themselves.
5968 // Yes guys, with all your software installed. :(
5969
5970$ if (_txCanvas_RefreshLock != 100500)
5971 { $ Win32::BitBlt (dc, 0, 0, size.x, size.y, _txCanvas_BackBuf[1], 0, 0, SRCCOPY); }
5972
5973$ EndPaint (wnd, &ps) asserted;
5974
5975$ return true;
5976 }
5977
5978//-----------------------------------------------------------------------------------------------------------------
5979
5980bool _txCanvas_OnKEYDOWN (HWND, WPARAM vk, LPARAM info)
5981 {
5982$1 INPUT_RECORD evt = {0};
5983
5984$ evt.EventType = KEY_EVENT;
5985$ evt.Event.KeyEvent.bKeyDown = true;
5986$ evt.Event.KeyEvent.wRepeatCount = 1;
5987$ evt.Event.KeyEvent.uChar.AsciiChar = (unsigned char) MapVirtualKey ((WORD) vk, 2); // 2 == MAPVK_VK_TO_CHAR
5988$ evt.Event.KeyEvent.wVirtualScanCode = (unsigned char) (info >> 16);
5989$ evt.Event.KeyEvent.wVirtualKeyCode = (WORD) vk;
5990$ evt.Event.KeyEvent.dwControlKeyState = (info & (1 << 24))? ENHANCED_KEY : 0;
5991
5992$ if (evt.Event.KeyEvent.uChar.AsciiChar) return false; // Let TranslateMessage() and WM_CHAR do the job
5993
5994$ DWORD written = 0;
5995$ WriteConsoleInput (GetStdHandle (STD_INPUT_HANDLE), &evt, 1, &written);
5996
5997$ return false;
5998 }
5999
6000//-----------------------------------------------------------------------------------------------------------------
6001
6002bool _txCanvas_OnCHAR (HWND, WPARAM ch, LPARAM info)
6003 {
6004$1 INPUT_RECORD evt = {0};
6005
6006$ evt.EventType = KEY_EVENT;
6007$ evt.Event.KeyEvent.bKeyDown = true;
6008$ evt.Event.KeyEvent.wRepeatCount = 1;
6009$ evt.Event.KeyEvent.uChar.AsciiChar = (unsigned char) (ch);
6010$ evt.Event.KeyEvent.wVirtualScanCode = (unsigned char) (info >> 16);
6011$ evt.Event.KeyEvent.wVirtualKeyCode = (WORD) MapVirtualKey ((WORD) (info >> 16), 3); // 3 == MAPVK_VSC_TO_VK_EX
6012$ evt.Event.KeyEvent.dwControlKeyState = 0;
6013
6014$ DWORD written = 0;
6015$ WriteConsoleInput (GetStdHandle (STD_INPUT_HANDLE), &evt, 1, &written);
6016
6017$ return true;
6018 }
6019
6020//-----------------------------------------------------------------------------------------------------------------
6021
6022bool _txCanvas_OnMOUSEMOVE (HWND, WPARAM buttons, LPARAM coords)
6023 {
6024$1 _TX_IF_ARGUMENT_FAILED (_txCanvas_OK()) return false;
6025
6026$ _txMousePos.x = LOWORD (coords);
6027$ _txMousePos.y = HIWORD (coords);
6028$ _txMouseButtons = (int) buttons;
6029
6030$ return true;
6031 }
6032
6033//-----------------------------------------------------------------------------------------------------------------
6034
6035bool _txCanvas_OnCmdCONSOLE (HWND wnd, WPARAM cmd)
6036 {
6037$1 _TX_IF_ARGUMENT_FAILED (wnd) return false;
6038
6039$ HWND console = Win32::GetConsoleWindow();
6040$ if (!console) return false;
6041
6042$ bool visible = !!IsWindowVisible (console);
6043
6044$ ShowWindow (console, visible? SW_HIDE : SW_SHOW);
6045
6046$ visible = !!IsWindowVisible (console);
6047$ CheckMenuItem (GetSystemMenu (wnd, false), (int) cmd, visible? MF_CHECKED : MF_UNCHECKED);
6048
6049$ return true;
6050 }
6051
6052//-----------------------------------------------------------------------------------------------------------------
6053
6054bool _txCanvas_OnCmdABOUT (HWND, WPARAM)
6055 {
6056$1 //{ Overriding the missing names, if the set is uncomplete
6057
6058 #if defined (__MODULE)
6059 #define ABOUT_NAME_ __MODULE
6060 #else
6061 #define ABOUT_NAME_ "TXLib"
6062 #endif
6063
6064 #if defined (__MODULE) || defined (__VERSION) || defined (__DESCRIPTION) || defined (__AUTHOR)
6065
6066 #ifndef __MODULE
6067 #define __MODULE "TXLib" "\n" "#define __MODULE to set the name.\n"
6068 #endif
6069
6070 #ifndef __VERSION
6071 #define __VERSION "(0.000000000)." "\n" "#define __VERSION to set the string value.\n"
6072 #endif
6073
6074 #ifndef __DESCRIPTION
6075 #define __DESCRIPTION "(Да, мне лень задать опиÑание)." "\n" "#define __DESCRIPTION to override project role.\n"
6076 #endif
6077
6078 #ifndef __AUTHOR
6079 #define __AUTHOR "(ÐепонÑтно кто)." "\n" "#define __AUTHOR to override this name."
6080 #endif
6081
6082 #endif
6083 //}
6084
6085$ time_t timeT = time (NULL) - clock()/CLOCKS_PER_SEC;
6086$ char timeS[32] = "";
6087$ ctime_s (timeS, sizeof (timeS), &timeT);
6088
6089$ static char text[_TX_BUFSIZE] = "";
6090$ char cwd [MAX_PATH] = "";
6091
6092$ _snprintf_s (text, sizeof (text) - 1 _TX_TRUNCATE,
6093
6094 "Application:\n"
6095
6096 #if defined (__MODULE) || defined (__VERSION) || defined (__DESCRIPTION) || defined (__AUTHOR)
6097 __MODULE " version " __VERSION "\n" __DESCRIPTION "\n" "Copyright (c) " __AUTHOR "\n"
6098 #else
6099 "ЗдеÑÑŒ могла бы быть Ваша реклама :)\n"
6100 "#define __MODULE to \"your program name\" before including TXLib.h to use this billboard...\n"
6101 #endif
6102
6103 "\n" "Developed with:\n\n"
6104 "The Dumb Artist Library (TX Library) - " _TX_VERSION "\n" _TX_AUTHOR "\n"
6105 "See license on: http://txlib.ru\n\n"
6106
6107 "TXLib file:" "\t" __FILE__ "\n"
6108 "Compiled:" "\t" __DATE__ " " __TIME__ ", " _TX_BUILDMODE ", " __TX_COMPILER__ "\n"
6109 "Started:" "\t" "%.6s %.4s %.8s\n\n"
6110
6111 "Run file:" "\t" "%s\n"
6112 "Directory:" "\t" "%s",
6113
6114 timeS + 4, timeS + 20, timeS + 11, // These offsets are ANSI standardized
6115 txGetModuleFileName(),
6116 _getcwd (cwd, sizeof (cwd) - 1));
6117
6118$ txMessageBox (text, "About " ABOUT_NAME_, MB_ICONINFORMATION);
6119
6120 // And a bit of HTTP-code in C++ function:
6121
6122 goto http;
6123 http://txlib.ru // See valuable refs here :)
6124
6125$ return true;
6126
6127 #undef ABOUT_NAME_
6128 }
6129
6130//! @}
6131//}
6132//=================================================================================================================
6133
6134//=================================================================================================================
6135//{ [Internal] Console-support functions (_txConsole...)
6136//! @name Функции конÑольного окна (_txConsole...)
6137//=================================================================================================================
6138//! @{
6139
6140HWND _txConsole_Attach()
6141 {
6142$1 HWND console = Win32::GetConsoleWindow();
6143
6144$ if (!console)
6145 {
6146$ FreeConsole();
6147$ AllocConsole();
6148 }
6149
6150$ console = Win32::GetConsoleWindow();
6151$ if (!console) return NULL;
6152
6153 // Linux::Wine v1.2.2+ compatibility.
6154 // Beer compatibility will be added in future versions.
6155 // Минздрав РФ предупреждает: чрезмерное употребление wine вредит Вашему здоровью.
6156
6157$ if (Win32::wine_get_version)
6158 {
6159$ Win32::GetNumberOfConsoleFonts = NULL;
6160$ Win32::GetCurrentConsoleFont = NULL;
6161$ Win32::SetConsoleFont = NULL;
6162 }
6163
6164 // УÑтанавливаем руÑÑкую кодовую Ñтраницу Ð´Ð»Ñ ÐºÐ¾Ð½Ñоли Windows
6165
6166$ SetConsoleCP (_TX_CP); // 1251
6167$ SetConsoleOutputCP (_TX_CP); // 1251
6168
6169 // УÑтанавливаем руÑÑкую кодовую Ñтраницу Ð´Ð»Ñ Ñтандартной библиотеки, иначе не будут работать Unicode-верÑии
6170 // функций (wprintf, ...). ЕÑли компилите Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ gcc и ÑобираетеÑÑŒ иÑпользовать L"unicode-Ñтроки" Ñ Ñ€ÑƒÑÑким
6171 // Ñзыком, укажите опции в командной Ñтроке компилÑтора g++: -finput-charset=CP1251 -fexec-charset=CP1251.
6172
6173$ setlocale (LC_CTYPE, _TX_LC_CTYPE); // "Russian"
6174$ if (!Win32::wine_get_version) _wsetlocale (LC_CTYPE, _TX_LC_CTYPE_W); // L"Russian_Russia.ACP"
6175
6176$ static bool done = false;
6177$ if (done) return console;
6178
6179 // Впечатлительным лучше Ñюда не Ñмотреть.
6180
6181$ if (!Win32::wine_get_version)
6182 { $ _txConsole_SetUnicodeFont(); }
6183
6184#ifndef _CONSOLE
6185
6186 // Переоткрываем заново <s>Ðмерику</s> потоки ввода-вывода, еÑли subsystem != console
6187
6188$ *stdin = *_fdopen (_open_osfhandle ((DWORD)(ptrdiff_t) GetStdHandle (STD_INPUT_HANDLE), _O_TEXT), "r");
6189$ fflush (stdout); *stdout = *_fdopen (_open_osfhandle ((DWORD)(ptrdiff_t) GetStdHandle (STD_OUTPUT_HANDLE), _O_TEXT), "w");
6190$ fflush (stderr); *stderr = *_fdopen (_open_osfhandle ((DWORD)(ptrdiff_t) GetStdHandle (STD_ERROR_HANDLE), _O_TEXT), "w");
6191
6192$ setvbuf (stdin, NULL, _IONBF, 0);
6193$ setvbuf (stdout, NULL, _IONBF, 0);
6194$ setvbuf (stderr, NULL, _IONBF, 0);
6195
6196$ std::ios::sync_with_stdio();
6197
6198#endif
6199
6200 // That's all, folks
6201
6202$ done = true;
6203$ return console;
6204 }
6205
6206//-----------------------------------------------------------------------------------------------------------------
6207
6208inline bool _txConsole_OK()
6209 {
6210$1 return Win32::GetConsoleWindow() != NULL;
6211 }
6212
6213//-----------------------------------------------------------------------------------------------------------------
6214
6215bool _txConsole_Detach (bool activate)
6216 {
6217$1 HWND console = Win32::GetConsoleWindow();
6218$ if (!console) return false;
6219
6220$ EnableWindow (console, true);
6221$ ShowWindow (console, SW_SHOW);
6222
6223$ if (activate)
6224 {
6225$ SetForegroundWindow (console);
6226$ BringWindowToTop (console);
6227 }
6228
6229$ return !!FreeConsole();
6230 }
6231
6232//-----------------------------------------------------------------------------------------------------------------
6233
6234bool _txConsole_Draw (HDC dc)
6235 {
6236$1 _TX_IF_ARGUMENT_FAILED (dc) return false;
6237
6238$ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE);
6239
6240$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}};
6241$ BOOL ok = GetConsoleScreenBufferInfo (out, &con);
6242$ if (!ok) return false;
6243
6244$ POINT size = { con.srWindow.Right - con.srWindow.Left + 1,
6245 con.srWindow.Bottom - con.srWindow.Top + 1 };
6246
6247$ SIZE fontSz = { 12, 16 };
6248$ Win32::GetTextExtentPoint32 (dc, "W", 1, &fontSz) asserted;
6249
6250$ COLORREF pal [16] = { 0x000000, 0x800000, 0x008000, 0x808000, 0x000080, 0x800080, 0x008080, 0xC0C0C0,
6251 0x808080, 0xFF0000, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFF };
6252
6253$ for (int y = 0; y < size.y; y++)
6254 {
6255 static char chr [_TX_BUFSIZE + 1] = ""; // [con.dwSize.X + 1]; maybe will be truncated
6256 static WORD atr [_TX_BUFSIZE + 1] = {0}; // [con.dwSize.X + 1]; maybe will be truncated
6257 COORD coord = { (short) (con.srWindow.Left), (short) (y + con.srWindow.Top) };
6258 DWORD read = 0;
6259
6260 if (!ReadConsoleOutputCharacter (out, chr, SIZEARR (chr) - 1, coord, &read)) continue;
6261 if (!ReadConsoleOutputAttribute (out, atr, SIZEARR (atr) - 1, coord, &read)) continue;
6262
6263 for (int x = 0, xEnd = size.x; x < size.x; x = xEnd)
6264 {
6265 Win32::SetTextColor (dc, pal [ atr[x] & 0x0F]);
6266 Win32::SetBkColor (dc, pal [(atr[x] >> 4) & 0x0F]);
6267 Win32::SetBkMode (dc, (atr[x] & 0xF0)? OPAQUE : TRANSPARENT);
6268
6269 for (xEnd = x+1; atr[xEnd] == atr[x] && xEnd < size.x; xEnd++) ;
6270
6271 Win32::TextOut (dc, ROUND (fontSz.cx * (x + con.srWindow.Left)),
6272 ROUND (fontSz.cy * y), chr + x, xEnd - x) asserted;
6273 }
6274 }
6275
6276$ Win32::SetTextColor (dc, pal [ con.wAttributes & 0x0F]);
6277$ Win32::SetBkColor (dc, pal [(con.wAttributes >> 4) & 0x0F]);
6278$ Win32::SetBkMode (dc, TRANSPARENT);
6279
6280$ if (_txConsole_IsBlinking &&
6281 In (con.dwCursorPosition, con.srWindow) &&
6282 GetTickCount() % _txCursorBlinkInterval*2 > _txCursorBlinkInterval &&
6283 GetForegroundWindow() == txWindow())
6284 {
6285$ Win32::TextOut (dc, ROUND (fontSz.cx * (con.dwCursorPosition.X - con.srWindow.Left)),
6286 ROUND (fontSz.cy * (con.dwCursorPosition.Y - con.srWindow.Top)) + 1,
6287 "_", 1) asserted;
6288 }
6289
6290$ return true;
6291 }
6292
6293//-----------------------------------------------------------------------------------------------------------------
6294//{ Welcome to the Duck Side! Together we will rule the Bathroom!
6295//-----------------------------------------------------------------------------------------------------------------
6296
6297bool _txConsole_SetUnicodeFont()
6298 {
6299 // ÐÐ°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ð’Ð¸Ñты вÑе хорошо...
6300
6301$1 if (Win32::GetCurrentConsoleFontEx && Win32::SetCurrentConsoleFontEx)
6302 {
6303$ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE);
6304
6305$ Win32::CONSOLE_FONT_INFOEX info = { sizeof (info) };
6306$ if (!Win32::GetCurrentConsoleFontEx (out, false, &info)) return false;
6307
6308$ info.FontFamily = 0x36; // Unicode fixed-pitch
6309$ if (!*info.FaceName) info.dwFontSize.Y = (SHORT) (info.dwFontSize.Y + 2); // Terminal font is too small
6310$ wcsncpy_s (info.FaceName, L"Lucida Console", SIZEARR (info.FaceName));
6311
6312$ return !!Win32::SetCurrentConsoleFontEx (out, false, &info);
6313 }
6314
6315 // ...а до Ñтого вÑе не так Ñладко
6316
6317$ const unsigned uniFont = 10; // The Internet and W2K sources know this magic number
6318$ const unsigned uniSize = 20; // Size of the font desired, should be > max of Raster Fonts
6319$ bool ok = true;
6320
6321 // Force Windows to use Unicode font by creating and run the console shortcut tuned to use that font.
6322
6323$ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE);
6324
6325$ if (Win32::GetNumberOfConsoleFonts && Win32::GetNumberOfConsoleFonts() <= uniFont)
6326 {
6327$ HRESULT init = Win32::CoInitialize (NULL);
6328$ size_t sz = 0;
6329
6330$ char link [MAX_PATH] = "";
6331$ getenv_s (&sz, link, sizeof (link) - 1, "TEMP");
6332$ strncat_s (link, "\\~txLink.lnk", sizeof (link) - 1);
6333
6334$ char comspec [MAX_PATH] = "";
6335$ getenv_s (&sz, comspec, sizeof (comspec), "COMSPEC");
6336
6337$ (void) _unlink (link);
6338
6339$ _txCreateShortcut (link, comspec, "/c exit", NULL, NULL, SW_SHOWMINNOACTIVE, NULL, 0, uniSize) asserted;
6340
6341$ ok = (Win32::ShellExecuteA (NULL, NULL, link, NULL, NULL, SW_SHOWMINNOACTIVE) > (void*)32); // Sic!
6342 if (ok) { $ _txWaitFor (FindWindow (NULL, "~txLink"), _TX_TIMEOUT); }
6343
6344$ (void) _unlink (link);
6345
6346$ if (init == S_OK) Win32::CoUninitialize();
6347 }
6348
6349 // If Unicode font is not already set, do set it.
6350
6351$ CONSOLE_FONT_INFO cur = {0};
6352 if (Win32::GetCurrentConsoleFont) { $ Win32::GetCurrentConsoleFont (out, false, &cur); }
6353
6354$ ok &= (cur.nFont >= uniFont);
6355 if (!ok) { $ ok &= Win32::SetConsoleFont && Win32::SetConsoleFont (out, uniFont); }
6356
6357$ HWND console = Win32::GetConsoleWindow();
6358$ InvalidateRect (console, NULL, false);
6359$ UpdateWindow (console);
6360
6361$ return ok;
6362 }
6363
6364//-----------------------------------------------------------------------------------------------------------------
6365//{ The nightmare helpers
6366
6367#define _TX_TRY { goto __tx_try; } __tx_try: { int __tx_error = S_OK; (void)__tx_error;
6368#define _TX_CHECKED( cmd ) { if (FAILED (__tx_error = (cmd))) goto __tx_catch; }
6369#define _TX_FAIL { __tx_error = E_FAIL; goto __tx_catch; }
6370#define _TX_RETRY { __tx_error = S_OK; goto __tx_try; }
6371#define _TX_OK ( SUCCEEDED (__tx_error) )
6372#define _TX_CATCH goto __tx_finally; __tx_catch:
6373#define _TX_RETURN goto __tx_finally;
6374#define _TX_FINALLY __tx_finally:
6375#define _TX_ENDTRY }
6376
6377//}
6378//-----------------------------------------------------------------------------------------------------------------
6379
6380// Мало не покажетÑÑ
6381
6382bool _txCreateShortcut (const char shortcutName[],
6383 const char fileToLink[], const char args[] /*= NULL*/, const char workDir[] /*= NULL*/,
6384 const char description[] /*= NULL*/, int cmdShow /*= SW_SHOWNORMAL*/, const char iconFile[] /*= NULL*/, int iconIndex /*= 0*/,
6385 int fontSize /*= 0*/, COORD bufSize /*= ZERO (COORD)*/, COORD wndSize /*= ZERO (COORD)*/, COORD wndOrg /*=ZERO (COORD)*/)
6386 {
6387$1 _TX_IF_ARGUMENT_FAILED (shortcutName && *shortcutName) return false;
6388$ _TX_IF_ARGUMENT_FAILED (fileToLink && *fileToLink) return false;
6389
6390$ IShellLink* shellLink = NULL;
6391$ Win32::IShellLinkDataList* dataList = NULL;
6392$ IPersistFile* file = NULL;
6393
6394$ HRESULT init = Win32::CoInitialize (NULL);
6395
6396 _TX_TRY
6397 {
6398$ _TX_CHECKED (Win32::CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, Win32::IID_IShellLink, (void**) &shellLink));
6399$ if (!shellLink) _TX_FAIL;
6400
6401$ shellLink->SetPath (fileToLink);
6402$ shellLink->SetArguments (args);
6403$ shellLink->SetWorkingDirectory (workDir);
6404$ shellLink->SetDescription (description);
6405$ shellLink->SetShowCmd (cmdShow);
6406$ shellLink->SetIconLocation (iconFile, iconIndex);
6407
6408$ _TX_CHECKED (shellLink->QueryInterface (Win32::IID_IShellLinkDataList, (void**) &dataList));
6409$ if (!dataList) _TX_FAIL;
6410
6411$ Win32::NT_CONSOLE_PROPS props =
6412 {{sizeof (props), NT_CONSOLE_PROPS_SIG},
6413
6414 0x07, 0xF5, // wFillAttribute, wPopupFillAttribute
6415 {bufSize.X, bufSize.Y}, // dwScreenBufferSize
6416 {wndSize.X, wndSize.Y}, // dwWindowSize
6417 {wndOrg.X, wndOrg.Y}, // dwWindowOrigin
6418 0, // nFont
6419 0, // nInputBufferSize
6420 {0, (short) fontSize}, // dwFontSize
6421 0x36, 400, L"Lucida Console", // uFontFamily, uFontWeight, FaceName. We're dancing for this!
6422 15, // uCursorSize
6423 0, 1, 1, 0, // bFullScreen, bQuickEdit, bInsertMode, bAutoPosition
6424 50, 4, 0, // uHistoryBufferSize, uNumberOfHistoryBuffers, bHistoryNoDup
6425
6426 {0x000000, 0x800000, 0x008000, 0x808000, 0x000080, 0x800080, 0x008080, 0xC0C0C0,
6427 0x808080, 0xFF0000, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFF}
6428 };
6429
6430$ _TX_CHECKED (dataList->AddDataBlock (&props));
6431
6432$ _TX_CHECKED (shellLink->QueryInterface (Win32::IID_IPersistFile, (void**) &file));
6433$ if (!file) _TX_FAIL;
6434
6435$ wchar_t wName[MAX_PATH] = L"";
6436$ MultiByteToWideChar (_TX_CP, 0, shortcutName, -1, wName, MAX_PATH) || ZeroMemory (wName, sizeof (wName));
6437
6438$ _TX_CHECKED (file->Save (wName, true));
6439 }
6440
6441$ _TX_CATCH
6442$ _TX_FINALLY
6443
6444$ if (file) file ->Release();
6445$ if (dataList) dataList ->Release();
6446$ if (shellLink) shellLink->Release();
6447
6448$ if (init == S_OK) Win32::CoUninitialize();
6449
6450$ return _TX_OK;
6451 _TX_ENDTRY
6452 }
6453
6454//}
6455//-----------------------------------------------------------------------------------------------------------------
6456
6457//! @}
6458//}
6459//=================================================================================================================
6460
6461//=================================================================================================================
6462//{ [Internal] Memory DC functions (_txBuffer...)
6463//! @name Функции "виртуального холÑта" (графичеÑкого буфера, _txBuffer...)
6464//=================================================================================================================
6465//! @{
6466
6467HDC _txBuffer_Create (HWND wnd, const POINT* size, HBITMAP bitmap)
6468 {
6469$1 txAutoLock _lock;
6470
6471$ HDC wndDC = GetDC (wnd);
6472$ if (!wndDC) return NULL;
6473
6474$ RECT r = {0};
6475$ if (wnd) GetClientRect (wnd, &r) asserted;
6476$ POINT sz = { r.right - r.left, r.bottom - r.top };
6477$ if (!size) size = &sz;
6478
6479$ HDC dc = Win32::CreateCompatibleDC (wndDC);
6480$ if (!dc) TX_DEBUG_ERROR ("Cannot create buffer: CreateCompatibleDC() failed");
6481
6482$ HBITMAP bmap = bitmap? bitmap : Win32::CreateCompatibleBitmap (wndDC, size->x, size->y);
6483$ if (!bmap) TX_DEBUG_ERROR ("Cannot create buffer: CreateCompatibleBitmap() failed");
6484
6485$ Win32::SelectObject (dc, bmap) asserted;
6486
6487$ if (!bitmap) Win32::PatBlt (dc, 0, 0, size->x, size->y, BLACKNESS) asserted;
6488
6489$ ReleaseDC (wnd, wndDC) asserted;
6490
6491$ return dc;
6492 }
6493
6494//-----------------------------------------------------------------------------------------------------------------
6495
6496bool _txBuffer_Delete (HDC* dc)
6497 {
6498$1 _TX_IF_ARGUMENT_FAILED (dc) return false;
6499$ if (!*dc) return false;
6500
6501$ if (!Win32::GetObjectType (Win32::GetCurrentObject (*dc, OBJ_BITMAP))) return false;
6502
6503$ txAutoLock _lock;
6504
6505$ _txBuffer_Select (Win32::GetStockObject (NULL_PEN), *dc) asserted;
6506$ _txBuffer_Select (Win32::GetStockObject (NULL_BRUSH), *dc) asserted;
6507$ _txBuffer_Select (Win32::GetStockObject (SYSTEM_FONT), *dc) asserted;
6508$ _txBuffer_Select (Win32::CreateCompatibleBitmap (*dc, 0, 0), *dc) asserted;
6509
6510$ Win32::DeleteObject (Win32::GetCurrentObject (*dc, OBJ_BITMAP)) asserted;
6511
6512$ Win32::DeleteDC (*dc) asserted;
6513
6514$ *dc = NULL;
6515
6516$ return true;
6517 }
6518
6519//-----------------------------------------------------------------------------------------------------------------
6520
6521bool _txBuffer_Select (HGDIOBJ obj, HDC dc /*= txDC()*/)
6522 {
6523$1 _TX_IF_ARGUMENT_FAILED (obj) return false;
6524$ _TX_IF_ARGUMENT_FAILED (dc) return false;
6525
6526$ if (!Win32::GetObjectType (obj)) TX_DEBUG_ERROR ("Invalid GDI object type");
6527
6528$ txAutoLock _lock;
6529
6530$ obj = Win32::SelectObject (dc, obj);
6531$ if (obj) Win32::DeleteObject (obj) asserted;
6532
6533$ return obj != NULL;
6534 }
6535
6536//! @}
6537//}
6538//=================================================================================================================
6539
6540//=================================================================================================================
6541//{ Diagnostics
6542//! @name ДиагноÑтика
6543//=================================================================================================================
6544//! @{
6545
6546void _txOnSignal (int sig/* = 0*/, int fpe/* = 0*/)
6547 {
6548 if (!sig && !fpe)
6549 {
6550$1 signal (SIGSEGV, (void(*)(int))_txOnSignal) != SIG_ERR asserted;
6551$ signal (SIGFPE, (void(*)(int))_txOnSignal) != SIG_ERR asserted;
6552$ signal (SIGABRT, (void(*)(int))_txOnSignal) != SIG_ERR asserted;
6553$ signal (SIGILL, (void(*)(int))_txOnSignal) != SIG_ERR asserted;
6554$ signal (SIGTERM, (void(*)(int))_txOnSignal) != SIG_ERR asserted;
6555$ return;
6556 }
6557
6558 const char* sSig = ": ÐеизвеÑтный тип Ñигнала";
6559 const char* sFPE = ": ÐеизвеÑтный тип иÑключениÑ";
6560
6561 #define GET_DESCR_( str, code, descr ) case (code): { (str) = #code ": " descr; break; }
6562
6563 switch (sig)
6564 {
6565 GET_DESCR_ (sSig, SIGSEGV, "ДоÑтуп по неверному указателю. Ставьте аÑÑерты!")
6566 GET_DESCR_ (sSig, SIGILL, "Попытка выполнить недопуÑтимую операцию. Проверьте указатели на функции.")
6567 GET_DESCR_ (sSig, SIGABRT, "Ðварийное завершение программы, вызвана Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ abort().")
6568 GET_DESCR_ (sSig, SIGTERM, "Получен Ñигнал принудительного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹.")
6569 GET_DESCR_ (sSig, SIGFPE, "Ð“Ñ€ÑƒÐ±Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в вычиÑлениÑÑ…, деление на 0 или что-нибудь еще")
6570 default: break;
6571 }
6572
6573 if (sig == SIGFPE) switch (fpe)
6574 {
6575 GET_DESCR_ (sFPE, 0x81 /* _FPE_INVALID */, "Результат неверен")
6576 GET_DESCR_ (sFPE, 0x82 /* _FPE_DENORMAL */, "ДенормализациÑ")
6577 GET_DESCR_ (sFPE, 0x83 /* _FPE_ZERODIVIDE */, "Деление на ноль")
6578 GET_DESCR_ (sFPE, 0x84 /* _FPE_OVERFLOW */, "Результат Ñлишком большой")
6579 GET_DESCR_ (sFPE, 0x85 /* _FPE_UNDERFLOW */, "Результат Ñлишком маленький")
6580 GET_DESCR_ (sFPE, 0x86 /* _FPE_INEXACT */, "Ðеточный результат")
6581 GET_DESCR_ (sFPE, 0x87 /* _FPE_UNEMULATED */, "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ поддерживаетÑÑ")
6582 GET_DESCR_ (sFPE, 0x88 /* _FPE_SQRTNEG */, "Квадратный корень из отрицательного чиÑла")
6583 GET_DESCR_ (sFPE, 0x8A /* _FPE_STACKOVERFLOW */, "Переполнение Ñтека ÑопроцеÑÑора")
6584 GET_DESCR_ (sFPE, 0x8B /* _FPE_STACKUNDERFLOW */, "Ð’ Ñтеке ÑопроцеÑÑора не хватает данных")
6585 GET_DESCR_ (sFPE, 0x8C /* _FPE_EXPLICITGEN */, "Явный вызов иÑключениÑ")
6586 default: break;
6587 }
6588
6589 #undef GET_DESCR_
6590
6591 _fpreset();
6592
6593 if (sig == SIGFPE && fpe)
6594 _txError (NULL, 0, NULL, "signal (%d, 0x%02X): %s, %s." _ sig _ fpe _ sSig _ sFPE);
6595 else
6596 _txError (NULL, 0, NULL, "signal (%d): %s" _ sig _ sSig);
6597
6598 _txExit = true;
6599
6600 _txCleanup();
6601 }
6602
6603//-----------------------------------------------------------------------------------------------------------------
6604
6605void _txOnUnexpected()
6606 {
6607 _txError (NULL, 0, NULL,
6608 "std::unexpected(): Ðеобработанное иÑключение. Проверьте Ñвои catch-блоки. Перехватите catch (...). \n\n"
6609 "ЕÑли вы (зрÑ) иÑпользуете Ñпецификацию иÑключений Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹, проверьте, не нарушена ли она.");
6610 }
6611
6612//-----------------------------------------------------------------------------------------------------------------
6613
6614void _txOnTerminate()
6615 {
6616 _txError (NULL, 0, NULL,
6617 "std::terminate(): Программа будет завершена из-за неперехваченного иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² функции main() или в деÑтрукторе. \n\n"
6618 "ИÑпользуйте try/catch блоки, перехватывайте catch (...), разбирайтеÑÑŒ, в чем дело.");
6619 }
6620
6621//-----------------------------------------------------------------------------------------------------------------
6622
6623const char* _txError (const char file[] /*= NULL*/, int line /*= 0*/, const char func[] /*= NULL*/,
6624 const char msg [] /*= NULL*/, ...)
6625 {
6626 va_list arg; va_start (arg, msg);
6627
6628 static int nCalls = 0; nCalls++;
6629
6630 DWORD winerr = GetLastError();
6631 int crterr = errno;
6632 int doserr = _doserrno;
6633 unsigned threadId = GetCurrentThreadId();
6634
6635 bool isFatal = (msg && *msg == '\a')? (msg++, true) : false;
6636 bool fmtOnly = (msg && *msg == '\f')? (msg++, true) : false;
6637
6638 static char what[_TX_BIGBUFSIZE] = "";
6639 static char str [_TX_BIGBUFSIZE] = "";
6640 char *s = what;
6641
6642 #define SZARG_(n) sizeof (what) - 1 - (n) - (s-what) _TX_TRUNCATE
6643
6644 s += _snprintf_s (s, SZARG_(1), "TXLib Ñообщает:\n\n");
6645
6646 s += _snprintf_s (s, SZARG_(1), "Программа: %s, ", txGetModuleFileName());
6647 if (file) s += _snprintf_s (s, SZARG_(1), "файл: %s, ", file);
6648 if (line) s += _snprintf_s (s, SZARG_(1), "Ñтрока: %d, ", line);
6649 if (func) s += _snprintf_s (s, SZARG_(1), "функциÑ: %s.", func);
6650 s += _snprintf_s (s, SZARG_(1), "\n\n");
6651
6652 if (msg) s += _snprintf_s (s, SZARG_(1), "%s: ", (file || line || func)? "Сообщение" : "Ð’ÐЕЗÐПÐО"),
6653 s += _vsnprintf_s (s, SZARG_(1), msg, arg),
6654 s += _snprintf_s (s, SZARG_(1), "\n\n");
6655
6656 s += _snprintf_s (s, SZARG_(1), "#%d: %s, Instance: 0x%p, Flags: %c%c%c%c%c%c, Thread: 0x%08X%s",
6657 nCalls, _TX_VERSION, (void*) &_txInitialized,
6658 "cC"[_txConsole], "mM"[_txMain], "dD"[_txIsDll], "rR"[_txRunning], "eE"[_txExit], "tT"[_txAllowTrace],
6659 threadId,
6660 (threadId == _txMainThreadId)? " (Main)" :
6661 (threadId == _txCanvas_ThreadId)? " (Canvas)" : "");
6662
6663 if (winerr) s += _snprintf_s (s, SZARG_(0), ", GetLastError(): %lu (", winerr),
6664 s += FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
6665 NULL, winerr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
6666 s, (DWORD) (sizeof (what) - (s-what)), NULL) - 2,
6667 s -= (s[-1] == '.')? 1 : 0,
6668 s += _snprintf_s (s, SZARG_(1), ")");
6669
6670 if (crterr) s += _snprintf_s (s, SZARG_(1), ", errno: %d (%s)", crterr, (strerror_s (str, crterr), str));
6671
6672 if (doserr) s += _snprintf_s (s, SZARG_(1), ", _doserrno: %d (%s)", doserr, (strerror_s (str, doserr), str));
6673
6674 s += _snprintf_s (s, SZARG_(1), ". %s\n", std::uncaught_exception()? "std::uncaught_exception(): true." : "");
6675
6676 if (_txInTX > 0 && !(_txLine == line && file && _stricmp (_txFile, file) == 0))
6677 s += _snprintf_s (s, SZARG_(1), "From: %s (%d) %s.\n", _txFile, _txLine, _txFunc);
6678
6679 #undef SZARG_
6680 va_end (arg);
6681
6682 struct tools
6683 {
6684 static char* compressSpaces (char* dest, const char* src)
6685 {
6686 char* dst = dest;
6687
6688 for (char last = ' '; *src; src++)
6689 if (isspace ((unsigned char)(*src))) { if (last != ' ') *dst++ = last = ' '; }
6690 else *dst++ = last = *src;
6691
6692 if (dst > dest && dst[-1] == ' ') dst--;
6693 *dst++ = '\n'; *dst++ = 0;
6694
6695 return dest;
6696 }
6697
6698 static char* replace (char* dest, const char* src, char find, char repl)
6699 {
6700 size_t i = 0;
6701 for (; src[i]; i++) dest[i] = (src[i] == find)? repl : src[i];
6702 dest[i] = 0;
6703
6704 return dest;
6705 }
6706 };
6707
6708$ txOutputDebugPrintf ("%s - %s", _TX_VERSION, tools::compressSpaces (str, what));
6709
6710 if (fmtOnly) return what;
6711
6712 tools::replace (str, what, '\v', ' ');
6713 printf ("\n" "--------------------------------------------------\n"
6714 "%s"
6715 "--------------------------------------------------\n", str);
6716
6717 tools::replace (str, what, '\v', '\n');
6718 txMessageBox (str, isFatal? "Ð¤Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" : "Ошибка в программе", MB_ICONSTOP | MB_TOPMOST | MB_SYSTEMMODAL);
6719
6720 if (!isFatal) return what;
6721
6722 if (!IsDebuggerPresent()) exit (EXIT_FAILURE);
6723
6724// vvvvvvvvvvvvvvvvvv
6725 DebugBreak(); //>>> Ð’Ñ‹ в отладчике. ЕÑть ÑˆÐ°Ð½Ñ Ð¿Ð¾Ñмотреть переменные и разобратьÑÑ.
6726// ^^^^^^^^^^^^^^^^^^
6727
6728 return what; //>>> Уходите из функции пошаговой отладкой (F10/F11). Следите за Ñтеком вызовов (Alt+7).
6729 }
6730
6731//-----------------------------------------------------------------------------------------------------------------
6732
6733int txOutputDebugPrintf (const char format[], ...)
6734 {
6735 if (!format) return 0;
6736
6737 bool msgbox = (*format == '\a')? (format++, true) : false;
6738 bool print = (*format == '\f')? (format++, true) : false;
6739
6740 char str[_TX_BIGBUFSIZE] = "";
6741
6742 va_list arg; va_start (arg, format);
6743 int n = _vsnprintf_s (str, sizeof (str) - 1 _TX_TRUNCATE, format, arg);
6744 va_end (arg);
6745
6746 OutputDebugString (str);
6747
6748 if (print)
6749 fprintf (stderr, "%s", str);
6750
6751 if (msgbox)
6752 txMessageBox (str, "ОказываетÑÑ, что", MB_ICONEXCLAMATION | MB_TOPMOST);
6753
6754 return n;
6755 }
6756
6757//-----------------------------------------------------------------------------------------------------------------
6758
6759unsigned txMessageBox (const char* text, const char* header, unsigned flags /*= 0*/)
6760 {
6761 static wchar_t textW [_TX_BIGBUFSIZE * sizeof (wchar_t)] = L"[NULL text]";
6762 static wchar_t headerW [_TX_BUFSIZE * sizeof (wchar_t)] = L"[NULL header]";
6763
6764 if (text) MultiByteToWideChar (_TX_CP, 0, text, -1, textW, SIZEARR (textW)) || memset (textW, 0, sizeof (textW));
6765 if (header) MultiByteToWideChar (_TX_CP, 0, header, -1, headerW, SIZEARR (headerW)) || memset (headerW, 0, sizeof (headerW));
6766
6767 HWND wnd = _txCanvas_Window;
6768 return MessageBoxW ((wnd? wnd : Win32::GetConsoleWindow()), textW, headerW, flags | MB_SETFOREGROUND | MB_TOPMOST);
6769 }
6770
6771//-----------------------------------------------------------------------------------------------------------------
6772
6773const char* txGetModuleFileName (bool fileNameOnly /*= true*/)
6774 {
6775 static char name[MAX_PATH] = "";
6776
6777 if (!*name) GetModuleFileName (NULL, name, sizeof (name) - 1) || strcpy_s (name, "");
6778 assert (*name);
6779
6780 if (fileNameOnly) return name;
6781
6782 static char fullName[MAX_PATH] = "";
6783 strncpy_s (fullName, name, sizeof (fullName) - 1);
6784
6785 char* title = strrchr (fullName, '\\'); if (!title) title = fullName;
6786 char* ext = strrchr (fullName, '.'); if (!ext) ext = fullName + strlen (fullName);
6787
6788 size_t sz = sizeof (fullName) - (ext - fullName) - 1;
6789
6790 #if defined (_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES) && _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES
6791 strncpy_s (ext, sz, " - TXLib", sz);
6792 #else
6793 strncpy (ext, " - TXLib", sz);
6794 #endif
6795
6796 return title + 1;
6797 }
6798
6799//-----------------------------------------------------------------------------------------------------------------
6800
6801bool txNotifyIcon (unsigned flags, const char title[], const char format[], ...)
6802 {
6803$1 _TX_IF_ARGUMENT_FAILED (format) return false;
6804
6805$ va_list arg; va_start (arg, format);
6806$ bool ok = true;
6807
6808 #if defined (_WIN32_IE) && (_WIN32_IE >= 0x0500)
6809
6810$ NOTIFYICONDATA nid = { sizeof (nid) };
6811
6812$ nid.uFlags = NIF_ICON | NIF_TIP | NIF_INFO;
6813$ nid.hWnd = NULL;
6814$ nid.uID = 1;
6815$ nid.hIcon = _txCreateTXIcon (16); assert (nid.hIcon);
6816$ strncpy_s (nid.szTip, "TXLib Information", sizeof (nid.szTip));
6817$ strncpy_s (nid.szInfoTitle, (title? title : "TXLib Ñообщает"), sizeof (nid.szInfoTitle) - 1);
6818$ _vsnprintf_s (nid.szInfo, sizeof (nid.szInfo) _TX_TRUNCATE, format, arg);
6819$ nid.dwInfoFlags = flags;
6820
6821$ txOutputDebugPrintf (_TX_VERSION " - Icon notification: %s: %s\n", nid.szInfoTitle, nid.szInfo);
6822
6823$ ok &= !!Shell_NotifyIcon (NIM_ADD, (::NOTIFYICONDATA*) &nid);
6824$ ok &= !!Shell_NotifyIcon (NIM_MODIFY, (::NOTIFYICONDATA*) &nid);
6825
6826$ if (nid.hIcon) DestroyIcon (nid.hIcon) asserted;
6827
6828 #else
6829
6830$ char nid_szInfo[_TX_BUFSIZE] = "";
6831$ _vsnprintf_s (nid_szInfo, sizeof (nid_szInfo) _TX_TRUNCATE, format, arg);
6832$ txOutputDebugPrintf (_TX_VERSION " - Icon notification (NOT displayed): %s: %s\n", title, nid_szInfo);
6833$ ok = false;
6834
6835$ (void)flags; (void)title;
6836
6837 #endif
6838
6839$ va_end (arg);
6840$ return ok;
6841 }
6842
6843//! @}
6844//}
6845//=================================================================================================================
6846
6847//=================================================================================================================
6848//{ TXLib API implementation
6849// Ð ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ TXLib API
6850//=================================================================================================================
6851
6852inline const char* txVersion()
6853 {
6854 return _TX_VERSION;
6855 }
6856
6857//-----------------------------------------------------------------------------------------------------------------
6858
6859inline unsigned txVersionNumber()
6860 {
6861 return _TX_VER;
6862 }
6863
6864//-----------------------------------------------------------------------------------------------------------------
6865
6866POINT txGetExtent()
6867 {
6868$1 _TX_IF_TXWINDOW_FAILED return ZERO (POINT);
6869
6870$ RECT r = {0};
6871$ GetClientRect (txWindow(), &r);
6872
6873$ POINT size = { r.right - r.left, r.bottom - r.top };
6874$ return size;
6875 }
6876
6877//-----------------------------------------------------------------------------------------------------------------
6878
6879int txGetExtentX()
6880 {
6881$1 return txGetExtent().x;
6882 }
6883
6884//-----------------------------------------------------------------------------------------------------------------
6885
6886int txGetExtentY()
6887 {
6888$1 return txGetExtent().y;
6889 }
6890
6891//-----------------------------------------------------------------------------------------------------------------
6892
6893inline HDC& txDC()
6894 {
6895$1 return _txCanvas_BackBuf[0];
6896 }
6897
6898//-----------------------------------------------------------------------------------------------------------------
6899
6900inline HWND txWindow()
6901 {
6902$1 return _txCanvas_Window;
6903 }
6904
6905//-----------------------------------------------------------------------------------------------------------------
6906
6907bool txDestroyWindow()
6908 {
6909$1 if (!txWindow()) return false;
6910
6911$ if (SendNotifyMessage (txWindow(), (_txMain? WM_CLOSE : WM_DESTROY), 0, 0) == 0) return false;
6912
6913$ if (_txMain)
6914 {
6915$ txNotifyIcon (NIIF_WARNING, NULL, "\n" "Очень, очень плохо завершать программу через txDestroyWindow(). \n\n"
6916 "ВозвращайтеÑÑŒ через main(), там вам будут рады.\n");
6917$ Sleep (_TX_TIMEOUT);
6918 }
6919
6920$ _txWaitFor (!_txCanvas_Window, _TX_TIMEOUT);
6921
6922$ return _txCanvas_Window == NULL;
6923 }
6924
6925//-----------------------------------------------------------------------------------------------------------------
6926
6927bool txSetColor (COLORREF color, double thickness /*= 1*/)
6928 {
6929$1 _TX_IF_TXWINDOW_FAILED return false;
6930
6931$ return _txBuffer_Select (Win32::CreatePen ((color == TX_TRANSPARENT? PS_NULL : PS_SOLID), ROUND (thickness), color))
6932 &&
6933 txGDI ((Win32::SetTextColor (txDC(), color)));
6934 }
6935
6936//-----------------------------------------------------------------------------------------------------------------
6937
6938bool txColor (double red, double green, double blue)
6939 {
6940$1 if (red > 1) red = 1; if (red < 0) red = 0;
6941$ if (green > 1) green = 1; if (green < 0) green = 0;
6942$ if (blue > 1) blue = 1; if (blue < 0) blue = 0;
6943
6944$ return txSetColor (RGB (ROUND (red * 255), ROUND (green * 255), ROUND (blue * 255)));
6945 }
6946
6947//-----------------------------------------------------------------------------------------------------------------
6948
6949COLORREF txGetColor()
6950 {
6951$1 _TX_IF_TXWINDOW_FAILED return CLR_INVALID;
6952
6953$ HGDIOBJ obj = txGDI ((Win32::GetCurrentObject (txDC(), OBJ_PEN)));
6954$ assert (obj); if (!obj) return CLR_INVALID;
6955
6956$ union { EXTLOGPEN extLogPen; LOGPEN LogPen; } buf = {{0}};
6957
6958$ int size = Win32::GetObject (obj, 0, NULL);
6959$ Win32::GetObject (obj, sizeof (buf), &buf) asserted;
6960
6961$ return (size == sizeof (LOGPEN))? buf.LogPen.lopnColor : buf.extLogPen.elpColor;
6962 }
6963
6964//-----------------------------------------------------------------------------------------------------------------
6965
6966bool txSetFillColor (COLORREF color)
6967 {
6968$1 _TX_IF_TXWINDOW_FAILED return false;
6969
6970$ return _txBuffer_Select ((color == TX_TRANSPARENT)? Win32::GetStockObject (HOLLOW_BRUSH) :
6971 Win32::CreateSolidBrush (color));
6972 }
6973
6974//-----------------------------------------------------------------------------------------------------------------
6975
6976bool txFillColor (double red, double green, double blue)
6977 {
6978$1 if (red > 1) red = 1; if (red < 0) red = 0;
6979$ if (green > 1) green = 1; if (green < 0) green = 0;
6980$ if (blue > 1) blue = 1; if (blue < 0) blue = 0;
6981
6982$ return txSetFillColor (RGB (ROUND (red * 255), ROUND (green * 255), ROUND (blue * 255)));
6983 }
6984
6985//-----------------------------------------------------------------------------------------------------------------
6986
6987COLORREF txGetFillColor()
6988 {
6989$1 _TX_IF_TXWINDOW_FAILED return CLR_INVALID;
6990
6991$ HGDIOBJ obj = txGDI ((Win32::GetCurrentObject (txDC(), OBJ_BRUSH)));
6992$ assert (obj); if (!obj) return CLR_INVALID;
6993
6994$ LOGBRUSH buf = {0};
6995$ txGDI ((Win32::GetObject (obj, sizeof (buf), &buf))) asserted;
6996
6997$ return buf.lbColor;
6998 }
6999
7000//-----------------------------------------------------------------------------------------------------------------
7001
7002bool txSetROP2 (int mode /*= R2_COPYPEN*/)
7003 {
7004$1 _TX_IF_TXWINDOW_FAILED return false;
7005
7006$ return txGDI (!!(Win32::SetROP2 (txDC(), mode)));
7007 }
7008
7009//-----------------------------------------------------------------------------------------------------------------
7010
7011bool txClear()
7012 {
7013$1 _TX_IF_TXWINDOW_FAILED return false;
7014
7015$ POINT size = txGetExtent();
7016$ return txGDI (!!(Win32::PatBlt (txDC(), 0, 0, size.x, size.y, PATCOPY)));
7017 }
7018
7019//-----------------------------------------------------------------------------------------------------------------
7020
7021inline bool txSetPixel (double x, double y, COLORREF color)
7022 {
7023$1 _TX_IF_TXWINDOW_FAILED return false;
7024
7025$ txGDI ((Win32::SetPixel (txDC(), ROUND (x), ROUND (y), color)));
7026
7027$ return true;
7028 }
7029
7030//-----------------------------------------------------------------------------------------------------------------
7031
7032inline bool txPixel (double x, double y, double red, double green, double blue)
7033 {
7034$1 if (red > 1) red = 1; if (red < 0) red = 0;
7035$ if (green > 1) green = 1; if (green < 0) green = 0;
7036$ if (blue > 1) blue = 1; if (blue < 0) blue = 0;
7037
7038$ return txSetPixel (x, y, RGB (ROUND (red * 255), ROUND (green * 255), ROUND (blue * 255)));
7039 }
7040
7041//-----------------------------------------------------------------------------------------------------------------
7042
7043inline COLORREF txGetPixel (double x, double y)
7044 {
7045$1 _TX_IF_TXWINDOW_FAILED return CLR_INVALID;
7046
7047$ return txGDI ((Win32::GetPixel (txDC(), ROUND (x), ROUND (y))));
7048 }
7049
7050//-----------------------------------------------------------------------------------------------------------------
7051
7052bool txLine (double x0, double y0, double x1, double y1)
7053 {
7054$1 _TX_IF_TXWINDOW_FAILED return false;
7055
7056$ txGDI ((Win32::MoveToEx (txDC(), ROUND (x0), ROUND (y0), NULL))) asserted;
7057$ txGDI ((Win32::LineTo (txDC(), ROUND (x1), ROUND (y1) ))) asserted;
7058
7059$ return true;
7060 }
7061
7062//-----------------------------------------------------------------------------------------------------------------
7063
7064bool txRectangle (double x0, double y0, double x1, double y1)
7065 {
7066$1 _TX_IF_TXWINDOW_FAILED return false;
7067
7068$ txGDI ((Win32::Rectangle (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1)))) asserted;
7069
7070$ return true;
7071 }
7072
7073//-----------------------------------------------------------------------------------------------------------------
7074
7075bool txPolygon (const POINT points[], int numPoints)
7076 {
7077$1 _TX_IF_TXWINDOW_FAILED return false;
7078$ _TX_IF_ARGUMENT_FAILED (points) return false;
7079
7080$ return txGDI (!!(Win32::Polygon (txDC(), points, numPoints)));
7081 }
7082
7083//-----------------------------------------------------------------------------------------------------------------
7084
7085bool txEllipse (double x0, double y0, double x1, double y1)
7086 {
7087$1 _TX_IF_TXWINDOW_FAILED return false;
7088
7089$ txGDI ((Win32::Ellipse (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1)))) asserted;
7090
7091$ return true;
7092 }
7093
7094//-----------------------------------------------------------------------------------------------------------------
7095
7096bool txCircle (double x, double y, double r)
7097 {
7098$1 return txEllipse (x-r, y-r, x+r, y+r);
7099 }
7100
7101//-----------------------------------------------------------------------------------------------------------------
7102
7103bool txArc (double x0, double y0, double x1, double y1, double startAngle, double totalAngle)
7104 {
7105$1 _TX_IF_TXWINDOW_FAILED return false;
7106
7107$ POINT center = { ROUND ((x0 + x1) /2), ROUND ((y0 + y1) /2) };
7108
7109$ double start = startAngle * txPI/180,
7110 end = (startAngle + totalAngle) * txPI/180;
7111
7112$ return txGDI (!!(Win32::Arc (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1),
7113 ROUND (center.x + 1E3*cos (start)), ROUND (center.y - 1E3*sin (start)),
7114 ROUND (center.x + 1E3*cos (end)), ROUND (center.y - 1E3*sin (end)))));
7115 }
7116
7117//-----------------------------------------------------------------------------------------------------------------
7118
7119bool txPie (double x0, double y0, double x1, double y1, double startAngle, double totalAngle)
7120 {
7121$1 _TX_IF_TXWINDOW_FAILED return false;
7122
7123$ POINT center = { ROUND ((x0 + x1) /2), ROUND ((y0 + y1) /2) };
7124
7125$ double start = startAngle * txPI/180,
7126 end = (startAngle + totalAngle) * txPI/180;
7127
7128$ return txGDI (!!(Win32::Pie (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1),
7129 ROUND (center.x + 1E3*cos (start)), ROUND (center.y - 1E3*sin (start)),
7130 ROUND (center.x + 1E3*cos (end)), ROUND (center.y - 1E3*sin (end)))));
7131 }
7132
7133//-----------------------------------------------------------------------------------------------------------------
7134
7135bool txChord (double x0, double y0, double x1, double y1, double startAngle, double totalAngle)
7136 {
7137$1 _TX_IF_TXWINDOW_FAILED return false;
7138
7139$ POINT center = { ROUND ((x0 + x1) /2), ROUND ((y0 + y1) /2) };
7140
7141$ double start = startAngle * txPI/180,
7142 end = (startAngle + totalAngle) * txPI/180;
7143
7144$ return txGDI (!!(Win32::Chord (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1),
7145 ROUND (center.x + 1E3*cos (start)), ROUND (center.y - 1E3*sin (start)),
7146 ROUND (center.x + 1E3*cos (end)), ROUND (center.y - 1E3*sin (end)))));
7147 }
7148
7149//-----------------------------------------------------------------------------------------------------------------
7150
7151bool txFloodFill (double x, double y,
7152 COLORREF color /*= TX_TRANSPARENT*/, DWORD mode /*= FLOODFILLSURFACE*/)
7153 {
7154$1 _TX_IF_TXWINDOW_FAILED return false;
7155
7156$ if (color == TX_TRANSPARENT) color = txGetPixel (x, y);
7157
7158$ return txGDI (!!(Win32::ExtFloodFill (txDC(), ROUND (x), ROUND (y), color, mode)));
7159 }
7160
7161//-----------------------------------------------------------------------------------------------------------------
7162
7163bool txTextOut (double x, double y, const char text[])
7164 {
7165$1 _TX_IF_TXWINDOW_FAILED return false;
7166$ _TX_IF_ARGUMENT_FAILED (text) return false;
7167
7168$ int len = (int) strlen (text);
7169$ txGDI (!!(Win32::TextOut (txDC(), ROUND (x), ROUND (y), text, len))) asserted;
7170
7171$ SIZE size = {0};
7172$ txGDI ((Win32::GetTextExtentPoint32 (txDC(), text, len, &size))) asserted;
7173
7174$ RECT r = { ROUND (x), ROUND (y), ROUND (x + size.cx), ROUND (y + size.cy) };
7175$ InvalidateRect (txWindow(), &r, false) asserted;
7176
7177$ return true;
7178 }
7179
7180//-----------------------------------------------------------------------------------------------------------------
7181
7182bool txDrawText (double x0, double y0, double x1, double y1, const char text[],
7183 unsigned format /*= DT_CENTER | DT_VCENTER | DT_WORDBREAK | DT_WORD_ELLIPSIS*/)
7184{
7185$1 _TX_IF_TXWINDOW_FAILED return false;
7186$ _TX_IF_ARGUMENT_FAILED (text) return false;
7187
7188$ RECT r = { ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1) };
7189
7190$ if (!strchr (text, '\n')) format |= DT_SINGLELINE;
7191
7192$ unsigned prev = txSetTextAlign (TA_LEFT | TA_TOP | TA_NOUPDATECP);
7193
7194 if (Win32::DrawText) { $ txGDI ((Win32::DrawText (txDC(), text, -1, &r, format))) asserted; }
7195
7196$ txSetTextAlign (prev);
7197
7198$ return true;
7199}
7200
7201//-----------------------------------------------------------------------------------------------------------------
7202
7203bool txSelectFont (const char name[], double sizeY,
7204 double sizeX /*= -1*/,
7205 int bold /*= FW_DONTCARE*/,
7206 bool italic /*= false*/,
7207 bool underline /*= false*/,
7208 bool strikeout /*= false*/,
7209 double angle /*= 0*/)
7210 {
7211$1 _TX_IF_TXWINDOW_FAILED return false;
7212$ _TX_IF_ARGUMENT_FAILED (name) return false;
7213
7214$ _txBuffer_Select (txFontExist (name)?
7215 Win32::CreateFont (ROUND (sizeY), ROUND ((sizeX >= 0)? sizeX : sizeY/3),
7216 ROUND (angle*10), 0, bold, italic, underline, strikeout,
7217 RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
7218 DEFAULT_QUALITY, FIXED_PITCH, name)
7219 :
7220 Win32::GetStockObject (SYSTEM_FIXED_FONT));
7221$ return true;
7222 }
7223
7224//-----------------------------------------------------------------------------------------------------------------
7225
7226SIZE txGetTextExtent (const char text[])
7227 {
7228$1 SIZE size = {0};
7229
7230$ _TX_IF_TXWINDOW_FAILED return size;
7231$ _TX_IF_ARGUMENT_FAILED (text) return size;
7232
7233$ txGDI ((Win32::GetTextExtentPoint32 (txDC(), text, (int) strlen (text), &size))) asserted;
7234
7235$ return size;
7236 }
7237
7238//-----------------------------------------------------------------------------------------------------------------
7239
7240int txGetTextExtentX (const char text[])
7241 {
7242$1 return txGetTextExtent (text) .cx;
7243 }
7244
7245//-----------------------------------------------------------------------------------------------------------------
7246
7247int txGetTextExtentY (const char text[])
7248 {
7249$1 return txGetTextExtent (text) .cy;
7250 }
7251
7252//-----------------------------------------------------------------------------------------------------------------
7253
7254unsigned txSetTextAlign (unsigned align /*= TA_CENTER | TA_BASELINE*/)
7255 {
7256$1 _TX_IF_TXWINDOW_FAILED return 0;
7257
7258$ return txGDI ((Win32::SetTextAlign (txDC(), align)));
7259 }
7260
7261//-----------------------------------------------------------------------------------------------------------------
7262
7263LOGFONT* txFontExist (const char name[])
7264 {
7265$1 _TX_IF_TXWINDOW_FAILED return NULL;
7266$ _TX_IF_ARGUMENT_FAILED (name) return NULL;
7267
7268$ static LOGFONT font = {0};
7269$ font.lfCharSet = DEFAULT_CHARSET;
7270$ strncpy_s (font.lfFaceName, name, sizeof (font.lfFaceName) - 1);
7271
7272$ struct tools
7273 {
7274 static int CALLBACK enumFonts (const LOGFONT* fnt, const TEXTMETRIC*, DWORD, LPARAM data)
7275 {
7276$ _TX_IF_ARGUMENT_FAILED (fnt) return 0;
7277$ _TX_IF_ARGUMENT_FAILED (data) return 0;
7278
7279 #ifndef __STRICT_ANSI__
7280$ return _strnicmp (fnt->lfFaceName, ((LOGFONT*)data)->lfFaceName, LF_FACESIZE);
7281
7282 #else
7283$ return strncmp (fnt->lfFaceName, ((LOGFONT*)data)->lfFaceName, LF_FACESIZE);
7284
7285 #endif
7286 }
7287 };
7288
7289$ return txGDI ((Win32::EnumFontFamiliesEx (txDC(), &font, tools::enumFonts, (LPARAM) &font, 0))) == 0? &font : NULL;
7290 }
7291
7292//-----------------------------------------------------------------------------------------------------------------
7293
7294bool txSelectObject (HGDIOBJ obj)
7295 {
7296$1 _TX_IF_TXWINDOW_FAILED return false;
7297$ _TX_IF_ARGUMENT_FAILED (obj) return false;
7298
7299$ return _txBuffer_Select (obj);
7300 }
7301
7302//-----------------------------------------------------------------------------------------------------------------
7303
7304HDC txCreateCompatibleDC (double sizeX, double sizeY, HBITMAP bitmap /*= NULL*/)
7305 {
7306$1 _TX_IF_TXWINDOW_FAILED return NULL;
7307
7308$ POINT size = { ROUND (sizeX), ROUND (sizeY) };
7309$ HDC dc = _txBuffer_Create (txWindow(), &size, bitmap);
7310$ assert (dc); if (!dc) return NULL;
7311
7312$ if (!_txCanvas_UserDCs) return dc;
7313
7314$ txAutoLock _lock;
7315$ _txCanvas_UserDCs->push_back (dc);
7316
7317$ if (_txCanvas_UserDCs->size() >= _TX_BUFSIZE)
7318 { $ txNotifyIcon (NIIF_WARNING, NULL, "Ð’Ñ‹ загрузили уже %d HDC, ÑиÑтеме может Ñтать плохо.", (int) _txCanvas_UserDCs->size()); }
7319
7320$ return dc;
7321 }
7322
7323//-----------------------------------------------------------------------------------------------------------------
7324
7325HDC txLoadImage (const char filename[], unsigned imageFlags /*= IMAGE_BITMAP*/, unsigned loadFlags /*= LR_LOADFROMFILE*/)
7326 {
7327$1 _TX_IF_TXWINDOW_FAILED return NULL;
7328$ _TX_IF_ARGUMENT_FAILED (filename && *filename) return NULL;
7329
7330$ HBITMAP image = (HBITMAP) Win32::LoadImage ((loadFlags & LR_LOADFROMFILE)? NULL : GetModuleHandle (NULL),
7331 filename, imageFlags, 0, 0, loadFlags);
7332$ if (!image) return NULL;
7333
7334$ HDC dc = txCreateCompatibleDC (0, 0, image);
7335
7336$ if (!(loadFlags & LR_LOADFROMFILE)) return dc;
7337
7338$ static std::map <std::string, unsigned> loadTimes;
7339$ std::string file = filename;
7340$ unsigned time = GetTickCount();
7341
7342$ if ((long) (time - loadTimes [file]) < _TX_TIMEOUT)
7343 { $ txNotifyIcon (NIIF_WARNING, NULL, "Ð’Ñ‹ загружаете \"%s\" Ñлишком чаÑто, программа будет тормозить.", filename); }
7344
7345$ loadTimes [file] = time;
7346
7347$ return dc;
7348 }
7349
7350//-----------------------------------------------------------------------------------------------------------------
7351
7352bool txDeleteDC (HDC* pdc)
7353 {
7354$1 _TX_IF_TXWINDOW_FAILED return false;
7355$ _TX_IF_ARGUMENT_FAILED (pdc) return false;
7356
7357$ HDC dc = *pdc;
7358$ bool ok = _txBuffer_Delete (pdc);
7359$ if (!ok) return false;
7360
7361$ if (!_txCanvas_UserDCs) return ok;
7362
7363$ txAutoLock _lock;
7364$ std::vector <HDC> ::iterator i = std::find (_txCanvas_UserDCs->begin(), _txCanvas_UserDCs->end(), dc);
7365$ if (i != _txCanvas_UserDCs->end()) { std::swap (*i, _txCanvas_UserDCs->back()); _txCanvas_UserDCs->pop_back(); }
7366
7367$ return ok;
7368 }
7369
7370//-----------------------------------------------------------------------------------------------------------------
7371
7372bool txDeleteDC (HDC dc)
7373 {
7374$1 _TX_IF_TXWINDOW_FAILED return false;
7375
7376$ return txDeleteDC (&dc);
7377 }
7378
7379//-----------------------------------------------------------------------------------------------------------------
7380
7381bool txBitBlt (HDC dest, double xDest, double yDest, double width, double height,
7382 HDC src, double xSrc /*= 0*/, double ySrc /*= 0*/, DWORD rOp /*= SRCCOPY*/)
7383 {
7384$1 _TX_IF_TXWINDOW_FAILED return false;
7385$ _TX_IF_ARGUMENT_FAILED (dest) return false;
7386$ _TX_IF_ARGUMENT_FAILED (src) return false;
7387
7388$ return txGDI (!!(Win32::BitBlt (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height),
7389 src, ROUND (xSrc), ROUND (ySrc), rOp)));
7390 }
7391
7392//-----------------------------------------------------------------------------------------------------------------
7393
7394bool txTransparentBlt (HDC dest, double xDest, double yDest, double width, double height,
7395 HDC src, double xSrc /*= 0*/, double ySrc /*= 0*/, COLORREF transColor /*= TX_BLACK*/)
7396 {
7397$1 _TX_IF_TXWINDOW_FAILED return false;
7398$ _TX_IF_ARGUMENT_FAILED (dest) return false;
7399$ _TX_IF_ARGUMENT_FAILED (src) return false;
7400
7401$ return (Win32::TransparentBlt)?
7402 txGDI (!!(Win32::TransparentBlt (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height),
7403 src, ROUND (xSrc), ROUND (ySrc), ROUND (width), ROUND (height), transColor)))
7404 :
7405 txGDI (!!(Win32::BitBlt (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height),
7406 src, ROUND (xSrc), ROUND (ySrc), SRCCOPY))), false;
7407 }
7408
7409//-----------------------------------------------------------------------------------------------------------------
7410
7411bool txAlphaBlend (HDC dest, double xDest, double yDest, double width, double height,
7412 HDC src, double xSrc /*= 0*/, double ySrc /*= 0*/, double alpha /*= 1.0*/)
7413 {
7414$1 _TX_IF_TXWINDOW_FAILED return false;
7415$ _TX_IF_ARGUMENT_FAILED (dest) return false;
7416$ _TX_IF_ARGUMENT_FAILED (src) return false;
7417
7418$ if (alpha < 0) alpha = 0;
7419$ if (alpha > 1) alpha = 1;
7420
7421$ BLENDFUNCTION blend = { AC_SRC_OVER, 0, (BYTE) ROUND (alpha * 255), AC_SRC_ALPHA };
7422
7423$ return (Win32::AlphaBlend)?
7424 txGDI (!!(Win32::AlphaBlend (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height),
7425 src, ROUND (xSrc), ROUND (ySrc), ROUND (width), ROUND (height), blend)))
7426 :
7427 txGDI (!!(Win32::BitBlt (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height),
7428 src, ROUND (xSrc), ROUND (ySrc), SRCCOPY))), false;
7429 }
7430
7431//-----------------------------------------------------------------------------------------------------------------
7432
7433inline int txUpdateWindow (int update /*= true*/)
7434 {
7435$1 return _txCanvas_SetRefreshLock (update >= 0? !update : -update);
7436 }
7437
7438//-----------------------------------------------------------------------------------------------------------------
7439
7440inline int txBegin()
7441 {
7442$1 _txCanvas_SetRefreshLock (_txCanvas_RefreshLock + 1);
7443
7444$ return _txCanvas_RefreshLock;
7445 }
7446
7447//-----------------------------------------------------------------------------------------------------------------
7448
7449inline int txEnd()
7450 {
7451$1 _txCanvas_SetRefreshLock (_txCanvas_RefreshLock - 1);
7452
7453$ return _txCanvas_RefreshLock;
7454 }
7455
7456//-----------------------------------------------------------------------------------------------------------------
7457
7458double txSleep (double time)
7459 {
7460$1 LARGE_INTEGER start = {{0}};
7461$ QueryPerformanceCounter (&start) asserted;
7462
7463$ LARGE_INTEGER freq = {{0}};
7464$ QueryPerformanceFrequency (&freq) asserted;
7465
7466$ int lock = _txCanvas_RefreshLock;
7467$ _txCanvas_RefreshLock = 0;
7468
7469$ HWND wnd = txWindow();
7470 if (wnd) { $ RedrawWindow (wnd, NULL, NULL, RDW_INVALIDATE | RDW_INTERNALPAINT | RDW_UPDATENOW) asserted; }
7471
7472$ Sleep (ROUND (time));
7473
7474$ _txCanvas_RefreshLock = lock;
7475
7476$ LARGE_INTEGER stop = {{0}};
7477$ QueryPerformanceCounter (&stop) asserted;
7478
7479$ return 1000.0 * (double) (stop.QuadPart - start.QuadPart) / (double) freq.QuadPart;
7480 }
7481
7482//-----------------------------------------------------------------------------------------------------------------
7483
7484bool txLock (bool wait /*= true*/)
7485 {
7486$1 if (_txCanvas_RefreshLock <= 0 || _txExit) Sleep (0);
7487
7488$ if (wait) { $ return EnterCriticalSection (&_txCanvas_LockBackBuf), true; }
7489 else { $ return !!TryEnterCriticalSection (&_txCanvas_LockBackBuf); }
7490 }
7491
7492//-----------------------------------------------------------------------------------------------------------------
7493
7494bool txUnlock()
7495 {
7496$1 LeaveCriticalSection (&_txCanvas_LockBackBuf);
7497
7498$ if (_txCanvas_RefreshLock <= 0 || _txExit) Sleep (0);
7499$ return false;
7500 }
7501
7502//-----------------------------------------------------------------------------------------------------------------
7503
7504template <typename T>
7505inline T txUnlock (T value)
7506 {
7507$1 txUnlock();
7508$ return value;
7509 }
7510
7511//-----------------------------------------------------------------------------------------------------------------
7512
7513inline POINT txMousePos()
7514 {
7515$1 _TX_IF_TXWINDOW_FAILED return ZERO (POINT);
7516
7517$ return _txMousePos;
7518 }
7519
7520//-----------------------------------------------------------------------------------------------------------------
7521
7522inline int txMouseX()
7523 {
7524$1 return _txMousePos.x;
7525 }
7526
7527//-----------------------------------------------------------------------------------------------------------------
7528
7529inline int txMouseY()
7530 {
7531$1 return _txMousePos.y;
7532 }
7533
7534//-----------------------------------------------------------------------------------------------------------------
7535
7536inline int txMouseButtons()
7537 {
7538$1 _TX_IF_TXWINDOW_FAILED return 0;
7539
7540$ return _txMouseButtons;
7541 }
7542
7543//-----------------------------------------------------------------------------------------------------------------
7544
7545bool txSetConsoleAttr (unsigned color /*= 0x07*/)
7546 {
7547$1 return !!SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), (WORD) color);
7548 }
7549
7550//-----------------------------------------------------------------------------------------------------------------
7551
7552unsigned txGetConsoleAttr()
7553 {
7554$1 CONSOLE_SCREEN_BUFFER_INFO con = {{0}};
7555$ GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &con);
7556
7557$ return con.wAttributes;
7558 }
7559
7560//-----------------------------------------------------------------------------------------------------------------
7561
7562POINT txSetConsoleCursorPos (double x, double y)
7563 {
7564$1 POINT fontSz = txGetConsoleFontSize();
7565
7566$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}};
7567$ GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &con) asserted;
7568
7569$ COORD pos = { (short) ROUND (1.0 * x / fontSz.x + con.srWindow.Left),
7570 (short) ROUND (1.0 * y / fontSz.y + con.srWindow.Top ) };
7571
7572$ SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), pos) asserted;
7573
7574$ POINT prev = { ROUND (1.0 * (con.dwCursorPosition.X - con.srWindow.Left) / fontSz.x),
7575 ROUND (1.0 * (con.dwCursorPosition.Y - con.srWindow.Top ) / fontSz.y) };
7576$ return prev;
7577 }
7578
7579//-----------------------------------------------------------------------------------------------------------------
7580
7581POINT txGetConsoleCursorPos()
7582 {
7583$1 POINT fontSz = txGetConsoleFontSize();
7584
7585$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}};
7586$ GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &con) asserted;
7587
7588$ POINT pos = { ROUND (1.0 * (con.dwCursorPosition.X - con.srWindow.Left) / fontSz.x),
7589 ROUND (1.0 * (con.dwCursorPosition.Y - con.srWindow.Top ) / fontSz.y) };
7590$ return pos;
7591 }
7592
7593//-----------------------------------------------------------------------------------------------------------------
7594
7595bool txClearConsole()
7596 {
7597$1 HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE);
7598
7599$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}};
7600$ GetConsoleScreenBufferInfo (out, &con) asserted;
7601
7602$ COORD start = {con.srWindow.Left, con.srWindow.Top};
7603
7604$ DWORD len = (con.srWindow.Right - con.srWindow.Left + 1) *
7605 (con.srWindow.Bottom - con.srWindow.Top + 1);
7606
7607$ DWORD written = 0;
7608$ FillConsoleOutputCharacter (out, 0x20 /*' '*/, len, start, &written) asserted;
7609$ FillConsoleOutputAttribute (out, con.wAttributes, len, start, &written) asserted;
7610
7611$ SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), start) asserted;
7612
7613$ return written == len;
7614 }
7615
7616//-----------------------------------------------------------------------------------------------------------------
7617
7618POINT txGetConsoleFontSize()
7619 {
7620$1 CONSOLE_FONT_INFO font = {0, {8, 16}};
7621
7622$ if (Win32::GetCurrentConsoleFont)
7623 { $ Win32::GetCurrentConsoleFont (GetStdHandle (STD_OUTPUT_HANDLE), false, &font) asserted; }
7624
7625$ SIZE size = { font.dwFontSize.X, font.dwFontSize.Y };
7626$ txGDI (Win32::GetTextExtentPoint32 (_txCanvas_BackBuf[1], "W", 1, &size));
7627
7628$ POINT sizeFont = { size.cx, size.cy };
7629$ return sizeFont;
7630 }
7631
7632//-----------------------------------------------------------------------------------------------------------------
7633
7634bool txTextCursor (bool blink /*= true*/)
7635 {
7636$1 bool old = _txConsole_IsBlinking;
7637
7638$ _txConsole_IsBlinking = blink;
7639
7640$ return old;
7641 }
7642
7643//-----------------------------------------------------------------------------------------------------------------
7644
7645bool txPlaySound (const char filename[] /*= NULL*/, DWORD mode /*= SND_ASYNC*/)
7646 {
7647$1 _TX_IF_ARGUMENT_FAILED (!(filename && !*filename)) return false;
7648
7649$ mode |= SND_FILENAME | SND_NODEFAULT | SND_NOWAIT;
7650$ if (mode & SND_LOOP) mode = (mode & ~SND_SYNC) | SND_ASYNC;
7651
7652$ if (!filename) mode = SND_PURGE;
7653
7654$ return !!Win32::PlaySound (filename, NULL, mode);
7655 }
7656
7657//-----------------------------------------------------------------------------------------------------------------
7658
7659// +--<<< Ðто врÑд ли имеет отношение к тому, что вы ищете :)
7660// V Полезно Ñмотреть не только вверх, но и вниз
7661
7662WNDPROC txSetWindowsHook (WNDPROC wndProc /*= NULL*/)
7663 {
7664$1 WNDPROC old = _txAltWndProc; _txAltWndProc = wndProc;
7665$ return old;
7666 }
7667
7668//-----------------------------------------------------------------------------------------------------------------
7669
7670// +--<<< Ð Ñто, наконец, иÑкомое определение Ñтой функции.
7671// | Смотрите по Ñторонам! ÐÑƒÐ¶Ð½Ð°Ñ Ð²Ð°Ð¼ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð³Ð´Ðµ-то Ñ€Ñдом.
7672// |
7673// v
7674bool txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture()
7675 {
7676$1 txMessageBox ("Ðто Ð·Ð°Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°. Такое бывает. Ð’Ñ‹ хотели вызвать:\n\n"
7677
7678 "txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture()\n\n"
7679
7680 "Хоть вы долго [копировали]набирали Ñто имÑ, на Ñамом деле Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ðµ реализована. "
7681 "ЕÑть Ð´Ñ€ÑƒÐ³Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑƒÐ±Ð¸Ñ€Ð°ÐµÑ‚ авто-паузу в конце программы, но в хелпе про нее не напиÑано.\n\n"
7682
7683 "Ðо не вÑе так плохо. Определение нужной функции еÑть в иÑходных текÑтах TXLib.h, оно лежит Ñ€Ñдом "
7684 "Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ той функции Ñ Ð´Ð»Ð¸Ð½Ð½Ñ‹Ð¼ названием, которую вы ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹Ð·Ð²Ð°Ð»Ð¸.\n\n"
7685
7686 "Ðажмите в редакторе Ctrl+O, найдите и откройте файл TXLib.h (он лежит в папке, куда вы "
7687 "уÑтановили TXLib), затем нажмите Ctrl+F и ищите \"txIDontWant\". Удачи!\n\n",
7688
7689 "Ðе получилоÑÑŒ", MB_ICONSTOP);
7690
7691 // The truth is out there... (C++files)
7692
7693$ return false;
7694 }
7695
7696//-----------------------------------------------------------------------------------------------------------------
7697
7698// Bingo! Now you are learned to use the Sources, Luke. And may the Source be with you.
7699
7700inline bool txDisableAutoPause()
7701 {
7702$1 _txExit = true;
7703$ return true;
7704 }
7705
7706//-----------------------------------------------------------------------------------------------------------------
7707
7708void txDrawMan (int x, int y, int sizeX, int sizeY, COLORREF color, double handL, double handR, double twist,
7709 double head, double eyes, double wink, double crazy, double smile, double hair, double wind)
7710 {
7711$1 const char msg[] = "\0/Ð Ñ - человечек из библиотеки!\0/ÐœÐµÐ½Ñ Ð¾Ð±ÑŠÑÑнÑли на уроке!\0/Ðапиши Ð¼ÐµÐ½Ñ Ñам!\0/";
7712 static unsigned count = GetTickCount(), L = 0;
7713
7714$ COLORREF lineColor = txGetColor();
7715 COLORREF fillColor = txGetFillColor();
7716
7717$ txSetColor (TX_DARKGRAY);
7718 txSetFillColor (TX_TRANSPARENT);
7719
7720$ txRectangle (x - sizeX/2, y - sizeY, x + sizeX/2, y);
7721 txCircle (x, y, 4);
7722
7723$ txSetColor (color);
7724 txSetFillColor (color);
7725
7726$ txLine (x + twist * sizeX, y - 0.35 * sizeY, x, y - 0.7 * sizeY);
7727
7728$ txLine (x, y - 0.7 * sizeY, x - sizeX/2, y - (0.7 + handL) * sizeY);
7729 txLine (x, y - 0.7 * sizeY, x + sizeX/2, y - (0.7 + handR) * sizeY);
7730
7731$ txLine (x + twist * sizeX, y - 0.35 * sizeY, x - sizeX/2, y);
7732 txLine (x + twist * sizeX, y - 0.35 * sizeY, x + sizeX/2, y);
7733
7734$ txCircle (x, y - (0.85 + head) * sizeY, 0.15 * sizeY);
7735
7736$ txLine (x, y - (1 + head) * sizeY, x + wind/10 * sizeX, y - (1 + head + hair/10) * sizeY);
7737 txLine (x, y - (1 + head) * sizeY, x + (wind/10 - 0.1) * sizeX, y - (1 + head + hair/10) * sizeY);
7738 txLine (x, y - (1 + head) * sizeY, x + (wind/10 + 0.1) * sizeX, y - (1 + head + hair/10) * sizeY);
7739
7740$ txSetColor (~color & 0xFFFFFF);
7741 txSetFillColor (~color & 0xFFFFFF);
7742
7743$ txLine (x, y - (0.8 + head - 0.05 * smile/2) * sizeY, x - 0.05 * sizeY, y - (0.8 + head + 0.05 * smile/2) * sizeY),
7744 txLine (x, y - (0.8 + head - 0.05 * smile/2) * sizeY, x + 0.05 * sizeY, y - (0.8 + head + 0.05 * smile/2) * sizeY),
7745 txNotifyIcon (4, (const char*)!! (L+'L')[msg], "\n%s\n", msg + (count++ % 3)["\"<"]);
7746
7747$ txCircle (x - 0.05 * sizeY, y - (0.9 + head - 0.02 * crazy) * sizeY, eyes * (1 + 0.5*wink) * 0.02 * sizeY),
7748 txCircle (x + 0.05 * sizeY, y - (0.9 + head + 0.02 * crazy) * sizeY, eyes * (1 - 0.5*wink) * 0.02 * sizeY),
7749 Sleep (1000 + count%2);
7750
7751$ txSetColor (lineColor);
7752 txSetFillColor (fillColor);
7753 }
7754
7755//-----------------------------------------------------------------------------------------------------------------
7756
7757void txDump (const void* address, const char name[] /*= "txDump()"*/)
7758 {
7759 const unsigned char* p = (const unsigned char*) address;
7760 int x = 0;
7761
7762 txSetConsoleAttr (0x0F);
7763 printf ("\n%8.8s ", name? name : "");
7764
7765 txSetConsoleAttr (0x0E);
7766 for (x = 0; x < 16; x++) printf ("%02X ", x);
7767 for (x = 0; x < 16; x++) printf ("%X", x);
7768
7769 for (int y = 0; y < 16; y++, p += 16)
7770 {
7771 txSetConsoleAttr (0x0E);
7772 printf ("\n" "%8p ", p);
7773
7774 for (x = 0; x < 16; x++) { txSetConsoleAttr (0x0A + x/4%2); printf ("%02X ", p[x]); }
7775 for (x = 0; x < 16; x++) { txSetConsoleAttr (0x0A + x/4%2); printf ("%c", isprint (p[x])? p[x] : '.'); }
7776 }
7777
7778 txSetConsoleAttr (0x07);
7779 printf ("\n");
7780 }
7781
7782//-----------------------------------------------------------------------------------------------------------------
7783
7784double txQueryPerformance()
7785 {
7786$1 int maxTime = 500;
7787$ int maxSamples = 100;
7788$ POINT size = {500, 500};
7789
7790$ HDC dc = _txBuffer_Create (txWindow(), &size, NULL);
7791$ assert (dc); if (!dc) return -1;
7792
7793$ DWORD mask = (DWORD) SetThreadAffinityMask (GetCurrentThread(), 1);
7794$ assert (mask);
7795
7796$ LARGE_INTEGER freq = {{0}};
7797$ QueryPerformanceFrequency (&freq) asserted;
7798
7799$ LARGE_INTEGER start = {{0}};
7800$ QueryPerformanceCounter (&start) asserted;
7801
7802$ int samples = 0;
7803$ while (samples++ < maxSamples)
7804 {
7805$ LARGE_INTEGER cur = {{0}};
7806$ QueryPerformanceCounter (&cur) asserted;
7807
7808$ double t = 1000.0 * (double) (cur.QuadPart - start.QuadPart) / (double) freq.QuadPart;
7809$ if (t > maxTime) break;
7810
7811 // Draw test scene
7812
7813$ for (int y = 0; y < size.y; y += 10)
7814 for (int x = 0; x < size.x; x += 10) Win32::TextOut (dc, x, y, "*", 1);
7815
7816$ Win32::Ellipse (dc, 0, 0, size.x, size.y);
7817$ Win32::ExtFloodFill (dc, size.x/2, size.y/2, TX_TRANSPARENT, FLOODFILLSURFACE);
7818
7819$ txBitBlt (dc, size.x/2, 0, size.x/2, size.y/2, dc, 0, 0) asserted;
7820$ txBitBlt (dc, size.x/2, size.y/2, size.x/2, size.y/2, dc, 0, size.y/2) asserted;
7821$ txBitBlt (dc, 0, size.y/2, size.x/2, size.y/2, dc, 0, 0) asserted;
7822$ txBitBlt (dc, size.x/2, size.y/2, size.x/2, size.y/2, dc, size.x/2, 0) asserted;
7823 }
7824
7825$ mask = (DWORD) SetThreadAffinityMask (GetCurrentThread(), mask);
7826$ assert (mask);
7827
7828$ _txBuffer_Delete (&dc);
7829
7830$ return 15.0 * samples / sqrt (1.0 * size.x * size.y);
7831 }
7832
7833//-----------------------------------------------------------------------------------------------------------------
7834
7835int txExtractColor (COLORREF color, COLORREF component)
7836 {
7837$1 switch (component)
7838 {
7839 case TX_RED:
7840 case TX_HUE: $ return (color >> 0) & 0xFF;
7841
7842 case TX_GREEN:
7843 case TX_SATURATION: $ return (color >> 8) & 0xFF;
7844
7845 case TX_BLUE:
7846 case TX_LIGHTNESS: $ return (color >> 16) & 0xFF;
7847
7848 default: $ return CLR_INVALID;
7849 }
7850 }
7851
7852//-----------------------------------------------------------------------------------------------------------------
7853
7854COLORREF txRGB2HSL (COLORREF rgbColor)
7855 {
7856$1 int r = txExtractColor (rgbColor, TX_RED),
7857 g = txExtractColor (rgbColor, TX_GREEN),
7858 b = txExtractColor (rgbColor, TX_BLUE);
7859
7860$ double m1 = MAX (MAX (r, g), b) / 255.0,
7861 m2 = MIN (MIN (r, g), b) / 255.0,
7862 dm = m1 - m2,
7863 sm = m1 + m2,
7864
7865 ir = r / 255.0,
7866 ig = g / 255.0,
7867 ib = b / 255.0,
7868
7869 ih = 0,
7870 is = 0,
7871 il = sm / 2;
7872
7873$ const double prec = 0.001;
7874
7875$ if (fabs (dm) < prec)
7876 {
7877$ is = dm / ((sm <= 1)? sm : (2-sm));
7878
7879$ double cr = (m1 - ir) / dm,
7880 cg = (m1 - ig) / dm,
7881 cb = (m1 - ib) / dm;
7882
7883$ if (fabs (ir - m1) < prec) ih = cb - cg;
7884$ if (fabs (ig - m1) < prec) ih = 2 + cr - cb;
7885$ if (fabs (ib - m1) < prec) ih = 4 + cg - cr;
7886 }
7887
7888$ ih = (ih >= 0)? ih*60 : ih*60 + 360;
7889
7890$ return RGB (ROUND (ih / 360 * 255), ROUND (is * 255), ROUND (il * 255));
7891 }
7892
7893//-----------------------------------------------------------------------------------------------------------------
7894
7895COLORREF txHSL2RGB (COLORREF hslColor)
7896 {
7897$1 struct xRGB
7898 {
7899 static double calc (double h, double m1, double m2)
7900 {
7901$ if (h < 0) h += 360;
7902$ if (h > 360) h -= 360;
7903
7904$ return (h < 60)? m1 + (m2-m1) * h / 60 :
7905 (h < 180)? m2 :
7906 (h < 240)? m1 + (m2-m1) * (240-h) / 60 :
7907 m1;
7908 }
7909 };
7910
7911$ int h = txExtractColor (hslColor, TX_HUE),
7912 s = txExtractColor (hslColor, TX_SATURATION),
7913 l = txExtractColor (hslColor, TX_LIGHTNESS);
7914
7915$ double ih = h / 255.0 * 360.0,
7916 il = l / 100.0,
7917 is = s / 100.0,
7918
7919 m2 = (il <= 0.5)? il * (1 + is) : il + is - il * is,
7920 m1 = 2 * il - m2,
7921
7922 ir = s? xRGB::calc (ih + 120, m1, m2) : il,
7923 ig = s? xRGB::calc (ih, m1, m2) : il,
7924 ib = s? xRGB::calc (ih - 120, m1, m2) : il;
7925
7926$ return RGB (ROUND (ir * 255), ROUND (ig * 255), ROUND (ib * 255));
7927 }
7928
7929//-----------------------------------------------------------------------------------------------------------------
7930
7931template <typename T>
7932inline bool In (T x, T a, T b)
7933 {
7934 return a <= x && x <= b;
7935 }
7936
7937//-----------------------------------------------------------------------------------------------------------------
7938
7939inline bool In (const POINT& pt, const RECT& rect)
7940 {
7941 _TX_IF_ARGUMENT_FAILED (&pt) return 0;
7942 _TX_IF_ARGUMENT_FAILED (&rect) return 0;
7943
7944 return In (pt.x, rect.left, rect.right) &&
7945 In (pt.y, rect.top, rect.bottom);
7946 }
7947
7948//-----------------------------------------------------------------------------------------------------------------
7949
7950inline bool In (const COORD& pt, const SMALL_RECT& rect)
7951 {
7952 _TX_IF_ARGUMENT_FAILED (&pt) return 0;
7953 _TX_IF_ARGUMENT_FAILED (&rect) return 0;
7954
7955 return In (pt.X, rect.Left, rect.Right) &&
7956 In (pt.Y, rect.Top, rect.Bottom);
7957 }
7958
7959//-----------------------------------------------------------------------------------------------------------------
7960
7961inline int random (int range)
7962 {
7963 return rand() % range;
7964 }
7965
7966//-----------------------------------------------------------------------------------------------------------------
7967
7968inline double random (double left, double right)
7969 {
7970 return left + (right - left) * ((double) rand() / RAND_MAX);
7971 }
7972
7973//-----------------------------------------------------------------------------------------------------------------
7974
7975template <typename T>
7976inline T zero()
7977#ifdef _MSC_VER_6
7978 { T __zero = {0}; return __zero; }
7979
7980#else
7981 { T __zero = { }; return __zero; }
7982
7983#endif
7984
7985//}
7986//=================================================================================================================
7987
7988//=================================================================================================================
7989//{ txDialog methods implementation
7990// Ð ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð² клаÑÑа txDialog
7991//=================================================================================================================
7992
7993txDialog::txDialog () :
7994 layout_ (NULL)
7995 {$1}
7996
7997//-----------------------------------------------------------------------------------------------------------------
7998
7999txDialog::txDialog (const Layout* layout) :
8000 layout_ (layout)
8001 {$1}
8002
8003//-----------------------------------------------------------------------------------------------------------------
8004
8005const txDialog::Layout* txDialog::setLayout (const Layout* layout)
8006 {
8007$1 return std::swap (layout_, layout), layout;
8008 }
8009
8010//-----------------------------------------------------------------------------------------------------------------
8011
8012INT_PTR txDialog::dialogBox (WORD resourceID)
8013 {
8014$1 const char* resName = (char*)(ptrdiff_t) resourceID;
8015
8016$ if (!FindResource (NULL, resName, RT_DIALOG)) return TX_DEBUG_ERROR ("Ðе найден реÑÑƒÑ€Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð° %d" _ resourceID), 0;
8017
8018$ return DialogBoxParam (NULL, resName, NULL, dialogProc__, (LPARAM) this);
8019 }
8020
8021//-----------------------------------------------------------------------------------------------------------------
8022
8023INT_PTR txDialog::dialogBox (const txDialog::Layout* layout /*= NULL*/, size_t bufsize /*= 0*/)
8024 {
8025$1 if (!layout) layout = layout_;
8026$ if (!layout) return TX_DEBUG_ERROR ("Ðе уÑтановлен динамичеÑкий шаблон диалога"), 0;
8027
8028$ if (!bufsize) bufsize = 1024;
8029
8030$ DLGTEMPLATE* tmpl = (DLGTEMPLATE*) GlobalAlloc (GPTR, bufsize);
8031$ if (!tmpl) return TX_DEBUG_ERROR ("GlobalAlloc(): Ðет памÑти Ð´Ð»Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° диалога"), 0;
8032
8033$ const Layout* dlg = &layout[0];
8034$ const Layout def = { DIALOG, NULL, 0, 0,0,0,0, WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_CENTER, "MS Shell Dlg", 8 };
8035
8036$ void* ptr = _tx_DLGTEMPLATE_Create (tmpl, bufsize,
8037 (dlg->style? dlg->style : def.style) | DS_SETFONT, 0, 0,
8038 dlg->x, dlg->y, dlg->sx, dlg->sy,
8039 dlg->caption? dlg->caption : def.caption,
8040 dlg->font? dlg->font : def.font,
8041 dlg->fontsize? dlg->fontsize : def.fontsize, NULL);
8042$ WORD i = 0;
8043$ for (i = 1; layout[i].wndclass != END; ++i)
8044 {
8045$ const Layout* item = &layout[i];
8046
8047$ ptr = _tx_DLGTEMPLATE_Add (ptr, bufsize - ((char*)ptr - (char*)tmpl),
8048 item->style | WS_VISIBLE, 0, item->x, item->y, item->sx, item->sy,
8049 item->id, (const char*) item->wndclass, item->caption);
8050 }
8051
8052$ tmpl->cdit = (unsigned short) (i-1);
8053$ INT_PTR res = DialogBoxIndirectParam (NULL, tmpl, NULL, dialogProc__, (LPARAM) this);
8054
8055$ GlobalFree (tmpl);
8056
8057$ return res;
8058 }
8059
8060//-----------------------------------------------------------------------------------------------------------------
8061
8062int txDialog::dialogProc (HWND, UINT, WPARAM, LPARAM)
8063 {
8064$1 return FALSE;
8065 }
8066
8067//-----------------------------------------------------------------------------------------------------------------
8068
8069ptrdiff_t CALLBACK txDialog::dialogProc__ (HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam)
8070 {
8071$1 static txDialog* this__ = NULL;
8072
8073$ if (msg == WM_INITDIALOG) this__ = (txDialog*) lParam;
8074$ if (!this__) return FALSE;
8075
8076$ switch (msg)
8077 {
8078 case WM_INITDIALOG: $ SetForegroundWindow (wnd); break;
8079
8080 case WM_COMMAND: $ switch (LOWORD (wParam))
8081 {
8082 case IDOK:
8083 case IDCANCEL: $ SetForegroundWindow (txWindow());
8084 $ EndDialog (wnd, (INT_PTR) this__); break;
8085 default: $ break;
8086 }
8087
8088 default: $ break;
8089 }
8090
8091$ return this__-> dialogProc (wnd, msg, wParam, lParam);
8092 }
8093
8094//-----------------------------------------------------------------------------------------------------------------
8095
8096void* _tx_DLGTEMPLATE_Create (void* globalMem, size_t bufsize, DWORD style, DWORD exStyle,
8097 WORD controls, short x, short y, short cx, short cy,
8098 const char caption[], const char font[], WORD fontsize, HANDLE menu)
8099 {
8100$1 _TX_IF_ARGUMENT_FAILED (globalMem) return NULL;
8101
8102$ WORD* pw = (WORD*) globalMem;
8103
8104$ DLGTEMPLATE* tmpl = ((DLGTEMPLATE*&) pw)++;
8105
8106$ tmpl->style = style;
8107$ tmpl->dwExtendedStyle = exStyle;
8108$ tmpl->cdit = controls;
8109$ tmpl->x = x;
8110$ tmpl->y = y;
8111$ tmpl->cx = cx;
8112$ tmpl->cy = cy;
8113
8114$ *pw++ = (WORD)(ptrdiff_t) NULL;
8115$ *pw++ = (WORD)(ptrdiff_t) menu;
8116
8117$ if (caption)
8118 {
8119$ pw += MultiByteToWideChar (_TX_CP, 0, caption? caption : "", -1, (wchar_t*) pw,
8120 (int) (bufsize? bufsize - ((char*)pw - (char*)globalMem) : 0xFFFF));
8121 }
8122
8123$ if (style & DS_SETFONT)
8124 {
8125$ *pw++ = fontsize;
8126$ pw += MultiByteToWideChar (_TX_CP, 0, font? font : "", -1, (wchar_t*) pw,
8127 (int) (bufsize? bufsize - ((char*)pw - (char*)globalMem) : 0xFFFF));
8128 }
8129
8130$ return pw;
8131 }
8132
8133//-----------------------------------------------------------------------------------------------------------------
8134
8135void* _tx_DLGTEMPLATE_Add (void* dlgTemplatePtr, size_t bufsize, DWORD style, DWORD exStyle,
8136 short x, short y, short cx, short cy,
8137 WORD id, const char wclass[], const char caption[])
8138 {
8139$1 _TX_IF_ARGUMENT_FAILED (dlgTemplatePtr) return NULL;
8140
8141$ WORD* pw = (LPWORD) dlgTemplatePtr; // Force align at word boundary
8142$ (ULONG&) pw += 3;
8143$ (ULONG&) pw >>= 2;
8144$ (ULONG&) pw <<= 2;
8145
8146$ DLGITEMTEMPLATE* tmpl = ((DLGITEMTEMPLATE*&) pw)++;
8147
8148$ tmpl->style = style;
8149$ tmpl->dwExtendedStyle = exStyle;
8150$ tmpl->x = x;
8151$ tmpl->y = y;
8152$ tmpl->cx = cx;
8153$ tmpl->cy = cy;
8154$ tmpl->id = id;
8155
8156$ if (HIWORD (wclass) == 0xFFFF)
8157 {
8158$ *pw++ = (WORD) (HIWORD ((ptrdiff_t) wclass));
8159$ *pw++ = (WORD) (LOWORD ((ptrdiff_t) wclass));
8160 }
8161 else if (wclass)
8162 {
8163$ pw += MultiByteToWideChar (_TX_CP, 0, const_cast <char*> (wclass), -1, (wchar_t*) pw,
8164 (int) (bufsize? bufsize - ((char*)pw - (char*)dlgTemplatePtr) : 0xFFFF));
8165 }
8166 else
8167 {
8168$ *pw++ = 0;
8169 }
8170
8171$ if (caption)
8172 {
8173$ pw += MultiByteToWideChar (_TX_CP, 0, caption, -1, (wchar_t*) pw,
8174 (int) (bufsize? bufsize - ((char*)pw - (char*)dlgTemplatePtr) : 0xFFFF));
8175 }
8176 else
8177 {
8178$ *pw++ = 0;
8179 }
8180
8181$ *pw++ = 0;
8182
8183$ return pw;
8184 }
8185
8186//}
8187//=================================================================================================================
8188
8189//=================================================================================================================
8190//{ Cleaning up the utility macros
8191// ОчиÑтка Ñлужебных макроÑов
8192//=================================================================================================================
8193
8194#undef $
8195
8196//}
8197//=================================================================================================================
8198
8199//! @endcond
8200//}
8201//=================================================================================================================
8202
8203/*! @cond INTERNAL */
8204
8205} } // namespace TX, anonymous namespace
8206
8207/*! @endcond */
8208
8209//-----------------------------------------------------------------------------------------------------------------
8210//{ Easy using of TX:: and some of std::
8211//-----------------------------------------------------------------------------------------------------------------
8212
8213using namespace TX; // Allow easy usage of TXLib functions
8214
8215using ::std::cin; // Predefined usings to avoid "using namespace std"
8216using ::std::cout;
8217using ::std::cerr;
8218using ::std::string;
8219
8220//}
8221//-----------------------------------------------------------------------------------------------------------------
8222
8223//=================================================================================================================
8224//{ [Experimental] Debugging macros
8225//! @name ÐкÑпериментальные отладочные макроÑÑ‹
8226//=================================================================================================================
8227
8228//{----------------------------------------------------------------------------------------------------------------
8229//! @ingroup Misc
8230//! @brief ÐžÑ‚Ð»Ð°Ð´Ð¾Ñ‡Ð½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ переменной во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ñ‡Ð¸ÑÐ»ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ учаÑтка кода
8231//! во Ð²Ñ€ÐµÐ¼Ñ ÐµÐ³Ð¾ выполнениÑ
8232//!
8233//! @warning Ðти макроÑÑ‹ могут изменитьÑÑ Ð² будущих верÑиÑÑ….
8234//!
8235//! @title Ðазначение: @table
8236//! @tr <tt> $ (x) </tt> @td Печать имени и Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹ @c x внутри выражениÑ.
8237//! @tr <tt> $_(x) </tt> @td Печать только Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹ @c x внутри выражениÑ.
8238//! @tbr
8239//! @tr <tt> $$ (expr) </tt> @td Печать выражениÑ, его вычиÑление, печать и возврат значениÑ. @n
8240//! ЕÑли выражение Ñодержит оператор "запÑтаÑ", не взÑтый в Ñкобки,
8241//! необходимо окружать expr еще одной парой Ñкобок.
8242//! @tr <tt> $$_(expr) </tt> @td То же, что и <tt>$$(expr),</tt> но Ð²Ñ‚Ð¾Ñ€Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ идет без новой Ñтроки.
8243//! @tbr
8244//! @tr <tt> $$$ (expr) </tt> @td То же, что и <tt>$$(expr),</tt> но Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² или блоков кода (без возврата значениÑ).
8245//! @tr <tt> $$$_(expr) </tt> @td То же, что и <tt>$$$(expr),</tt> но Ð²Ñ‚Ð¾Ñ€Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ идет без новой Ñтроки.
8246//! @tbr
8247//! @tr <tt> $$$$ </tt> @td Печать меÑÑ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² коде.
8248//! @tr <tt> $$$$_ </tt> @td Печать меÑÑ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² коде (только Ð¸Ð¼Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸).
8249//! @tr <tt> $n </tt> @td Перевод Ñтроки (печать @c '\\n').
8250//! @endtable
8251//!
8252//! @title УÑтановка атрибутов Ñимволов конÑоли: @table
8253//! @tr @c $d @td Светло-Ñерый цвет @td @td @c $T @td Прозрачный цвет
8254//! @tr @c $b @td Светло-Ñиний цвет @td @td @c $B @td Темно-Ñиний цвет
8255//! @tr @c $g @td Светло-зеленый цвет @td @td @c $G @td Темно-зеленый цвет
8256//! @tr @c $c @td Светло-бирюзовый цвет @td @td @c $C @td Темно-бирюзовый цвет
8257//! @tr @c $r @td Светло-краÑный цвет @td @td @c $R @td Темно-краÑный цвет
8258//! @tr @c $m @td Светло-малиновый цвет @td @td @c $M @td Темно-малиновый цвет
8259//! @tr @c $y @td Желтый цвет @td @td @c $Y @td Темно-желтый цвет
8260//! @tr @c $t @td Белый цвет @td @td @c $D @td Темно-Ñерый цвет
8261//! @endtable
8262//! @title @table
8263//! @tr @c $a @td Assertion @td Светло-зеленый на зеленом @td
8264//! @td @c $A @td Assertion bold @td Желтый на зеленом @td
8265//! @tr @c $i @td Information @td Светло-Ñиний на Ñинем @td
8266//! @td @c $I @td Information bold @td Желтый на Ñинем @td
8267//! @tr @c $w @td Warning @td Светло-малиновый на малиновом @td
8268//! @td @c $W @td Warning bold @td Желтый на малиновом @td
8269//! @tr @c $e @td Error @td Светло-краÑный на краÑном @td
8270//! @td @c $E @td Error bold @td Желтый на краÑном @td
8271//! @tr @c $f @td Fatal @td Черный на Ñветло-краÑном @td
8272//! @td @c $F @td Fatal bold @td Малиновый на Ñветло-краÑном @td
8273//! @tr @c $l @td Location @td Черный на темно-Ñером @td
8274//! @td @c $L @td Location bold @td Светло-Ñерый на темно-Ñером @td
8275//! @endtable
8276//! @title @table
8277//! @tr @c $s @td Запомнить атрибуты. При выходе из блока кода атрибуты воÑÑтанавливаютÑÑ.
8278//! @endtable
8279//!
8280//! @see assert(), asserted, __TX_FILELINE__, __TX_FUNCTION__, TX_ERROR
8281//!
8282//! @usage @code
8283//! $g // green
8284//! int x = 5;
8285//! int y = $(x) + 1;
8286//! $$( x = $(y) + 2 );
8287//!
8288//! $r // red
8289//! double xy = $$( pow (x, y) );
8290//!
8291//! $$$$
8292//! double h = $$(( $(x) = x*x, y = y*y, sqrt ($(x+y)) ));
8293//!
8294//! $$( txCreateWindow (800, 600) );
8295//!
8296//! $d // default color
8297//! $$$( if ($(xy) < $(h)) { $s return $(h); } )
8298//!
8299//! $$$$
8300//! @endcode
8301//}----------------------------------------------------------------------------------------------------------------
8302
8303#ifndef __TX_DEBUG_MACROS
8304#define __TX_DEBUG_MACROS ("Группа отладочных $-макроÑов")
8305
8306//! @cond INTERNAL
8307
8308#define $_(var) _txDump (var)
8309
8310#define $(var) ( _txDump ((var), "[" #var " = ", "] ") )
8311
8312#define $$(cmd) ( std::cerr << "\n[" __TX_FILELINE__ ": " #cmd "]\n", \
8313 _txDump ((cmd),"\n[" __TX_FILELINE__ ": " #cmd ": ", ", DONE]\n") )
8314
8315#define $$_(cmd) ( std::cerr << "\n[" __TX_FILELINE__ ": " #cmd "]\n", \
8316 _txDump ((cmd), "[" __TX_FILELINE__ ": " #cmd ": ", ", DONE]\n") )
8317
8318#define $$$(cmd) { std::cerr << "\n[" __TX_FILELINE__ ": " #cmd "]\n"; \
8319 _txDumpSuffix ("\n[" __TX_FILELINE__ ": " #cmd " DONE]\n"); { cmd; } }
8320
8321#define $$$_(cmd) { std::cerr << "\n[" __TX_FILELINE__ ": " #cmd "]\n"; \
8322 _txDumpSuffix ( "[" __TX_FILELINE__ ": " #cmd " DONE]\n"); { cmd; } }
8323
8324#define $$$$ { txOutputDebugPrintf ("\f\n"); \
8325 { $s $l txOutputDebugPrintf ("\f" "[%s (%d) %s]", __FILE__, __LINE__, __TX_FUNCTION__); } txOutputDebugPrintf ("\f\n"); }
8326
8327#define $$$$_ { txOutputDebugPrintf ("\f\n"); \
8328 { $s $l txOutputDebugPrintf ("\f" "[%s]", __func__); } txOutputDebugPrintf ("\f\n"); }
8329
8330#define $n std::cerr << "\n";
8331
8332#define $s _txSaveConsoleAttr __txSaveConsoleAttr;
8333
8334#define $T txSetConsoleAttr (0x00);
8335#define $B txSetConsoleAttr (0x01);
8336#define $G txSetConsoleAttr (0x02);
8337#define $C txSetConsoleAttr (0x03);
8338#define $R txSetConsoleAttr (0x04);
8339#define $M txSetConsoleAttr (0x05);
8340#define $Y txSetConsoleAttr (0x06);
8341#define $d txSetConsoleAttr (0x07);
8342#define $D txSetConsoleAttr (0x08);
8343#define $b txSetConsoleAttr (0x09);
8344#define $g txSetConsoleAttr (0x0a);
8345#define $c txSetConsoleAttr (0x0b);
8346#define $r txSetConsoleAttr (0x0c);
8347#define $m txSetConsoleAttr (0x0d);
8348#define $y txSetConsoleAttr (0x0e);
8349#define $t txSetConsoleAttr (0x0f);
8350
8351#define $i txSetConsoleAttr (0x1b);
8352#define $I txSetConsoleAttr (0x1e);
8353#define $a txSetConsoleAttr (0x2a);
8354#define $A txSetConsoleAttr (0x2e);
8355#define $e txSetConsoleAttr (0x4f);
8356#define $E txSetConsoleAttr (0x4e);
8357#define $w txSetConsoleAttr (0x5d);
8358#define $W txSetConsoleAttr (0x5e);
8359#define $f txSetConsoleAttr (0xc0);
8360#define $F txSetConsoleAttr (0xc5);
8361#define $l txSetConsoleAttr (0x80);
8362#define $L txSetConsoleAttr (0x87);
8363
8364//-----------------------------------------------------------------------------------------------------------------
8365
8366#if !defined (_MSC_VER_6)
8367
8368template <typename T> inline
8369const T& _txDump (const T& value, const char* prefix = "", const char* suffix = "")
8370 {
8371 std::cerr << prefix << value << suffix;
8372 return value;
8373 }
8374
8375#endif
8376
8377template <typename T> inline
8378 T& _txDump ( T& value, const char* prefix = "", const char* suffix = "")
8379 {
8380 std::cerr << prefix << value << suffix;
8381 return value;
8382 }
8383
8384struct _txDumpSuffix
8385 {
8386 const char* suffix_;
8387
8388 inline _txDumpSuffix (const char* suffix = "") : suffix_ (suffix) {}
8389 inline ~_txDumpSuffix() { std::cerr << suffix_; }
8390
8391 _txDumpSuffix (const _txDumpSuffix&);
8392 _txDumpSuffix& operator = (const _txDumpSuffix&);
8393 };
8394
8395struct _txSaveConsoleAttr
8396 {
8397 unsigned attr_;
8398
8399 inline _txSaveConsoleAttr() : attr_ (txGetConsoleAttr ()) {}
8400 inline _txSaveConsoleAttr (WORD attr) : attr_ (txGetConsoleAttr ()) { txSetConsoleAttr (attr); }
8401 inline ~_txSaveConsoleAttr() { txSetConsoleAttr (attr_); }
8402 };
8403
8404//! @endcond
8405
8406#endif
8407
8408//}
8409//=================================================================================================================
8410
8411//-----------------------------------------------------------------------------------------------------------------
8412//{ Compiler- and platform-specific
8413// ÐÐ´Ð°Ð¿Ñ‚Ð°Ñ†Ð¸Ñ Ðº компилÑторам и платформам
8414//-----------------------------------------------------------------------------------------------------------------
8415//! @cond INTERNAL
8416
8417#if defined (_GCC_VER) && (_GCC_VER >= 420)
8418
8419 #pragma GCC optimize ("strict-aliasing")
8420
8421 #if (_GCC_VER >= 460)
8422 #pragma GCC diagnostic pop
8423
8424 #else
8425 #pragma GCC diagnostic warning "-Wstrict-aliasing"
8426 #pragma GCC diagnostic warning "-Wshadow"
8427 #endif
8428
8429 // Still block this warnings to avoid reporting about "= {0}" or "= {}" init style,
8430 // and old style cast used in Windows.h RGB() macro.
8431
8432 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
8433 #pragma GCC diagnostic ignored "-Wold-style-cast"
8434
8435 // These warnings really occur at end of compilation, so block them too.
8436
8437 #pragma GCC diagnostic ignored "-Wunreachable-code"
8438 #pragma GCC diagnostic ignored "-Wunused-label"
8439 #pragma GCC diagnostic ignored "-Winline"
8440
8441#endif
8442
8443//-----------------------------------------------------------------------------------------------------------------
8444
8445#if defined (_MSC_VER)
8446
8447 #pragma warning (default: 4127) // conditional expression is constant
8448 #pragma warning (default: 4351) // new behavior: elements of array will be default initialized
8449
8450 #pragma warning (default: 4511) // copy constructor could not be generated
8451 #pragma warning (default: 4512) // assignment operator could not be generated
8452 #pragma warning (default: 4663) // C++ language change: to explicitly specialize class template
8453 #pragma warning (default: 4702) // unreachable code
8454
8455 #if (_MSC_VER >= 1400) // MSVC 8 (2005) or greater
8456 #pragma warning (default: 26135) // missing locking annotation
8457 #pragma warning (default: 28125) // the function must be called from within a try/except block
8458 #pragma warning (default: 28159) // consider using another function instead
8459 #endif
8460
8461 // This warning really occur at end of compilation, so still block it.
8462
8463 #pragma warning (disable: 4514) // unreferenced inline function has been removed
8464 #pragma warning (disable: 4710) // function not inlined
8465 #pragma warning (disable: 4786) // identifier was truncated to '255' characters in the debug information
8466
8467#endif
8468
8469#if defined (__INTEL_COMPILER)
8470
8471 #pragma warning (default: 174) // remark: expression has no effect
8472 #pragma warning (default: 304) // remark: access control not specified ("public" by default)
8473 #pragma warning (default: 522) // remark: function redeclared "inline" after being called
8474 #pragma warning (default: 981) // remark: operands are evaluated in unspecified order
8475 #pragma warning (default: 1684) // conversion from pointer to same-sized integral type (potential portability problem)
8476
8477#endif
8478
8479//! @endcond
8480//}
8481//-----------------------------------------------------------------------------------------------------------------
8482
8483#endif // __TXLIB_H_INCLUDED
8484
8485//=================================================================================================================
8486// EOF
8487//=================================================================================================================