Developer от Бога

DV

четверг, 6 июля 2017 г.

WinAPI. График Функций.

В прошлых статьях был рассмотрен пример рисования графиков функций на языке Java. Что касается WinAPI - в некоторых моментах тут все проще, а в некоторых сложнее. Сложнее конечно это - создание окон и кнопок. Проще - тут нет стилей размещения элементов (на подобии HTML/CSS) как в Java: создал кнопку нужных размеров в нужном месте и этого достаточно. Не нужно "вешать" слушателей на кнопки - есть оконная функция которая принимает все сообщения, а программа только отбирает нужное сообщение, его анализирует и предпринимает нужные действия. Все приложение будет состоять из четырех файлов: главного файла main, а также "paintfone.h" "button.h" "graphfunc.h"
Традиционно первое что создается это главное окно и оконная функция в файле main.c:


  1.  
  2. #if defined(UNICODE) && !defined(_UNICODE)
  3. #define _UNICODE
  4. #elif defined(_UNICODE) && !defined(UNICODE)
  5. #define UNICODE
  6. #endif
  7. #include <tchar.h>
  8. #include <windows.h>
  9. #include <cmath>
  10. #include "paintfone.h"
  11. #include "button.h"
  12. #include "graphfunc.h"
  13. LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
  14. char szClassName[ ] = "iVARIOUS.COM";
  15. int WINAPI WinMain (HINSTANCE hThisInstance,
  16. HINSTANCE hPrevInstance,
  17. LPSTR lpszArgument,
  18. int nCmdShow)
  19. {
  20. HWND hwnd;
  21. MSG messages;
  22. WNDCLASSEX wincl;
  23. wincl.hInstance = hThisInstance;
  24. wincl.lpszClassName = szClassName;
  25. wincl.lpfnWndProc = WindowProcedure;
  26. wincl.style = CS_DBLCLKS;
  27. wincl.cbSize = sizeof (WNDCLASSEX);
  28. wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  29. wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  30. wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  31. wincl.lpszMenuName = NULL;
  32. wincl.cbClsExtra = 0;
  33. wincl.cbWndExtra = 0;
  34. wincl.hbrBackground = CreateSolidBrush(RGB(190,190,195));
  35. if (!RegisterClassEx (&wincl))
  36. return 0;
  37. hwnd = CreateWindowEx (
  38. 0,
  39. szClassName,
  40. _T("iVARIOUS Graph"),
  41. WS_OVERLAPPEDWINDOW,
  42. CW_USEDEFAULT,
  43. CW_USEDEFAULT,
  44. 700,
  45. 600,
  46. HWND_DESKTOP,
  47. NULL,
  48. hThisInstance,
  49. NULL
  50. );
  51. ShowWindow (hwnd, nCmdShow);
  52. button_func(hwnd,hThisInstance);
  53. paint_fon(hwnd);
  54. while (GetMessage (&messages, NULL, 0, 0))
  55. {
  56. TranslateMessage(&messages);
  57. DispatchMessage(&messages);
  58. }
  59. return messages.wParam;
  60. }
  61. int x_center=290, y_center=260, zoom=5, step=5;
  62. float vertex=0.1;
  63. int func=0;
  64. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  65. {
  66. switch (message)
  67. { case WM_COMMAND:
  68. if(wParam==3001) {x_center+=step; InvalidateRect(hwnd, NULL, NULL);
  69. paint_fon(hwnd);
  70. meredian(hwnd, x_center, y_center, zoom);
  71. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
  72. }
  73. if(wParam==3002) {x_center-=step; InvalidateRect(hwnd, NULL,NULL);
  74. paint_fon(hwnd);
  75. meredian(hwnd, x_center, y_center, zoom);
  76. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
  77. }
  78. if(wParam==3003) {y_center+=step; InvalidateRect(hwnd, NULL, NULL);
  79. paint_fon(hwnd);
  80. meredian(hwnd, x_center, y_center, zoom);
  81. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
  82. }
  83. if(wParam==3009) {x_center=290; y_center=260; zoom=5; InvalidateRect(hwnd, NULL,NULL);
  84. paint_fon(hwnd);
  85. meredian(hwnd, x_center, y_center, zoom);
  86. vertex=0.1;
  87. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
  88. }
  89. if(wParam==3004) {y_center-=step; InvalidateRect(hwnd, NULL,NULL);
  90. paint_fon(hwnd);
  91. meredian(hwnd, x_center, y_center, zoom);
  92. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
  93. }
  94. if(wParam==3005) {zoom+=5; InvalidateRect(hwnd, NULL,NULL);
  95. paint_fon(hwnd);
  96. meredian(hwnd, x_center, y_center, zoom);
  97. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
  98. }
  99. if(wParam==3006) {if(zoom>5)zoom-=5; InvalidateRect(hwnd, NULL,NULL);
  100. paint_fon(hwnd);
  101. meredian(hwnd, x_center, y_center, zoom);
  102. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
  103. }
  104. if(wParam==3007) {vertex+=1; InvalidateRect(hwnd, NULL,NULL);
  105. paint_fon(hwnd);
  106. meredian(hwnd, x_center, y_center, zoom);
  107. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);}
  108. if(wParam==3008) {if(vertex>0.1)vertex-=1; InvalidateRect(hwnd, NULL,NULL);
  109. paint_fon(hwnd);
  110. meredian(hwnd, x_center, y_center, zoom);
  111. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);
  112. }
  113. if(wParam==3010) {if(vertex>0.1)vertex-=1; InvalidateRect(hwnd, NULL,NULL);
  114. paint_fon(hwnd);
  115. meredian(hwnd, x_center, y_center, zoom); func=0;
  116. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);}
  117. if(wParam==3011) {if(vertex>0.1)vertex-=1; InvalidateRect(hwnd, NULL,NULL);
  118. paint_fon(hwnd);
  119. meredian(hwnd, x_center, y_center, zoom); func=1;
  120. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);}
  121. if(wParam==3012) {if(vertex>0.1)vertex-=1; InvalidateRect(hwnd, NULL,NULL);
  122. paint_fon(hwnd);
  123. meredian(hwnd, x_center, y_center, zoom); func=2;
  124. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);}
  125. if(wParam==3013) {if(vertex>0.1)vertex-=1; InvalidateRect(hwnd, NULL,NULL);
  126. paint_fon(hwnd);
  127. meredian(hwnd, x_center, y_center, zoom); func=3;
  128. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);}
  129. if(wParam==3014) {if(vertex>0.1)vertex-=1; InvalidateRect(hwnd, NULL,NULL);
  130. paint_fon(hwnd);
  131. meredian(hwnd, x_center, y_center, zoom); func=4;
  132. getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);}
  133. break;
  134. case WM_DESTROY:
  135. PostQuitMessage (0);
  136. break;
  137. default:
  138. return DefWindowProc (hwnd, message, wParam, lParam);
  139. }
  140. return 0;
  141. }
  142.  
  143.  

Новые присутствующие методы это CreateSolidBrush() при заполнении структуры главного окна WNDCLASSEX wincl. Этой функцией устанавливается цвет главного окна удобным методом. Глобальные переменные x_center, y_center, zoom, step, vertex, и func задают общие первоначальные настройки: центр главной точки графика, состояние масштабирования, количество вершин кривых, и выбранный график в данный момент.
wParam определяет какая именно была нажата кнопка, и вносит изменения в глобальные переменные управления графиками, после которых вызывает функции рисования фона, шкалу деления, и выбранный график функции getfunc(hwnd, x_center, y_center, zoom,vertex,step,func);

Комментариев нет:

Отправить комментарий