windows.window.h.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. <chapter xml:id="windows.window.h">
  2. <title><tt>__vic/windows/window.h</tt></title>
  3. <chapter xml:id="windows--Window">
  4. <title><tt>windows::Window</tt></title>
  5. <code-block lang="C++"><![CDATA[
  6. class windows::Window
  7. {
  8. public:
  9. struct Class;
  10. struct CreateParams;
  11. Window() = default;
  12. explicit Window(HWND hwnd);
  13. static void Register(WNDCLASSEXW wcl);
  14. void Create(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWndName,
  15. DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent,
  16. HMENU hMenu, HINSTANCE hInstance, void *lpParam = nullptr);
  17. void Create(const CREATESTRUCTW &cs);
  18. LRESULT SendMessage(UINT msg, WPARAM w = 0, LPARAM l = 0);
  19. void Update();
  20. bool Show(int nWinMode);
  21. void Redraw(const RECT *rect = 0, HRGN hrgn = 0,
  22. UINT flags = RDW_INVALIDATE | RDW_UPDATENOW);
  23. void GetRect(RECT &r) const;
  24. RECT GetRect() const;
  25. void GetClientRect(RECT &r) const
  26. RECT GetClientRect() const;
  27. void SetText(LPCWSTR st);
  28. void SetText(const char *st);
  29. int GetText(LPWSTR st, int nMax) const;
  30. void SetPos(HWND hWndAfter, int x, int y, int w, int h, UINT uFlags);
  31. void SetPos(int x, int y, int w, int h);
  32. void SetSize(int w, int h);
  33. void SetClientAreaSize(int w, int h);
  34. void MoveTo(int x, int y);
  35. void MoveToCenter();
  36. HWND Handle() const;
  37. void Handle(HWND hwnd);
  38. operator HWND() const;
  39. };
  40. ]]></code-block>
  41. <p>Тонкая обёртка для Win32 API <tt>HWND</tt>.</p>
  42. <section><title>Члены класса</title>
  43. <synopsis>
  44. <prototype>Window() = default</prototype>
  45. <p>Создаёт неинициализированное значение.</p>
  46. </synopsis>
  47. <synopsis>
  48. <prototype>explicit Window(HWND hwnd)</prototype>
  49. <postcondition><tt>Handle() == hwnd</tt></postcondition>
  50. </synopsis>
  51. <synopsis>
  52. <prototype>static void Register(WNDCLASSEXW wcl)</prototype>
  53. <p>Вызывает <tt>::RegisterClassExW()</tt>. Бросает исключение в случае
  54. ошибки.</p>
  55. </synopsis>
  56. <synopsis>
  57. <prototype>void Create(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWndName,
  58. DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent,
  59. HMENU hMenu, HINSTANCE hInstance, void *lpParam = nullptr)</prototype>
  60. <p>Вызывает <tt>::CreateWindowExW()</tt> и обновляет завёрнутое значение
  61. <tt>HWND</tt>. Бросает исключение в случае ошибки.</p>
  62. </synopsis>
  63. <synopsis>
  64. <prototype>void Create(const CREATESTRUCTW &amp;cs)</prototype>
  65. <p>Вызывает <tt>Create()</tt> со значениями, указанными в in <tt>cs</tt>.
  66. Бросает исключение в случае ошибки.</p>
  67. </synopsis>
  68. <synopsis>
  69. <prototype>LRESULT SendMessage(UINT msg, WPARAM w = 0, LPARAM l = 0)</prototype>
  70. <p>Вызывает <tt>::SendMessage()</tt> и возвращает возвращённое значение.</p>
  71. </synopsis>
  72. <synopsis>
  73. <prototype>void Update()</prototype>
  74. <p>Вызывает <tt>::UpdateWindow()</tt>. Бросает исключение в случае ошибки.</p>
  75. </synopsis>
  76. <synopsis>
  77. <prototype>bool Show(int nWinMode)</prototype>
  78. <p>Вызывает <tt>::ShowWindow()</tt> и возвращает возвращённое значение.</p>
  79. </synopsis>
  80. <synopsis>
  81. <prototype>void Redraw(const RECT *rect = 0, HRGN hrgn = 0,
  82. UINT flags = RDW_INVALIDATE | RDW_UPDATENOW)</prototype>
  83. <p>Вызывает <tt>::RedrawWindow()</tt>. Бросает исключение в случае ошибки.</p>
  84. </synopsis>
  85. <synopsis>
  86. <prototype>void GetRect(RECT &amp;r) const</prototype>
  87. <prototype>RECT GetRect() const</prototype>
  88. <p>Вызывает <tt>::GetWindowRect()</tt>. Бросает исключение в случае ошибки.</p>
  89. </synopsis>
  90. <synopsis>
  91. <prototype>void GetClientRect(RECT &amp;r) const</prototype>
  92. <prototype>RECT GetClientRect() const</prototype>
  93. <p>Вызывает <tt>::GetClientRect()</tt>. Бросает исключение в случае ошибки.</p>
  94. </synopsis>
  95. <synopsis>
  96. <prototype>void SetText(LPCWSTR st)</prototype>
  97. <p>Вызывает <tt>::SetWindowTextW()</tt>. Бросает исключение в случае ошибки.</p>
  98. </synopsis>
  99. <synopsis>
  100. <prototype>void SetText(const char *st)</prototype>
  101. <p>Конвертирует указанную строку из UTF-8 в UTF-16, затем вызывает
  102. <tt>SetText()</tt>. Бросает исключение в случае ошибки.</p>
  103. </synopsis>
  104. <synopsis>
  105. <prototype>int GetText(LPWSTR st, int nMax) const</prototype>
  106. <p>Вызывает <tt>::GetWindowTextW()</tt> и возвращает возвращённое значение.</p>
  107. </synopsis>
  108. <synopsis>
  109. <prototype>void SetPos(HWND hWndAfter, int x, int y, int w, int h, UINT uFlags)</prototype>
  110. <p>Вызывает <tt>::SetWindowPos()</tt>. Бросает исключение в случае ошибки.</p>
  111. </synopsis>
  112. <synopsis>
  113. <prototype>void SetPos(int x, int y, int w, int h)</prototype>
  114. <p>Устанавливает положение и размер окна. Бросает исключение в случае
  115. ошибки.</p>
  116. </synopsis>
  117. <synopsis>
  118. <prototype>void SetSize(int w, int h)</prototype>
  119. <p>Устанавливает размер окна. Бросает исключение в случае ошибки.</p>
  120. </synopsis>
  121. <synopsis>
  122. <prototype>void SetClientAreaSize(int w, int h)</prototype>
  123. <p>Устанавливает размер клиентской зоны окна. Бросает исключение в случае
  124. ошибки.</p>
  125. </synopsis>
  126. <synopsis>
  127. <prototype>void MoveTo(int x, int y)</prototype>
  128. <p>Перемещает окно в указанную позицию. Бросает исключение в случае ошибки.</p>
  129. </synopsis>
  130. <synopsis>
  131. <prototype>void MoveToCenter()</prototype>
  132. <p>Перемещает окно в центр экрана. Бросает исключение в случае ошибки.</p>
  133. </synopsis>
  134. <synopsis>
  135. <prototype>HWND Handle() const</prototype>
  136. <prototype>operator HWND() const</prototype>
  137. <p>Возвращает обёрнутое значение HWND.</p>
  138. </synopsis>
  139. <synopsis>
  140. <prototype>void Handle(HWND hwnd)</prototype>
  141. <postcondition><tt>Handle() == hwnd</tt></postcondition>
  142. </synopsis>
  143. </section>
  144. <section><title>Пример</title>
  145. <code-block lang="C++"><![CDATA[
  146. // Каркас Win32-API-приложения
  147. #include<__vic/windows/window.h>
  148. #include<windows.h>
  149. #include<exception>
  150. extern "C" LRESULT CALLBACK WindowFunc(
  151. HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  152. {
  153. switch(msg)
  154. {
  155. case WM_DESTROY:
  156. PostQuitMessage(0); break;
  157. default:
  158. return DefWindowProc(hwnd, msg, wParam, lParam);
  159. }
  160. return 0;
  161. }
  162. WPARAM skeleton_win32_app(int nWinMode)
  163. {
  164. using __vic::windows::Window;
  165. static wchar_t szWinClassName[] = L"TestAppClass";
  166. Window wnd;
  167. HINSTANCE hInstance = ::GetModuleHandle(0);
  168. HICON hIcon = LoadIcon(NULL, IDI_APPLICATION);
  169. Window::Register(Window::Class(hInstance, szWinClassName, WindowFunc)
  170. .Icon(hIcon)
  171. .SmallIcon(hIcon)
  172. .Cursor(LoadCursor(0, IDC_ARROW))
  173. .Background((HBRUSH) GetStockObject(GRAY_BRUSH))
  174. );
  175. wnd.Create(Window::CreateParams(hInstance,
  176. szWinClassName, L"Skeleton Win32 application"));
  177. wnd.Show(nWinMode);
  178. wnd.Update();
  179. return __vic::windows::MessageLoop();
  180. }
  181. int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR lpszArgs, int nWinMode)
  182. {
  183. try
  184. {
  185. return skeleton_win32_app(nWinMode);
  186. }
  187. catch(const std::exception &ex)
  188. {
  189. __vic::windows::MsgBox(ex.what(),
  190. "Application error", MB_OK | MB_ICONERROR);
  191. }
  192. return 1;
  193. }
  194. ]]></code-block>
  195. </section>
  196. </chapter>
  197. <chapter xml:id="windows--Window--Class">
  198. <title><tt>windows::Window::Class</tt></title>
  199. <code-block lang="C++"><![CDATA[
  200. struct windows::Window::Class : WNDCLASSEXW
  201. {
  202. Class(HMODULE hInst, LPCWSTR name, WNDPROC wndProc)
  203. {
  204. cbSize = sizeof(WNDCLASSEXW);
  205. style = 0;
  206. lpfnWndProc = wndProc;
  207. cbClsExtra = cbWndExtra = 0;
  208. hInstance = hInst;
  209. hIcon = 0;
  210. hCursor = ::LoadCursorW(0, IDC_ARROW);
  211. hbrBackground = 0;
  212. lpszMenuName = 0;
  213. lpszClassName = name;
  214. hIconSm = 0;
  215. }
  216. Class &Style(UINT v) { style = v; return *this; }
  217. Class &ClsExtra(int v) { cbClsExtra = v; return *this; }
  218. Class &WndExtra(int v) { cbWndExtra = v; return *this; }
  219. Class &Instance(HINSTANCE v) { hInstance = v; return *this; }
  220. Class &Icon(HICON v) { hIcon = v; return *this; }
  221. Class &Cursor(HCURSOR v) { hCursor = v; return *this; }
  222. Class &Background(HBRUSH v) { hbrBackground = v; return *this; }
  223. Class &MenuName(LPCWSTR v) { lpszMenuName = v; return *this; }
  224. Class &SmallIcon(HICON v) { hIconSm = v; return *this; }
  225. };
  226. ]]></code-block>
  227. <p>Обёртка для <tt>WNDCLASSEXW</tt>.</p>
  228. <section><title>Пример</title>
  229. <code-block lang="C++">
  230. using __vic::windows::Windows;
  231. Window::Register(Window::Class(hInstance, WndClassName, wndProc)
  232. .Icon(hIcon)
  233. .SmallIcon(hIcon)
  234. .Cursor(::LoadCursor(nullptr, IDC_ARROW))
  235. .Background((HBRUSH) ::GetStockObject(LTGRAY_BRUSH))
  236. );
  237. </code-block>
  238. </section>
  239. </chapter>
  240. <chapter xml:id="windows--Window--CreateParams">
  241. <title><tt>windows::Window::CreateParams</tt></title>
  242. <code-block lang="C++"><![CDATA[
  243. struct windows::Window::CreateParams : CREATESTRUCTW
  244. {
  245. CreateParams(HMODULE hInst, LPCWSTR lpClsName, LPCWSTR lpWndName = nullptr)
  246. {
  247. lpCreateParams = 0;
  248. hInstance = hInst;
  249. hMenu = 0;
  250. hwndParent = HWND_DESKTOP;
  251. cy = cx = y = x = CW_USEDEFAULT;
  252. style = WS_OVERLAPPEDWINDOW;
  253. lpszName = lpWndName;
  254. lpszClass = lpClsName;
  255. dwExStyle = 0;
  256. }
  257. CreateParams &ExtraParam(void *v) { lpCreateParams = v; return *this; }
  258. CreateParams &Instance(HINSTANCE v) { hInstance = v; return *this; }
  259. CreateParams &Menu(HMENU v) { hMenu = v; return *this; }
  260. CreateParams &Parent(HWND v) { hwndParent = v; return *this; }
  261. CreateParams &Position(int X, int Y) { x = X; y = Y; return *this; }
  262. CreateParams &Dimension(int w, int h) { cx = w; cy = h; return *this; }
  263. CreateParams &Style(DWORD v) { style = v; return *this; }
  264. CreateParams &ExStyle(DWORD v) { dwExStyle = v; return *this; }
  265. };
  266. ]]></code-block>
  267. <p>Обёртка для <tt>CREATESTRUCTW</tt>.</p>
  268. <section><title>Пример</title>
  269. <code-block lang="C++">
  270. using __vic::windows::Windows;
  271. Windows wnd;
  272. wnd.Create(Window::CreateParams(hInstance, className, title).Position(x, y));
  273. </code-block>
  274. </section>
  275. </chapter>
  276. <chapter xml:id="windows--MsgBox">
  277. <title><tt>windows::MsgBox()</tt></title>
  278. <code-block lang="C++">
  279. int windows::MsgBox(HWND hwnd,
  280. const wchar_t *msg, const wchar_t *title = L"", int t = MB_OK);
  281. int windows::MsgBox(
  282. const wchar_t *msg, const wchar_t *title = L"", int t = MB_OK);
  283. int windows::MsgBox(HWND hwnd,
  284. const char *msg, const char *title = "", int t = MB_OK);
  285. int windows::MsgBox(
  286. const char *msg, const char *title = "", int t = MB_OK)
  287. </code-block>
  288. <p>Вызывает <tt>::MessageBoxW()</tt> и возвращает возвращённое значение.
  289. Параметр <tt>hwnd</tt> равен <tt>NULL</tt> (<tt>HWND_DESKTOP</tt>), если не
  290. указан. Функции <tt>char</tt> конвертируют строки из UTF-8 в UTF-16.</p>
  291. </chapter>
  292. <chapter xml:id="windows--MessageLoop">
  293. <title><tt>windows::MessageLoop()</tt></title>
  294. <code-block lang="C++">
  295. WPARAM windows::MessageLoop(HWND hwnd = NULL);
  296. </code-block>
  297. <p>Вызывает <tt>::GetMessage()</tt> в цикле пока она возвращает ненулевое
  298. значение (пока не вычитано <tt>WM_QUIT</tt>). Затем вызывает
  299. <tt>::TranslateMessage()</tt> и <tt>::DispatchMessage()</tt> с вычитанным
  300. сообщением. Возвращает <tt>MSG::wParam</tt>.</p>
  301. </chapter>
  302. <chapter xml:id="windows--ProcessMessages">
  303. <title><tt>windows::ProcessMessages()</tt></title>
  304. <code-block lang="C++">
  305. bool windows::ProcessMessages(HWND hwnd = NULL);
  306. </code-block>
  307. <p>Аналог <xref to="windows--MessageLoop"/>, но возвращает управление при
  308. опустении очереди. Возвращает <tt>true</tt>, если может быть вызвана ещё раз,
  309. и <tt>false</tt>, если вычитано сообщение <tt>WM_QUIT</tt>.</p>
  310. </chapter>
  311. </chapter>