Advertisement
Val_Kir

Лекция 7

Apr 21st, 2021
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 39.48 KB | None | 0 0
  1. AboutD2
  2. AboutD2.cpp
  3. // AboutD2.cpp: Определяет точку входа для приложения.
  4. //
  5. #include "stdafx.h"
  6. #include "AboutD2.h"
  7. #define MAX_LOADSTRING 100
  8. template <class T> void SafeRelease(T **ppT)
  9. {
  10. if (*ppT)
  11. {
  12. (*ppT)->Release();
  13. *ppT = NULL;
  14. }
  15. }
  16. // Глобальные переменные:
  17. HINSTANCE hInst; // текущий экземпляр
  18. HWND m_hwnd;
  19. WCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка
  20. WCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна
  21. int iCurrentColor = IDC_BLACK,
  22. iCurrentFigure = IDC_RECT;
  23. const D2D1_COLOR_F crColor[8] = { D2D1::ColorF(0.0f, 0.0f, 0.0f),
  24. D2D1::ColorF(0.0f, 0.0f, 1.0f),
  25. D2D1::ColorF(0.0f, 1.0f, 0.0f),
  26. D2D1::ColorF(0.0f, 1.0f, 1.0f),
  27. D2D1::ColorF(1.0f, 0.0f, 0.0f),
  28. D2D1::ColorF(1.0f, 0.0f, 1.0f),
  29. D2D1::ColorF(1.0f, 1.0f, 0.0f),
  30. D2D1::ColorF(1.0f, 1.0f, 1.0f)
  31. };
  32. // Отправить объявления функций, включенных в этот модуль кода:
  33. ATOM MyRegisterClass(HINSTANCE hInstance);
  34. BOOL InitInstance(HINSTANCE, int);
  35. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  36. INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  37. ID2D1Factory *pFactory(nullptr);
  38. ID2D1HwndRenderTarget *pRenderTarget(nullptr);
  39. ID2D1SolidColorBrush *pBrush(nullptr);
  40. D2D1_ELLIPSE ellipse;
  41. void CalculateLayout(ID2D1HwndRenderTarget *pTarget, D2D1_ELLIPSE& ell);
  42. HRESULT CreateGraphicsResources(ID2D1HwndRenderTarget **ppTarget, HWND hwnd);
  43. void OnPaint();
  44. void Resize();
  45. void PaintWindow(ID2D1HwndRenderTarget *pTarget, D2D1_ELLIPSE& ell, ID2D1SolidColorBrush **ppBrush,
  46. int iColor, int iFigure);
  47. void CalculateLayout(ID2D1HwndRenderTarget *pTarget, D2D1_ELLIPSE& ell)
  48. {
  49. if (pTarget != NULL)
  50. {
  51. D2D1_SIZE_F size = pTarget->GetSize();
  52. const float x = size.width / 2;
  53. const float y = size.height / 2;
  54. ell = D2D1::Ellipse(D2D1::Point2F(x, y), x, y);
  55. }
  56. }
  57. HRESULT CreateGraphicsResources(ID2D1HwndRenderTarget **ppTarget, HWND hwnd)
  58. {
  59. HRESULT hr = S_OK;
  60. if (*ppTarget == NULL)
  61. {
  62. RECT rc;
  63. GetClientRect(hwnd, &rc);
  64. D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom);
  65. hr = pFactory->CreateHwndRenderTarget(
  66. D2D1::RenderTargetProperties(),
  67. D2D1::HwndRenderTargetProperties(hwnd, size),
  68. ppTarget);
  69. if (SUCCEEDED(hr))
  70. {
  71. CalculateLayout(*ppTarget,ellipse);
  72. }
  73. }
  74. return hr;
  75. }
  76. void OnPaint()
  77. {
  78. HRESULT hr = CreateGraphicsResources(&pRenderTarget, m_hwnd);
  79. if (SUCCEEDED(hr))
  80. {
  81. PAINTSTRUCT ps;
  82. BeginPaint(m_hwnd, &ps);
  83. PaintWindow(pRenderTarget, ellipse, &pBrush, iCurrentColor, iCurrentFigure);
  84. EndPaint(m_hwnd, &ps);
  85. }
  86. }
  87. void Resize()
  88. {
  89. if (pRenderTarget != NULL)
  90. {
  91. RECT rc;
  92. GetClientRect(m_hwnd, &rc);
  93. D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom);
  94. pRenderTarget->Resize(size);
  95. CalculateLayout(pRenderTarget, ellipse);
  96. InvalidateRect(m_hwnd, NULL, FALSE);
  97. }
  98. }
  99. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  100. _In_opt_ HINSTANCE hPrevInstance,
  101. _In_ LPWSTR lpCmdLine,
  102. _In_ int nCmdShow)
  103. {
  104. UNREFERENCED_PARAMETER(hPrevInstance);
  105. UNREFERENCED_PARAMETER(lpCmdLine);
  106. // TODO: разместите код здесь.
  107. // Инициализация глобальных строк
  108. LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  109. LoadStringW(hInstance, IDC_ABOUTD2, szWindowClass, MAX_LOADSTRING);
  110. MyRegisterClass(hInstance);
  111. // Выполнить инициализацию приложения:
  112. if (!InitInstance (hInstance, nCmdShow))
  113. {
  114. return FALSE;
  115. }
  116. HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ABOUTD2));
  117. MSG msg;
  118. // Цикл основного сообщения:
  119. while (GetMessage(&msg, nullptr, 0, 0))
  120. {
  121. if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  122. {
  123. TranslateMessage(&msg);
  124. DispatchMessage(&msg);
  125. }
  126. }
  127. return (int) msg.wParam;
  128. }
  129. //
  130. // ФУНКЦИЯ: MyRegisterClass()
  131. //
  132. // НАЗНАЧЕНИЕ: регистрирует класс окна.
  133. //
  134. ATOM MyRegisterClass(HINSTANCE hInstance)
  135. {
  136. WNDCLASSEXW wcex;
  137. wcex.cbSize = sizeof(WNDCLASSEX);
  138. wcex.style = CS_HREDRAW | CS_VREDRAW;
  139. wcex.lpfnWndProc = WndProc;
  140. wcex.cbClsExtra = 0;
  141. wcex.cbWndExtra = 0;
  142. wcex.hInstance = hInstance;
  143. wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ABOUTD2));
  144. wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
  145. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  146. wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_ABOUTD2);
  147. wcex.lpszClassName = szWindowClass;
  148. wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  149. return RegisterClassExW(&wcex);
  150. }
  151. //
  152. // ФУНКЦИЯ: InitInstance(HINSTANCE, int)
  153. //
  154. // НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
  155. //
  156. // КОММЕНТАРИИ:
  157. //
  158. // В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
  159. // создается и выводится на экран главное окно программы.
  160. //
  161. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  162. {
  163. hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
  164. HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  165. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
  166. if (!hWnd)
  167. {
  168. return FALSE;
  169. }
  170. m_hwnd = hWnd;
  171. ShowWindow(hWnd, nCmdShow);
  172. UpdateWindow(hWnd);
  173. return TRUE;
  174. }
  175. void PaintWindow(ID2D1HwndRenderTarget *pTarget, D2D1_ELLIPSE& ell, ID2D1SolidColorBrush **ppBrush,
  176. int iColor, int iFigure)
  177. {
  178. HRESULT hr;
  179. pTarget->BeginDraw();
  180. if (iFigure == IDC_RECT)
  181. pTarget->Clear(crColor[iColor - IDC_BLACK]);
  182. else
  183. {
  184. hr = pTarget->CreateSolidColorBrush(crColor[iColor - IDC_BLACK], ppBrush);
  185. if (SUCCEEDED(hr))
  186. {
  187. pTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
  188. pTarget->FillEllipse(ell, *ppBrush);
  189. SafeRelease(ppBrush);
  190. }
  191. }
  192. hr = pTarget->EndDraw();
  193. if (FAILED(hr) || hr == D2DERR_RECREATE_TARGET)
  194. {
  195. SafeRelease(&pTarget);
  196. }
  197. }
  198. void PaintTheBlock(HWND hCtrl, ID2D1HwndRenderTarget *pTarget, D2D1_ELLIPSE& ell,
  199. ID2D1SolidColorBrush **ppBrush, int iColor, int iFigure)
  200. {
  201. InvalidateRect(hCtrl, NULL, TRUE);
  202. UpdateWindow(hCtrl);
  203. PaintWindow(pTarget, ell, ppBrush, iColor, iFigure);
  204. }
  205. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  206. {
  207. static HINSTANCE hInstance;
  208. switch (message)
  209. {
  210. case WM_CREATE:
  211. hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
  212. if (FAILED(D2D1CreateFactory(
  213. D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory)))
  214. {
  215. return -1; // Неудача CreateWindowEx.
  216. }
  217. return 0;
  218. case WM_COMMAND:
  219. {
  220. int wmId = LOWORD(wParam);
  221. // Разобрать выбор в меню:
  222. switch (wmId)
  223. {
  224. case IDM_ABOUT:
  225. if (DialogBox(hInstance, TEXT("AboutBox"), hwnd, About))
  226. InvalidateRect(hwnd, NULL, TRUE);
  227. break;
  228. case IDM_EXIT:
  229. DestroyWindow(hwnd);
  230. break;
  231. default:
  232. return DefWindowProc(hwnd, message, wParam, lParam);
  233. }
  234. }
  235. break;
  236. case WM_PAINT:
  237. OnPaint();
  238. return 0;
  239. case WM_DESTROY:
  240. SafeRelease(&pRenderTarget);
  241. SafeRelease(&pFactory);
  242. PostQuitMessage(0);
  243. return 0;
  244.  
  245. case WM_SIZE:
  246. Resize();
  247. return 0;
  248. }
  249. return DefWindowProc(hwnd, message, wParam, lParam);
  250. }
  251. // Обработчик сообщений для окна "О программе".
  252. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  253. {
  254. HRESULT hr = S_OK;
  255. static HWND hCtrlBlock;
  256. static int iColor, iFigure;
  257. static ID2D1HwndRenderTarget *pBlockTarget(nullptr);
  258. static ID2D1SolidColorBrush *pb_Brush(nullptr);
  259. static D2D1_ELLIPSE b_ellipse;
  260. switch (message)
  261. {
  262. case WM_INITDIALOG:
  263. iColor = iCurrentColor;
  264. iFigure = iCurrentFigure;
  265. CheckRadioButton(hDlg, IDC_BLACK, IDC_WHITE, iColor);
  266. CheckRadioButton(hDlg, IDC_RECT, IDC_ELLIPSE, iFigure);
  267. hCtrlBlock = GetDlgItem(hDlg, IDC_PAINT);
  268. RECT rc;
  269. GetClientRect(hCtrlBlock, &rc);
  270. D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom);
  271. hr = pFactory->CreateHwndRenderTarget(
  272. D2D1::RenderTargetProperties(),
  273. D2D1::HwndRenderTargetProperties(hCtrlBlock, size),
  274. &pBlockTarget);
  275. if (SUCCEEDED(hr))
  276. {
  277. CalculateLayout(pBlockTarget, b_ellipse);
  278. }
  279. SetFocus(GetDlgItem(hDlg, iColor));
  280. return FALSE;
  281. case WM_COMMAND:
  282. switch (LOWORD(wParam))
  283. {
  284. case IDOK:
  285. iCurrentColor = iColor;
  286. iCurrentFigure = iFigure;
  287. SafeRelease(&pBlockTarget);
  288. EndDialog(hDlg, TRUE);
  289. return TRUE;
  290. case IDCANCEL:
  291. SafeRelease(&pBlockTarget);
  292. EndDialog(hDlg, FALSE);
  293. return TRUE;
  294. case IDC_BLACK:
  295. case IDC_RED:
  296. case IDC_GREEN:
  297. case IDC_YELLOW:
  298. case IDC_BLUE:
  299. case IDC_MAGENTA:
  300. case IDC_CYAN:
  301. case IDC_WHITE:
  302. iColor = LOWORD(wParam);
  303. CheckRadioButton(hDlg, IDC_BLACK, IDC_WHITE, LOWORD(wParam));
  304. PaintTheBlock(hCtrlBlock, pBlockTarget, b_ellipse, &pb_Brush, iColor, iFigure);
  305. return TRUE;
  306. case IDC_RECT:
  307. case IDC_ELLIPSE:
  308. iFigure = LOWORD(wParam);
  309. CheckRadioButton(hDlg, IDC_RECT, IDC_ELLIPSE, LOWORD(wParam));
  310. PaintTheBlock(hCtrlBlock, pBlockTarget, b_ellipse, &pb_Brush, iColor, iFigure);
  311. return TRUE;
  312. }
  313. break;
  314. case WM_PAINT:
  315. PaintTheBlock(hCtrlBlock, pBlockTarget, b_ellipse, &pb_Brush, iColor, iFigure);
  316. break;
  317. }
  318. return FALSE;
  319. }
  320. AboutD2.rc
  321. //Скрипт ресурсов, созданный в Microsoft Visual C++.
  322. //
  323. #include "resource.h"
  324. #define APSTUDIO_READONLY_SYMBOLS
  325. /////////////////////////////////////////////////////////////////////////////
  326. //
  327. // Создано из ресурса TEXTINCLUDE 2.
  328. //
  329. #ifndef APSTUDIO_INVOKED
  330. #include "targetver.h"
  331. #endif
  332. #define APSTUDIO_HIDDEN_SYMBOLS
  333. #include "windows.h"
  334. #undef APSTUDIO_HIDDEN_SYMBOLS
  335. /////////////////////////////////////////////////////////////////////////////
  336. #undef APSTUDIO_READONLY_SYMBOLS
  337. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
  338. LANGUAGE 25, 1
  339. /////////////////////////////////////////////////////////////////////////////
  340. //
  341. // Значок
  342. //
  343. // Значок с наименьшим значением идентификатора помещается первым, чтобы гарантировать использование
  344. // идентичного значка приложения для всех систем.
  345. IDI_ABOUTD2 ICON "About2.ico"
  346. IDI_SMALL ICON "small.ico"
  347. /////////////////////////////////////////////////////////////////////////////
  348. //
  349. // Меню
  350. //
  351. IDC_ABOUTD2 MENU
  352. BEGIN
  353. POPUP "&Файл"
  354. BEGIN
  355. MENUITEM "В&ыход", IDM_EXIT
  356. END
  357. POPUP "&Справка"
  358. BEGIN
  359. MENUITEM "&О программе ...", IDM_ABOUT
  360. END
  361. END
  362.  
  363. /////////////////////////////////////////////////////////////////////////////
  364. //
  365. // Сочетание клавиш
  366. //
  367. IDC_ABOUTD2 ACCELERATORS
  368. BEGIN
  369. "?", IDM_ABOUT, ASCII, ALT
  370. "/", IDM_ABOUT, ASCII, ALT
  371. END
  372.  
  373. /////////////////////////////////////////////////////////////////////////////
  374. //
  375. // Dialog
  376. //
  377. ABOUTBOX DIALOG DISCARDABLE 32, 32, 200, 234
  378. STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
  379. FONT 8, "MS Sans Serif"
  380. BEGIN
  381. ICON "ABOUT2", IDC_STATIC, 7, 7, 20, 20
  382. CTEXT "AboutD2", IDC_STATIC, 57, 12, 86, 8
  383. CTEXT "About Box Demo Program", IDC_STATIC, 7, 40, 186, 8
  384. LTEXT "", IDC_PAINT, 114, 67, 72, 72
  385. GROUPBOX "&Color", IDC_STATIC, 7, 60, 84, 143
  386. RADIOBUTTON "&Black", IDC_BLACK, 16, 76, 64, 8, WS_GROUP | WS_TABSTOP
  387. RADIOBUTTON "B&lue", IDC_BLUE, 16, 92, 64, 8
  388. RADIOBUTTON "&Green", IDC_GREEN, 16, 108, 64, 8
  389. RADIOBUTTON "Cya&n", IDC_CYAN, 16, 124, 64, 8
  390. RADIOBUTTON "&Red", IDC_RED, 16, 140, 64, 8
  391. RADIOBUTTON "&Magenta", IDC_MAGENTA, 16, 156, 64, 8
  392. RADIOBUTTON "&Yellow", IDC_YELLOW, 16, 172, 64, 8
  393. RADIOBUTTON "&White", IDC_WHITE, 16, 188, 64, 8
  394. GROUPBOX "&Figure", IDC_STATIC, 109, 156, 84, 46, WS_GROUP
  395. RADIOBUTTON "Rec&tangle", IDC_RECT, 116, 172, 65, 8, WS_GROUP | WS_TABSTOP
  396. RADIOBUTTON "&Ellipse", IDC_ELLIPSE, 116, 188, 64, 8
  397. DEFPUSHBUTTON "OK", IDOK, 35, 212, 50, 14, WS_GROUP
  398. PUSHBUTTON "Cancel", IDCANCEL, 113, 212, 50, 14, WS_GROUP
  399. END
  400.  
  401. /////////////////////////////////////////////////////////////////////////////
  402. //
  403. // Icon
  404. //
  405. // Icon with lowest ID value placed first to ensure application icon
  406. // remains consistent on all systems.
  407. ABOUT2 ICON DISCARDABLE "About2.ico"
  408. /////////////////////////////////////////////////////////////////////////////
  409. //
  410. // DESIGNINFO
  411. //
  412. #ifdef APSTUDIO_INVOKED
  413. GUIDELINES DESIGNINFO
  414. BEGIN
  415. IDD_ABOUTBOX, DIALOG
  416. BEGIN
  417. LEFTMARGIN, 7
  418. RIGHTMARGIN, 163
  419. TOPMARGIN, 7
  420. BOTTOMMARGIN, 55
  421. END
  422. END
  423. #endif // APSTUDIO_INVOKED
  424. #ifdef APSTUDIO_INVOKED
  425. /////////////////////////////////////////////////////////////////////////////
  426. //
  427. // TEXTINCLUDE
  428. //
  429. 1 TEXTINCLUDE
  430. BEGIN
  431. "resource.h\0"
  432. END
  433. 2 TEXTINCLUDE
  434. BEGIN
  435. "#ifndef APSTUDIO_INVOKED\r\n"
  436. "#include ""targetver.h""\r\n"
  437. "#endif\r\n"
  438. "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
  439. "#include ""windows.h""\r\n"
  440. "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
  441. "\0"
  442. END
  443. 3 TEXTINCLUDE
  444. BEGIN
  445. "\r\n"
  446. "\0"
  447. END
  448. #endif // APSTUDIO_INVOKED
  449. /////////////////////////////////////////////////////////////////////////////
  450. //
  451. // Таблица строк
  452. //
  453. STRINGTABLE
  454. BEGIN
  455. IDC_ABOUTD2 "ABOUTD2"
  456. IDS_APP_TITLE "AboutD2"
  457. END
  458. #endif
  459. /////////////////////////////////////////////////////////////////////////////
  460. #ifndef APSTUDIO_INVOKED
  461. /////////////////////////////////////////////////////////////////////////////
  462. //
  463. // Создано из ресурса TEXTINCLUDE 3.
  464. //
  465. /////////////////////////////////////////////////////////////////////////////
  466. #endif // не APSTUDIO_INVOKED
  467. Resource.h
  468. //{{NO_DEPENDENCIES}}
  469. // Microsoft Visual C++ generated include file.
  470. // Используется в файле AboutD2.rc
  471. //
  472. #define IDC_BLACK 1000
  473. #define IDC_BLUE 1001
  474. #define IDC_GREEN 1002
  475. #define IDC_CYAN 1003
  476. #define IDC_RED 1004
  477. #define IDC_MAGENTA 1005
  478. #define IDC_YELLOW 1006
  479. #define IDC_WHITE 1007
  480. #define IDC_RECT 1008
  481. #define IDC_ELLIPSE 1009
  482. #define IDC_PAINT 1010
  483. #define IDS_APP_TITLE 103
  484. #define IDR_MAINFRAME 128
  485. #define IDD_ABOUTD2_DIALOG 102
  486. #define IDD_ABOUTBOX 103
  487. #define IDM_ABOUT 104
  488. #define IDM_EXIT 105
  489. #define IDI_ABOUTD2 107
  490. #define IDI_SMALL 108
  491. #define IDC_ABOUTD2 109
  492. #define IDC_MYICON 2
  493. #ifndef IDC_STATIC
  494. #define IDC_STATIC -1
  495. #endif
  496. // Следующие стандартные значения для новых объектов
  497. //
  498. #ifdef APSTUDIO_INVOKED
  499. #ifndef APSTUDIO_READONLY_SYMBOLS
  500. #define _APS_NO_MFC 130
  501. #define _APS_NEXT_RESOURCE_VALUE 129
  502. #define _APS_NEXT_COMMAND_VALUE 32771
  503. #define _APS_NEXT_CONTROL_VALUE 1000
  504. #define _APS_NEXT_SYMED_VALUE 110
  505. #endif
  506. #endif
  507. AboutD3
  508.  
  509. AboutD3.cpp
  510. // AboutD3.cpp: Определяет точку входа для приложения.
  511. //
  512. #include "stdafx.h"
  513. #include "AboutD3.h"
  514. #include "Direct2D.h"
  515. //#pragma comment(lib, "d2d1")
  516. //#pragma comment(lib, "DWrite")
  517. #define MAX_LOADSTRING 100
  518. // Глобальные переменные:
  519. HINSTANCE hInst; // текущий экземпляр
  520. WCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка
  521. WCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна
  522. Direct2D d2d;
  523. // Отправить объявления функций, включенных в этот модуль кода:
  524. ATOM MyRegisterClass(HINSTANCE hInstance);
  525. BOOL InitInstance(HINSTANCE, int);
  526. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  527. INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  528. LRESULT CALLBACK EllipPushWndProc(HWND, UINT, WPARAM, LPARAM);
  529. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  530. _In_opt_ HINSTANCE hPrevInstance,
  531. _In_ LPWSTR lpCmdLine,
  532. _In_ int nCmdShow)
  533. {
  534. UNREFERENCED_PARAMETER(hPrevInstance);
  535. UNREFERENCED_PARAMETER(lpCmdLine);
  536. // TODO: разместите код здесь.
  537. // Инициализация глобальных строк
  538. LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  539. LoadStringW(hInstance, IDC_ABOUTD3, szWindowClass, MAX_LOADSTRING);
  540. MyRegisterClass(hInstance);
  541. // Выполнить инициализацию приложения:
  542. if (!InitInstance (hInstance, nCmdShow))
  543. {
  544. return FALSE;
  545. }
  546. HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ABOUTD3));
  547. MSG msg;
  548. // Цикл основного сообщения:
  549. while (GetMessage(&msg, nullptr, 0, 0))
  550. {
  551. if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  552. {
  553. TranslateMessage(&msg);
  554. DispatchMessage(&msg);
  555. }
  556. }
  557. return (int) msg.wParam;
  558. }
  559. //
  560. // ФУНКЦИЯ: MyRegisterClass()
  561. //
  562. // НАЗНАЧЕНИЕ: регистрирует класс окна.
  563. //
  564. ATOM MyRegisterClass(HINSTANCE hInstance)
  565. {
  566. WNDCLASSEXW wcex;
  567. wcex.cbSize = sizeof(WNDCLASSEX);
  568. wcex.style = CS_HREDRAW | CS_VREDRAW;
  569. wcex.lpfnWndProc = WndProc;
  570. wcex.cbClsExtra = 0;
  571. wcex.cbWndExtra = 0;
  572. wcex.hInstance = hInstance;
  573. wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ABOUTD3));
  574. wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
  575. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  576. wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_ABOUTD3);
  577. wcex.lpszClassName = szWindowClass;
  578. wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  579. RegisterClassExW(&wcex);
  580. wcex.style = CS_HREDRAW | CS_VREDRAW;
  581. wcex.lpfnWndProc = EllipPushWndProc;
  582. wcex.cbClsExtra = 0;
  583. wcex.cbWndExtra = 0;
  584. wcex.hInstance = hInstance;
  585. wcex.hIcon = NULL;
  586. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  587. wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
  588. wcex.lpszMenuName = NULL;
  589. wcex.lpszClassName = TEXT("EllipPush");
  590. return RegisterClassExW(&wcex);
  591. }
  592. //
  593. // ФУНКЦИЯ: InitInstance(HINSTANCE, int)
  594. //
  595. // НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
  596. //
  597. // КОММЕНТАРИИ:
  598. //
  599. // В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
  600. // создается и выводится на экран главное окно программы.
  601. //
  602. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  603. {
  604. hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
  605. HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  606. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
  607. if (!hWnd)
  608. {
  609. return FALSE;
  610. }
  611. ShowWindow(hWnd, nCmdShow);
  612. UpdateWindow(hWnd);
  613. return TRUE;
  614. }
  615. void Resize(HWND hwnd)
  616. {
  617. if (d2d.pRenderTarget != NULL)
  618. {
  619. RECT rc;
  620. GetClientRect(hwnd, &rc);
  621. D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom);
  622. d2d.pRenderTarget->Resize(size);
  623. d2d.CalculateLayout();
  624. InvalidateRect(hwnd, NULL, FALSE);
  625. }
  626. }
  627. //
  628. // ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
  629. //
  630. // НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.
  631. //
  632. // WM_COMMAND — обработать меню приложения
  633. // WM_PAINT — отрисовать главное окно
  634. // WM_DESTROY — отправить сообщение о выходе и вернуться
  635. //
  636. //
  637. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  638. {
  639. switch (message)
  640. {
  641. case WM_CREATE:
  642. if (!d2d.CreateDeviceIndependentResources())
  643. {
  644. return -1; // Неудача CreateWindowEx.
  645. }
  646. return 0;
  647. case WM_COMMAND:
  648. {
  649. int wmId = LOWORD(wParam);
  650. // Разобрать выбор в меню:
  651. switch (wmId)
  652. {
  653. case IDM_ABOUT:
  654. DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  655. break;
  656. case IDM_EXIT:
  657. DestroyWindow(hWnd);
  658. break;
  659. default:
  660. return DefWindowProc(hWnd, message, wParam, lParam);
  661. }
  662. }
  663. break;
  664. case WM_PAINT:
  665. {
  666. PAINTSTRUCT ps;
  667. HDC hdc = BeginPaint(hWnd, &ps);
  668. // d2d.OnPaintScene(hWnd);
  669. EndPaint(hWnd, &ps);
  670. }
  671. break;
  672.  
  673. case WM_SIZE:
  674. Resize(hWnd);
  675. return 0;
  676. case WM_DESTROY:
  677. d2d.DiscardGraphicsResources();
  678. d2d.ReleaseFactory();
  679. PostQuitMessage(0);
  680. break;
  681. default:
  682. return DefWindowProc(hWnd, message, wParam, lParam);
  683. }
  684. return 0;
  685. }
  686. // Обработчик сообщений для окна "О программе".
  687. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  688. {
  689. UNREFERENCED_PARAMETER(lParam);
  690. switch (message)
  691. {
  692. case WM_INITDIALOG:
  693. return (INT_PTR)TRUE;
  694. case WM_COMMAND:
  695. if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  696. {
  697. EndDialog(hDlg, LOWORD(wParam));
  698. return (INT_PTR)TRUE;
  699. }
  700. break;
  701. }
  702. return (INT_PTR)FALSE;
  703. }
  704. LRESULT CALLBACK EllipPushWndProc(HWND hwnd, UINT message,
  705. WPARAM wParam, LPARAM lParam)
  706. {
  707. HDC hdc;
  708. PAINTSTRUCT ps;
  709. switch (message)
  710. {
  711. case WM_PAINT:
  712. hdc = BeginPaint(hwnd, &ps);
  713. d2d.OnPaintScene(hwnd);
  714. EndPaint(hwnd, &ps);
  715. return 0;
  716. case WM_KEYUP:
  717. if (wParam != VK_SPACE)
  718. break;
  719. // fall through
  720. case WM_LBUTTONUP:
  721. SendMessage(GetParent(hwnd), WM_COMMAND,
  722. GetWindowLong(hwnd, GWL_ID), (LPARAM)hwnd);
  723. return 0;
  724. }
  725. return DefWindowProc(hwnd, message, wParam, lParam);
  726. }
  727. AboutD3.rc
  728. //Скрипт ресурсов, созданный в Microsoft Visual C++.
  729. //
  730. #include "resource.h"
  731. #define APSTUDIO_READONLY_SYMBOLS
  732. /////////////////////////////////////////////////////////////////////////////
  733. //
  734. // Создано из ресурса TEXTINCLUDE 2.
  735. //
  736. #ifndef APSTUDIO_INVOKED
  737. #include "targetver.h"
  738. #endif
  739. #define APSTUDIO_HIDDEN_SYMBOLS
  740. #include "windows.h"
  741. #undef APSTUDIO_HIDDEN_SYMBOLS
  742. /////////////////////////////////////////////////////////////////////////////
  743. #undef APSTUDIO_READONLY_SYMBOLS
  744. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
  745. LANGUAGE 25, 1
  746. /////////////////////////////////////////////////////////////////////////////
  747. //
  748. // Значок
  749. //
  750. // Значок с наименьшим значением идентификатора помещается первым, чтобы гарантировать использование
  751. // идентичного значка приложения для всех систем.
  752. IDI_ABOUTD3 ICON "AboutD3.ico"
  753. IDI_SMALL ICON "small.ico"
  754. /////////////////////////////////////////////////////////////////////////////
  755. //
  756. // Меню
  757. //
  758. IDC_ABOUTD3 MENU
  759. BEGIN
  760. POPUP "&Файл"
  761. BEGIN
  762. MENUITEM "В&ыход", IDM_EXIT
  763. END
  764. POPUP "&Справка"
  765. BEGIN
  766. MENUITEM "&О программе ...", IDM_ABOUT
  767. END
  768. END
  769.  
  770. /////////////////////////////////////////////////////////////////////////////
  771. //
  772. // Сочетание клавиш
  773. //
  774. IDC_ABOUTD3 ACCELERATORS
  775. BEGIN
  776. "?", IDM_ABOUT, ASCII, ALT
  777. "/", IDM_ABOUT, ASCII, ALT
  778. END
  779.  
  780. /////////////////////////////////////////////////////////////////////////////
  781. //
  782. // Диалоговое окно
  783. //
  784. IDD_ABOUTBOX DIALOGEX 32, 32, 180, 100
  785. STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
  786. CAPTION "О AboutD3"
  787. FONT 8, "MS Shell Dlg"
  788. BEGIN
  789. CONTROL "OK", IDOK, "EllipPush", WS_GROUP | WS_TABSTOP, 73, 79, 32, 14
  790. ICON "ABOUTD3", IDC_STATIC, 7, 7, 20, 20
  791. CTEXT "AboutD3", IDC_STATIC, 40, 12, 100, 8
  792. CTEXT "About Box Demo Program", IDC_STATIC, 7, 40, 166, 8
  793. CTEXT "(c) Charles Petzold, TSU, 2020", IDC_STATIC, 7, 52, 166, 8
  794. END
  795. /////////////////////////////////////////////////////////////////////////////
  796. //
  797. // DESIGNINFO
  798. //
  799. #ifdef APSTUDIO_INVOKED
  800. GUIDELINES DESIGNINFO
  801. BEGIN
  802. IDD_ABOUTBOX, DIALOG
  803. BEGIN
  804. LEFTMARGIN, 7
  805. RIGHTMARGIN, 163
  806. TOPMARGIN, 7
  807. BOTTOMMARGIN, 55
  808. END
  809. END
  810. #endif // APSTUDIO_INVOKED
  811. #ifdef APSTUDIO_INVOKED
  812. /////////////////////////////////////////////////////////////////////////////
  813. //
  814. // TEXTINCLUDE
  815. //
  816. 1 TEXTINCLUDE
  817. BEGIN
  818. "resource.h\0"
  819. END
  820. 2 TEXTINCLUDE
  821. BEGIN
  822. "#ifndef APSTUDIO_INVOKED\r\n"
  823. "#include ""targetver.h""\r\n"
  824. "#endif\r\n"
  825. "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
  826. "#include ""windows.h""\r\n"
  827. "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
  828. "\0"
  829. END
  830. 3 TEXTINCLUDE
  831. BEGIN
  832. "\r\n"
  833. "\0"
  834. END
  835. #endif // APSTUDIO_INVOKED
  836. /////////////////////////////////////////////////////////////////////////////
  837. //
  838. // Таблица строк
  839. //
  840. STRINGTABLE
  841. BEGIN
  842. IDC_ABOUTD3 "ABOUTD3"
  843. IDS_APP_TITLE "AboutD3"
  844. END
  845. #endif
  846. /////////////////////////////////////////////////////////////////////////////
  847. #ifndef APSTUDIO_INVOKED
  848. /////////////////////////////////////////////////////////////////////////////
  849. //
  850. // Создано из ресурса TEXTINCLUDE 3.
  851. //
  852. /////////////////////////////////////////////////////////////////////////////
  853. #endif // не APSTUDIO_INVOKED
  854. Colors2
  855. Colors2.cpp
  856. /*------------------------------------------------
  857. COLORS2.C -- Version using Modeless Dialog Box
  858. ------------------------------------------------*/
  859. #include <windows.h>
  860. #include "resource.h"
  861. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  862. BOOL CALLBACK ColorScrDlg (HWND, UINT, WPARAM, LPARAM) ;
  863. HWND hDlgModeless ;
  864. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  865. PSTR szCmdLine, int iCmdShow)
  866. {
  867. static TCHAR szAppName[] = TEXT ("Colors2") ;
  868. HWND hwnd ;
  869. MSG msg ;
  870. WNDCLASS wndclass ;
  871.  
  872. wndclass.style = CS_HREDRAW | CS_VREDRAW ;
  873. wndclass.lpfnWndProc = WndProc ;
  874. wndclass.cbClsExtra = 0 ;
  875. wndclass.cbWndExtra = 0 ;
  876. wndclass.hInstance = hInstance ;
  877. wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
  878. wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
  879. wndclass.hbrBackground = CreateSolidBrush (0L) ;
  880. wndclass.lpszMenuName = NULL ;
  881. wndclass.lpszClassName = szAppName ;
  882.  
  883. RegisterClass (&wndclass);
  884.  
  885. hwnd = CreateWindow (szAppName, TEXT ("Color Scroll"),
  886. WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
  887. CW_USEDEFAULT, CW_USEDEFAULT,
  888. CW_USEDEFAULT, CW_USEDEFAULT,
  889. NULL, NULL, hInstance, NULL) ;
  890.  
  891. ShowWindow (hwnd, iCmdShow) ;
  892. UpdateWindow (hwnd) ;
  893.  
  894. hDlgModeless = CreateDialog (hInstance, MAKEINTRESOURCE (IDD_DIALOG1),
  895. hwnd, ColorScrDlg) ;
  896.  
  897. while (GetMessage (&msg, NULL, 0, 0))
  898. {
  899. if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg))
  900. {
  901. TranslateMessage (&msg) ;
  902. DispatchMessage (&msg) ;
  903. }
  904. }
  905. return msg.wParam ;
  906. }
  907. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  908. {
  909. switch (message)
  910. {
  911. case WM_DESTROY :
  912. DeleteObject ((HGDIOBJ) SetClassLong (hwnd, GCL_HBRBACKGROUND,
  913. (LONG) GetStockObject (WHITE_BRUSH))) ;
  914. PostQuitMessage (0) ;
  915. return 0 ;
  916. }
  917. return DefWindowProc (hwnd, message, wParam, lParam) ;
  918. }
  919. BOOL CALLBACK ColorScrDlg (HWND hDlg, UINT message,
  920. WPARAM wParam, LPARAM lParam)
  921. {
  922. static int iColor[3] ;
  923. HWND hwndParent, hCtrl ;
  924. int iCtrlID, iIndex ;
  925.  
  926. switch (message)
  927. {
  928. case WM_INITDIALOG :
  929. for (iCtrlID = 10 ; iCtrlID < 13 ; iCtrlID++)
  930. {
  931. hCtrl = GetDlgItem (hDlg, iCtrlID) ;
  932. SetScrollRange (hCtrl, SB_CTL, 0, 255, FALSE) ;
  933. SetScrollPos (hCtrl, SB_CTL, 0, FALSE) ;
  934. }
  935. return TRUE ;
  936.  
  937. case WM_VSCROLL :
  938. hCtrl = (HWND) lParam ;
  939. iCtrlID = GetWindowLong (hCtrl, GWL_ID) ;
  940. iIndex = iCtrlID - 10 ;
  941. hwndParent = GetParent (hDlg) ;
  942.  
  943. switch (LOWORD (wParam))
  944. {
  945. case SB_PAGEDOWN :
  946. iColor[iIndex] += 15 ; // fall through
  947. case SB_LINEDOWN :
  948. iColor[iIndex] = min (255, iColor[iIndex] + 1) ;
  949. break ;
  950. case SB_PAGEUP :
  951. iColor[iIndex] -= 15 ; // fall through
  952. case SB_LINEUP :
  953. iColor[iIndex] = max (0, iColor[iIndex] - 1) ;
  954. break ;
  955. case SB_TOP :
  956. iColor[iIndex] = 0 ;
  957. break ;
  958. case SB_BOTTOM :
  959. iColor[iIndex] = 255 ;
  960. break ;
  961. case SB_THUMBPOSITION :
  962. case SB_THUMBTRACK :
  963. iColor[iIndex] = HIWORD (wParam) ;
  964. break ;
  965. default :
  966. return FALSE ;
  967. }
  968. SetScrollPos (hCtrl, SB_CTL, iColor[iIndex], TRUE) ;
  969. SetDlgItemInt (hDlg, iCtrlID + 3, iColor[iIndex], FALSE) ;
  970.  
  971. DeleteObject ((HGDIOBJ) SetClassLong (hwndParent, GCL_HBRBACKGROUND,
  972. (LONG) CreateSolidBrush (
  973. RGB (iColor[0], iColor[1], iColor[2])))) ;
  974.  
  975. InvalidateRect (hwndParent, NULL, TRUE) ;
  976. return TRUE ;
  977. }
  978. return FALSE ;
  979. }
  980. Colors2.rc
  981. // Microsoft Visual C++ generated resource script.
  982. //
  983. #include "resource.h"
  984. #define APSTUDIO_READONLY_SYMBOLS
  985. /////////////////////////////////////////////////////////////////////////////
  986. //
  987. // Generated from the TEXTINCLUDE 2 resource.
  988. //
  989. #include "winres.h"
  990. /////////////////////////////////////////////////////////////////////////////
  991. #undef APSTUDIO_READONLY_SYMBOLS
  992. /////////////////////////////////////////////////////////////////////////////
  993. // Русский (Россия) resources
  994. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
  995. LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
  996. #ifdef APSTUDIO_INVOKED
  997. /////////////////////////////////////////////////////////////////////////////
  998. //
  999. // TEXTINCLUDE
  1000. //
  1001. 1 TEXTINCLUDE
  1002. BEGIN
  1003. "resource.h\0"
  1004. END
  1005. 2 TEXTINCLUDE
  1006. BEGIN
  1007. "#include ""winres.h""\r\n"
  1008. "\0"
  1009. END
  1010. 3 TEXTINCLUDE
  1011. BEGIN
  1012. "\r\n"
  1013. "\0"
  1014. END
  1015. #endif // APSTUDIO_INVOKED
  1016.  
  1017. /////////////////////////////////////////////////////////////////////////////
  1018. //
  1019. // Dialog
  1020. //
  1021. IDD_DIALOG1 DIALOG DISCARDABLE 16, 16, 120, 141
  1022. STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
  1023. CAPTION "Color Scroll Scrollbars"
  1024. FONT 8, "MS Sans Serif"
  1025. BEGIN
  1026. CTEXT "&Red", IDC_STATIC, 8, 8, 24, 8, NOT WS_GROUP
  1027. SCROLLBAR 10, 8, 20, 24, 100, SBS_VERT | WS_TABSTOP
  1028. CTEXT "0", 13, 8, 124, 24, 8, NOT WS_GROUP
  1029. CTEXT "&Green", IDC_STATIC, 48, 8, 24, 8, NOT WS_GROUP
  1030. SCROLLBAR 11, 48, 20, 24, 100, SBS_VERT | WS_TABSTOP
  1031. CTEXT "0", 14, 48, 124, 24, 8, NOT WS_GROUP
  1032. CTEXT "&Blue", IDC_STATIC, 89, 8, 24, 8, NOT WS_GROUP
  1033. SCROLLBAR 12, 89, 20, 24, 100, SBS_VERT | WS_TABSTOP
  1034. CTEXT "0", 15, 89, 124, 24, 8, NOT WS_GROUP
  1035. END
  1036. /////////////////////////////////////////////////////////////////////////////
  1037. //
  1038. // DESIGNINFO
  1039. //
  1040. #ifdef APSTUDIO_INVOKED
  1041. GUIDELINES DESIGNINFO
  1042. BEGIN
  1043. IDD_DIALOG1, DIALOG
  1044. BEGIN
  1045. LEFTMARGIN, 7
  1046. RIGHTMARGIN, 302
  1047. TOPMARGIN, 7
  1048. BOTTOMMARGIN, 170
  1049. END
  1050. END
  1051. #endif // APSTUDIO_INVOKED
  1052.  
  1053. /////////////////////////////////////////////////////////////////////////////
  1054. //
  1055. // AFX_DIALOG_LAYOUT
  1056. //
  1057. IDD_DIALOG1 AFX_DIALOG_LAYOUT
  1058. BEGIN
  1059. 0
  1060. END
  1061. #endif // Русский (Россия) resources
  1062. /////////////////////////////////////////////////////////////////////////////
  1063. #ifndef APSTUDIO_INVOKED
  1064. /////////////////////////////////////////////////////////////////////////////
  1065. //
  1066. // Generated from the TEXTINCLUDE 3 resource.
  1067. //
  1068.  
  1069. /////////////////////////////////////////////////////////////////////////////
  1070. #endif // not APSTUDIO_INVOKED
  1071. HexCalc
  1072. HexCalc.cpp
  1073. /*----------------------------------------
  1074. HEXCALC.C -- Hexadecimal Calculator
  1075. ----------------------------------------*/
  1076. #include <windows.h>
  1077. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  1078. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  1079. PSTR szCmdLine, int iCmdShow)
  1080. {
  1081. static TCHAR szAppName[] = TEXT ("HexCalc") ;
  1082. HWND hwnd ;
  1083. MSG msg ;
  1084. WNDCLASS wndclass ;
  1085.  
  1086. wndclass.style = CS_HREDRAW | CS_VREDRAW;
  1087. wndclass.lpfnWndProc = WndProc ;
  1088. wndclass.cbClsExtra = 0 ;
  1089. wndclass.cbWndExtra = DLGWINDOWEXTRA ; // Note!
  1090. wndclass.hInstance = hInstance ;
  1091. wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
  1092. wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
  1093. wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
  1094. wndclass.lpszMenuName = NULL ;
  1095. wndclass.lpszClassName = szAppName ;
  1096.  
  1097. RegisterClass (&wndclass);
  1098.  
  1099. hwnd = CreateDialog (hInstance, szAppName, 0, NULL) ;
  1100.  
  1101. ShowWindow (hwnd, iCmdShow) ;
  1102.  
  1103. while (GetMessage (&msg, NULL, 0, 0))
  1104. {
  1105. TranslateMessage (&msg) ;
  1106. DispatchMessage (&msg) ;
  1107. }
  1108. return msg.wParam ;
  1109. }
  1110. void ShowNumber (HWND hwnd, UINT iNumber)
  1111. {
  1112. TCHAR szBuffer[20] ;
  1113. wsprintf (szBuffer, TEXT ("%X"), iNumber) ;
  1114. SetDlgItemText (hwnd, VK_ESCAPE, szBuffer) ;
  1115. }
  1116. DWORD CalcIt (UINT iFirstNum, int iOperation, UINT iNum)
  1117. {
  1118. switch (iOperation)
  1119. {
  1120. case '=': return iNum ;
  1121. case '+': return iFirstNum + iNum ;
  1122. case '-': return iFirstNum - iNum ;
  1123. case '*': return iFirstNum * iNum ;
  1124. case '&': return iFirstNum & iNum ;
  1125. case '|': return iFirstNum | iNum ;
  1126. case '^': return iFirstNum ^ iNum ;
  1127. case '<': return iFirstNum << iNum ;
  1128. case '>': return iFirstNum >> iNum ;
  1129. case '/': return iNum ? iFirstNum / iNum: MAXDWORD ;
  1130. case '%': return iNum ? iFirstNum % iNum: MAXDWORD ;
  1131. default : return 0 ;
  1132. }
  1133. }
  1134. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  1135. {
  1136. static BOOL bNewNumber = TRUE ;
  1137. static int iOperation = '=' ;
  1138. static UINT iNumber, iFirstNum ;
  1139. HWND hButton ;
  1140.  
  1141. switch (message)
  1142. {
  1143. case WM_KEYDOWN: // left arrow --> backspace
  1144. if (wParam != VK_LEFT)
  1145. break ;
  1146. wParam = VK_BACK ;
  1147. // fall through
  1148. case WM_CHAR:
  1149. if ((wParam = (WPARAM) CharUpper ((TCHAR *) wParam)) == VK_RETURN)
  1150. wParam = '=' ;
  1151.  
  1152. if (hButton = GetDlgItem (hwnd, wParam))
  1153. {
  1154. SendMessage (hButton, BM_SETSTATE, 1, 0) ;
  1155. Sleep (100) ;
  1156. SendMessage (hButton, BM_SETSTATE, 0, 0) ;
  1157. }
  1158. else
  1159. {
  1160. MessageBeep (0) ;
  1161. break ;
  1162. }
  1163. // fall through
  1164. case WM_COMMAND:
  1165. SetFocus (hwnd) ;
  1166.  
  1167. if (LOWORD (wParam) == VK_BACK) // backspace
  1168. ShowNumber (hwnd, iNumber /= 16) ;
  1169.  
  1170. else if (LOWORD (wParam) == VK_ESCAPE) // escape
  1171. ShowNumber (hwnd, iNumber = 0) ;
  1172.  
  1173. else if (isxdigit (LOWORD (wParam))) // hex digit
  1174. {
  1175. if (bNewNumber)
  1176. {
  1177. iFirstNum = iNumber ;
  1178. iNumber = 0 ;
  1179. }
  1180. bNewNumber = FALSE ;
  1181.  
  1182. if (iNumber <= MAXDWORD >> 4)
  1183. ShowNumber (hwnd, iNumber = 16 * iNumber + wParam -
  1184. (isdigit (wParam) ? '0': 'A' - 10)) ;
  1185. else
  1186. MessageBeep (0) ;
  1187. }
  1188. else // operation
  1189. {
  1190. if (!bNewNumber)
  1191. ShowNumber (hwnd, iNumber =
  1192. CalcIt (iFirstNum, iOperation, iNumber)) ;
  1193. bNewNumber = TRUE ;
  1194. iOperation = LOWORD (wParam) ;
  1195. }
  1196. return 0 ;
  1197.  
  1198. case WM_DESTROY:
  1199. PostQuitMessage (0) ;
  1200. return 0 ;
  1201. }
  1202. return DefWindowProc (hwnd, message, wParam, lParam) ;
  1203. }
  1204. HexCalc.dlg
  1205. /*---------------------------
  1206. HEXCALC.DLG dialog script
  1207. ---------------------------*/
  1208. HexCalc DIALOG -1, -1, 102, 122
  1209. STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
  1210. CLASS "HexCalc"
  1211. CAPTION "Hex Calculator"
  1212. {
  1213. PUSHBUTTON "D", 68, 8, 24, 14, 14
  1214. PUSHBUTTON "A", 65, 8, 40, 14, 14
  1215. PUSHBUTTON "7", 55, 8, 56, 14, 14
  1216. PUSHBUTTON "4", 52, 8, 72, 14, 14
  1217. PUSHBUTTON "1", 49, 8, 88, 14, 14
  1218. PUSHBUTTON "0", 48, 8, 104, 14, 14
  1219. PUSHBUTTON "0", 27, 26, 4, 50, 14
  1220. PUSHBUTTON "E", 69, 26, 24, 14, 14
  1221. PUSHBUTTON "B", 66, 26, 40, 14, 14
  1222. PUSHBUTTON "8", 56, 26, 56, 14, 14
  1223. PUSHBUTTON "5", 53, 26, 72, 14, 14
  1224. PUSHBUTTON "2", 50, 26, 88, 14, 14
  1225. PUSHBUTTON "Back", 8, 26, 104, 32, 14
  1226. PUSHBUTTON "C", 67, 44, 40, 14, 14
  1227. PUSHBUTTON "F", 70, 44, 24, 14, 14
  1228. PUSHBUTTON "9", 57, 44, 56, 14, 14
  1229. PUSHBUTTON "6", 54, 44, 72, 14, 14
  1230. PUSHBUTTON "3", 51, 44, 88, 14, 14
  1231. PUSHBUTTON "+", 43, 62, 24, 14, 14
  1232. PUSHBUTTON "-", 45, 62, 40, 14, 14
  1233. PUSHBUTTON "*", 42, 62, 56, 14, 14
  1234. PUSHBUTTON "/", 47, 62, 72, 14, 14
  1235. PUSHBUTTON "%", 37, 62, 88, 14, 14
  1236. PUSHBUTTON "Equals", 61, 62, 104, 32, 14
  1237. PUSHBUTTON "&&", 38, 80, 24, 14, 14
  1238. PUSHBUTTON "|", 124, 80, 40, 14, 14
  1239. PUSHBUTTON "^", 94, 80, 56, 14, 14
  1240. PUSHBUTTON "<", 60, 80, 72, 14, 14
  1241. PUSHBUTTON ">", 62, 80, 88, 14, 14
  1242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement