You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

632 lines
17 KiB

  1. /* /////////////////////////////////////////////////////////////////////////
  2. * File: winstl/window/functions.h (originally MWBase.h, ::SynesisWin)
  3. *
  4. * Purpose: Window functions.
  5. *
  6. * Created: 7th May 2000
  7. * Updated: 10th August 2009
  8. *
  9. * Home: http://stlsoft.org/
  10. *
  11. * Copyright (c) 2000-2009, Matthew Wilson and Synesis Software
  12. * All rights reserved.
  13. *
  14. * Redistribution and use in source and binary forms, with or without
  15. * modification, are permitted provided that the following conditions are met:
  16. *
  17. * - Redistributions of source code must retain the above copyright notice, this
  18. * list of conditions and the following disclaimer.
  19. * - Redistributions in binary form must reproduce the above copyright notice,
  20. * this list of conditions and the following disclaimer in the documentation
  21. * and/or other materials provided with the distribution.
  22. * - Neither the name(s) of Matthew Wilson and Synesis Software nor the names of
  23. * any contributors may be used to endorse or promote products derived from
  24. * this software without specific prior written permission.
  25. *
  26. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  27. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  29. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  30. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  31. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  32. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  33. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  34. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  35. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  36. * POSSIBILITY OF SUCH DAMAGE.
  37. *
  38. * ////////////////////////////////////////////////////////////////////// */
  39. /** \file winstl/window/functions.h
  40. *
  41. * \brief [C, C++] Miscellaneous functions
  42. * (\ref group__library__windows_window "Windows Window" Library).
  43. */
  44. #ifndef WINSTL_INCL_WINSTL_WINDOW_H_FUNCTIONS
  45. #define WINSTL_INCL_WINSTL_WINDOW_H_FUNCTIONS
  46. #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
  47. # define WINSTL_VER_WINSTL_WINDOW_H_FUNCTIONS_MAJOR 4
  48. # define WINSTL_VER_WINSTL_WINDOW_H_FUNCTIONS_MINOR 0
  49. # define WINSTL_VER_WINSTL_WINDOW_H_FUNCTIONS_REVISION 11
  50. # define WINSTL_VER_WINSTL_WINDOW_H_FUNCTIONS_EDIT 67
  51. #endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
  52. /* /////////////////////////////////////////////////////////////////////////
  53. * Includes
  54. */
  55. #ifndef WINSTL_INCL_WINSTL_H_WINSTL
  56. # include <winstl/winstl.h>
  57. #endif /* !WINSTL_INCL_WINSTL_H_WINSTL */
  58. #if defined(__cplusplus)
  59. #ifndef WINSTL_INCL_WINSTL_CONVERSION_HPP_WINDOWS_TYPE_CONVERSIONS
  60. # include <winstl/conversion/windows_type_conversions.hpp>
  61. #endif /* !WINSTL_INCL_WINSTL_CONVERSION_HPP_WINDOWS_TYPE_CONVERSIONS */
  62. #endif /* __cplusplus */
  63. /* /////////////////////////////////////////////////////////////////////////
  64. * Namespace
  65. */
  66. #if !defined(_WINSTL_NO_NAMESPACE) && \
  67. !defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
  68. # if defined(_STLSOFT_NO_NAMESPACE)
  69. /* There is no stlsoft namespace, so must define ::winstl */
  70. namespace winstl
  71. {
  72. # else
  73. /* Define stlsoft::winstl_project */
  74. namespace stlsoft
  75. {
  76. namespace winstl_project
  77. {
  78. # endif /* _STLSOFT_NO_NAMESPACE */
  79. #endif /* !_WINSTL_NO_NAMESPACE */
  80. /* /////////////////////////////////////////////////////////////////////////
  81. * C functions
  82. */
  83. #ifndef NOWINOFFSETS
  84. #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
  85. STLSOFT_INLINE ws_sptrint_t winstl__get_window_sptrint_(HWND h, int index)
  86. {
  87. #if defined(WINSTL_OS_IS_WIN64) || \
  88. defined(_Wp64)
  89. return STLSOFT_NS_GLOBAL(GetWindowLongPtr)(h, index);
  90. #else /* ? width */
  91. return STLSOFT_NS_GLOBAL(GetWindowLong)(h, index);
  92. #endif /* width */
  93. }
  94. STLSOFT_INLINE ws_sptrint_t winstl__set_window_sptrint_(HWND h, int index, ws_sptrint_t newData)
  95. {
  96. #if defined(WINSTL_OS_IS_WIN64) || \
  97. defined(_Wp64)
  98. return STLSOFT_NS_GLOBAL(SetWindowLongPtr)(h, index, newData);
  99. #else /* ? width */
  100. return STLSOFT_NS_GLOBAL(SetWindowLong)(h, index, newData);
  101. #endif /* width */
  102. }
  103. #endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
  104. STLSOFT_INLINE ws_sptrint_t winstl__GetStyle(HWND h)
  105. {
  106. return winstl__get_window_sptrint_(h, GWL_STYLE);
  107. }
  108. /** Gets the extended style of the window
  109. *
  110. * \ingroup group__library__windows_window
  111. */
  112. STLSOFT_INLINE ws_sptrint_t winstl__GetExStyle(HWND h)
  113. {
  114. return winstl__get_window_sptrint_(h, GWL_EXSTYLE);
  115. }
  116. /** Sets the style of the window
  117. *
  118. * \ingroup group__library__windows_window
  119. */
  120. STLSOFT_INLINE ws_sptrint_t winstl__SetStyle(HWND h, ws_sptrint_t s)
  121. {
  122. return winstl__set_window_sptrint_(h, GWL_STYLE, s);
  123. }
  124. /** Sets the extended style of the window
  125. *
  126. * \ingroup group__library__windows_window
  127. */
  128. STLSOFT_INLINE ws_sptrint_t winstl__SetExStyle(HWND h, ws_sptrint_t x)
  129. {
  130. return winstl__set_window_sptrint_(h, GWL_EXSTYLE, x);
  131. }
  132. /** Modifies the style of the window
  133. *
  134. * \ingroup group__library__windows_window
  135. */
  136. STLSOFT_INLINE ws_sptrint_t winstl__ModifyStyle(HWND h, ws_sptrint_t sRem, ws_sptrint_t sAdd)
  137. {
  138. return winstl__SetStyle(h, (winstl__GetStyle(h) & ~sRem) | sAdd);
  139. }
  140. /** Modifies the extended style of the window
  141. *
  142. * \ingroup group__library__windows_window
  143. */
  144. STLSOFT_INLINE ws_sptrint_t winstl__ModifyExStyle(HWND h, ws_sptrint_t sRem, ws_sptrint_t sAdd)
  145. {
  146. return winstl__SetExStyle(h, (winstl__GetExStyle(h) & ~sRem) | sAdd);
  147. }
  148. #endif /* !NOWINOFFSETS */
  149. /** Tests whether the given window has the given window class
  150. *
  151. * \ingroup group__library__windows_window
  152. */
  153. STLSOFT_INLINE ws_int_t winstl__IsWindowClassA(HWND hwnd, ws_char_a_t const* name)
  154. {
  155. ws_char_a_t szName[256];
  156. WINSTL_ASSERT(NULL != hwnd);
  157. WINSTL_ASSERT(NULL != name);
  158. stlsoft_static_cast(void, STLSOFT_NS_GLOBAL(GetClassNameA)(hwnd, szName, STLSOFT_NUM_ELEMENTS(szName)));
  159. return 0 == STLSOFT_NS_GLOBAL(lstrcmpiA)(szName, name);
  160. }
  161. /** Tests whether the given window has the given window class
  162. *
  163. * \ingroup group__library__windows_window
  164. */
  165. STLSOFT_INLINE ws_int_t winstl__IsWindowClassW(HWND hwnd, ws_char_w_t const* name)
  166. {
  167. ws_char_w_t szName[256];
  168. WINSTL_ASSERT(NULL != hwnd);
  169. WINSTL_ASSERT(NULL != name);
  170. stlsoft_static_cast(void, STLSOFT_NS_GLOBAL(GetClassNameW)(hwnd, szName, STLSOFT_NUM_ELEMENTS(szName)));
  171. return 0 == STLSOFT_NS_GLOBAL(lstrcmpiW)(szName, name);
  172. }
  173. #ifndef NOCTLMGR
  174. /** Enables/disable a dialog item
  175. *
  176. * \ingroup group__library__windows_window
  177. */
  178. STLSOFT_INLINE void winstl__EnableDlgItem(HWND hwnd, int id, BOOL bEnable)
  179. {
  180. STLSOFT_NS_GLOBAL(EnableWindow)(STLSOFT_NS_GLOBAL(GetDlgItem)(hwnd, id), bEnable);
  181. }
  182. /** Elicits the enable status of a dialog item
  183. *
  184. * \ingroup group__library__windows_window
  185. */
  186. STLSOFT_INLINE ws_int_t winstl__IsDlgItemEnabled(HWND hwnd, int id)
  187. {
  188. return STLSOFT_NS_GLOBAL(IsWindowEnabled)(STLSOFT_NS_GLOBAL(GetDlgItem)(hwnd, id));
  189. }
  190. /** Gets the text length of a dialog item's window contents
  191. *
  192. * \ingroup group__library__windows_window
  193. */
  194. STLSOFT_INLINE ws_int_t winstl__GetDlgItemTextLength(HWND hwnd, int id)
  195. {
  196. return STLSOFT_NS_GLOBAL(GetWindowTextLength)(STLSOFT_NS_GLOBAL(GetDlgItem)(hwnd, id));
  197. }
  198. #endif /* !NOCTLMGR */
  199. #ifndef NOWINOFFSETS
  200. /** Gets the HINSTANCE associated with a given window
  201. *
  202. * \ingroup group__library__windows_window
  203. */
  204. STLSOFT_INLINE HINSTANCE winstl__GetWindowInstance(HWND hwnd)
  205. {
  206. #if defined(WINSTL_OS_IS_WIN64) || \
  207. defined(_Wp64)
  208. const int index = GWLP_HINSTANCE;
  209. #else /* ? width */
  210. const int index = GWL_HINSTANCE;
  211. #endif /* width */
  212. /* When compiling for Win32 with -Wp64, the conversion that we've catered
  213. * for - by the use of winstl__get_window_sptrint_(), and by the above
  214. * discrimination - is mistakenly reported as a truncation, so we need to
  215. * suppress the warning nonetheless.
  216. */
  217. #if defined(STLSOFT_COMPILER_IS_MSVC) && \
  218. defined(_Wp64)
  219. # pragma warning(push)
  220. # pragma warning(disable : 4312)
  221. #endif
  222. return stlsoft_reinterpret_cast(HINSTANCE, winstl__get_window_sptrint_(hwnd, index));
  223. #if defined(STLSOFT_COMPILER_IS_MSVC) && \
  224. defined(_Wp64)
  225. # pragma warning(pop)
  226. #endif
  227. }
  228. #endif /* !NOWINOFFSETS */
  229. /* /////////////////////////////////////////////////////////////////////////
  230. * Namespace
  231. */
  232. #ifdef STLSOFT_DOCUMENTATION_SKIP_SECTION
  233. namespace winstl
  234. {
  235. #endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
  236. /* /////////////////////////////////////////////////////////////////////////
  237. * C++ functions
  238. */
  239. #ifdef __cplusplus
  240. # ifndef NOWINOFFSETS
  241. /** Gets the style of the window
  242. *
  243. * \ingroup group__library__windows_window
  244. */
  245. inline ws_sptrint_t GetStyle(HWND h)
  246. {
  247. return winstl__GetStyle(h);
  248. }
  249. /** Gets the extended style of the window
  250. *
  251. * \ingroup group__library__windows_window
  252. */
  253. inline ws_sptrint_t GetExStyle(HWND h)
  254. {
  255. return winstl__GetExStyle(h);
  256. }
  257. /** Sets the style of the window
  258. *
  259. * \ingroup group__library__windows_window
  260. */
  261. inline ws_sptrint_t SetStyle(HWND h, ws_sptrint_t s)
  262. {
  263. return winstl__SetStyle(h, s);
  264. }
  265. /** Sets the extended style of the window
  266. *
  267. * \ingroup group__library__windows_window
  268. */
  269. inline ws_sptrint_t SetExStyle(HWND h, ws_sptrint_t x)
  270. {
  271. return winstl__SetExStyle(h, x);
  272. }
  273. /** Modifies the style of the window
  274. *
  275. * \ingroup group__library__windows_window
  276. */
  277. inline ws_sptrint_t ModifyStyle(HWND h, ws_sptrint_t sRem, ws_sptrint_t sAdd)
  278. {
  279. return winstl__ModifyStyle(h, sRem, sAdd);
  280. }
  281. /** Modifies the extended style of the window
  282. *
  283. * \ingroup group__library__windows_window
  284. */
  285. inline ws_sptrint_t ModifyExStyle(HWND h, ws_sptrint_t sRem, ws_sptrint_t sAdd)
  286. {
  287. return winstl__ModifyExStyle(h, sRem, sAdd);
  288. }
  289. # endif /* !NOWINOFFSETS */
  290. /** Tests whether the given window has the given window class
  291. *
  292. * \ingroup group__library__windows_window
  293. */
  294. inline ws_bool_t IsWindowClass(HWND hwnd, ws_char_a_t const* name)
  295. {
  296. return BOOL2bool(winstl__IsWindowClassA(hwnd, name));
  297. }
  298. /** Tests whether the given window has the given window class
  299. *
  300. * \ingroup group__library__windows_window
  301. */
  302. inline ws_bool_t IsWindowClass(HWND hwnd, ws_char_w_t const* name)
  303. {
  304. return BOOL2bool(winstl__IsWindowClassW(hwnd, name));
  305. }
  306. # ifndef NOCTLMGR
  307. /** Enables/disable a dialog item
  308. *
  309. * \ingroup group__library__windows_window
  310. */
  311. inline void EnableDlgItem(HWND hwnd, int id, ws_bool_t bEnable)
  312. {
  313. winstl__EnableDlgItem(hwnd, id, bEnable);
  314. }
  315. /** Elicits the enable status of a dialog item
  316. *
  317. * \ingroup group__library__windows_window
  318. */
  319. inline ws_bool_t IsDlgItemEnabled(HWND hwnd, int id)
  320. {
  321. return BOOL2bool(winstl__IsDlgItemEnabled(hwnd, id));
  322. }
  323. /** Gets the text length of a dialog item's window contents
  324. *
  325. * \ingroup group__library__windows_window
  326. */
  327. inline ws_int_t GetDlgItemTextLength(HWND hwnd, int id)
  328. {
  329. return winstl__GetDlgItemTextLength(hwnd, id);
  330. }
  331. # endif /* !NOCTLMGR */
  332. # ifndef NOWINOFFSETS
  333. /** Gets the HINSTANCE associated with a given window
  334. *
  335. * \ingroup group__library__windows_window
  336. */
  337. #ifdef GetWindowInstance
  338. # undef GetWindowInstance
  339. #endif /* GetWindowInstance */
  340. inline HINSTANCE GetWindowInstance(HWND hwnd)
  341. {
  342. return winstl__GetWindowInstance(hwnd);
  343. }
  344. # endif /* !NOWINOFFSETS */
  345. # ifndef NOWINMESSAGES
  346. inline HICON set_window_icon(HWND hwnd, int iconType, HICON hicon)
  347. {
  348. WINSTL_ASSERT(ICON_BIG == iconType || ICON_SMALL == iconType);
  349. # if defined(STLSOFT_COMPILER_IS_BORLAND) && \
  350. __BORLANDC__ < 0x0564
  351. /* This is needed here to prevent the Borland compiler from confusing it with the winstl one! */
  352. using ::SendMessage;
  353. # endif /* compiler */
  354. # if defined(STLSOFT_COMPILER_IS_MSVC) && \
  355. defined(_Wp64) && \
  356. !defined(_WIN64)
  357. # pragma warning(push)
  358. # pragma warning(disable : 4244)
  359. # endif /* VC++ + Win32 + _Wp32 */
  360. return LRESULT2HICON(::SendMessage(hwnd, WM_SETICON, static_cast<WPARAM>(iconType), HICON2LPARAM(hicon)));
  361. # if defined(STLSOFT_COMPILER_IS_MSVC) && \
  362. defined(_Wp64) && \
  363. !defined(_WIN64)
  364. # pragma warning(pop)
  365. # endif /* VC++ + Win32 + _Wp32 */
  366. }
  367. inline HICON set_window_icon(HWND hwnd, int iconType, HINSTANCE hinst, LPCTSTR iconName)
  368. {
  369. return set_window_icon(hwnd, iconType, ::LoadIcon(hinst, iconName));
  370. }
  371. inline HICON set_window_icon(HWND hwnd, int iconType, HINSTANCE hinst, int iconId)
  372. {
  373. return set_window_icon(hwnd, iconType, ::LoadIcon(hinst, MAKEINTRESOURCE(iconId)));
  374. }
  375. # endif /* !NOWINMESSAGES */
  376. /* ////////////////////////////////////////////////////////////////////// */
  377. # ifndef NOCTLMGR
  378. # if defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
  379. # define WINSTL_FINDFIRSTCHILDBYID_SLF_FORM1
  380. # elif defined(STLSOFT_COMPILER_IS_BORLAND) /* && \
  381. __BORLANDC__ < 0x0582 */
  382. # define WINSTL_FINDFIRSTCHILDBYID_SLF_FORM3
  383. # elif defined(STLSOFT_COMPILER_IS_MSVC)
  384. # if _MSC_VER > 1200
  385. # define WINSTL_FINDFIRSTCHILDBYID_SLF_FORM3
  386. # else /* ? compiler */
  387. # define WINSTL_FINDFIRSTCHILDBYID_SLF_FORM2
  388. # endif /* compiler */
  389. # else /* ? compiler */
  390. # define WINSTL_FINDFIRSTCHILDBYID_SLF_FORM1
  391. # endif /* compiler */
  392. /** \brief Finds the first descendant window with the given id
  393. *
  394. * \ingroup group__library__windows_window
  395. *
  396. * \param hwndParent The window whose children will be searched
  397. * \param id The dialog id to search for
  398. *
  399. * \return Either the window handle of the first child window (or
  400. * the parent itself) that matches the id, or NULL if no windows
  401. * match
  402. *
  403. * \note Because several levels of windows may be searched, it's
  404. * possible for more than one child window to have the given id.
  405. * This function will return only the first one found. Which one
  406. * is determined by the internals of the EnumChildWindows() API
  407. * function.
  408. *
  409. * \note \c hwndParent is included in the search, so if it has the
  410. * given id, it will be returned
  411. */
  412. # if defined(WINSTL_FINDFIRSTCHILDBYID_SLF_FORM1) || \
  413. defined(WINSTL_FINDFIRSTCHILDBYID_SLF_FORM2)
  414. # if defined(WINSTL_FINDFIRSTCHILDBYID_SLF_FORM2)
  415. /* declare the template function */
  416. template <int N>
  417. inline HWND FindFirstChildById_N(HWND hwndParent, int id);
  418. # endif /* WINSTL_FINDFIRSTCHILDBYID_SLF_FORM2 */
  419. inline HWND FindFirstChildById(HWND hwndParent, int id)
  420. # if defined(WINSTL_FINDFIRSTCHILDBYID_SLF_FORM2)
  421. {
  422. return FindFirstChildById_N<1>(hwndParent, id);
  423. }
  424. template <int N>
  425. inline HWND FindFirstChildById_N(HWND hwndParent, int id)
  426. # endif /* WINSTL_FINDFIRSTCHILDBYID_SLF_FORM2 */
  427. {
  428. if(::GetDlgCtrlID(hwndParent) == id)
  429. {
  430. return hwndParent;
  431. }
  432. else
  433. {
  434. class ChildFind
  435. {
  436. public:
  437. ss_explicit_k ChildFind(HWND hwndParent, int id)
  438. : m_hwndChild(NULL)
  439. , m_id(id)
  440. {
  441. ::EnumChildWindows(hwndParent, (WNDENUMPROC)EnumProc, reinterpret_cast<LPARAM>(this));
  442. }
  443. public:
  444. operator HWND() const
  445. {
  446. return m_hwndChild;
  447. }
  448. private:
  449. static BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
  450. {
  451. ChildFind &find = *reinterpret_cast<ChildFind*>(lParam);
  452. return (::GetDlgCtrlID(hwnd) == find.m_id)
  453. ? (find.m_hwndChild = hwnd, false)
  454. : true;
  455. }
  456. private:
  457. HWND m_hwndChild;
  458. int const m_id;
  459. } find(hwndParent, id);
  460. return find;
  461. }
  462. }
  463. #elif defined(WINSTL_FINDFIRSTCHILDBYID_SLF_FORM3)
  464. struct FindFirstChildById_class
  465. {
  466. class ChildFind
  467. {
  468. public:
  469. ss_explicit_k ChildFind(HWND hwndParent, int id)
  470. : m_hwndChild(NULL)
  471. , m_id(id)
  472. {
  473. ::EnumChildWindows(hwndParent, EnumProc, reinterpret_cast<LPARAM>(this));
  474. }
  475. public:
  476. operator HWND() const
  477. {
  478. return m_hwndChild;
  479. }
  480. private:
  481. static BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
  482. {
  483. ChildFind &find = *reinterpret_cast<ChildFind*>(lParam);
  484. return (::GetDlgCtrlID(hwnd) == find.m_id)
  485. ? (find.m_hwndChild = hwnd, false)
  486. : true;
  487. }
  488. private:
  489. HWND m_hwndChild;
  490. int const m_id;
  491. private:
  492. ChildFind& operator =(ChildFind const&);
  493. };
  494. static HWND FindFirstChildById_N(HWND hwndParent, int id)
  495. {
  496. if(::GetDlgCtrlID(hwndParent) == id)
  497. {
  498. return hwndParent;
  499. }
  500. else
  501. {
  502. ChildFind find(hwndParent, id);
  503. return find;
  504. }
  505. }
  506. };
  507. inline HWND FindFirstChildById(HWND hwndParent, int id)
  508. {
  509. return FindFirstChildById_class/* <int> */::FindFirstChildById_N(hwndParent, id);
  510. }
  511. # else /* ? WINSTL_FINDFIRSTCHILDBYID_SLF_FORM?? */
  512. # error None of WINSTL_FINDFIRSTCHILDBYID_SLF_FORM1, WINSTL_FINDFIRSTCHILDBYID_SLF_FORM2 or WINSTL_FINDFIRSTCHILDBYID_SLF_FORM3 defined
  513. # endif /* WINSTL_FINDFIRSTCHILDBYID_SLF_FORM?? */
  514. # endif /* !NOCTLMGR */
  515. #endif /* __cplusplus */
  516. /* ////////////////////////////////////////////////////////////////////// */
  517. #ifndef _WINSTL_NO_NAMESPACE
  518. # if defined(_STLSOFT_NO_NAMESPACE) || \
  519. defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
  520. } /* namespace winstl */
  521. # else
  522. } /* namespace winstl_project */
  523. } /* namespace stlsoft */
  524. # endif /* _STLSOFT_NO_NAMESPACE */
  525. #endif /* !_WINSTL_NO_NAMESPACE */
  526. /* ////////////////////////////////////////////////////////////////////// */
  527. #endif /* WINSTL_INCL_WINSTL_WINDOW_H_FUNCTIONS */
  528. /* ///////////////////////////// end of file //////////////////////////// */