Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.23 KB | None | 0 0
  1. // DIGR.cpp: Определяет точку входа для приложения.
  2. //
  3.  
  4.  
  5. #include "stdafx.h"
  6. #include "DIGR.h"
  7. #include <string>
  8. #include "cmath"
  9.  
  10.  
  11. #define MAX_LOADSTRING 100
  12.  
  13. // Глобальные переменные:
  14. HINSTANCE hInst;                                // текущий экземпляр
  15. WCHAR szTitle[MAX_LOADSTRING];                  // Текст строки заголовка
  16. WCHAR szWindowClass[MAX_LOADSTRING];            // имя класса главного окна
  17.  
  18. struct ValStruct
  19. {
  20.     float val;
  21.     float valR;
  22.     char valT[25];
  23.     char name[50];
  24. };
  25.  
  26. ValStruct a[100];
  27.  
  28. const double PI = 3.14159265358979323846;
  29. int n;
  30. int EDi = 0;
  31. float sum = 0;
  32. float max = 0;
  33.  
  34. bool DChoose = 0;
  35. bool invert = 0;
  36. bool Round = 0;
  37. bool Frst = 1;
  38. bool conv = 0;
  39.  
  40. float StartX = 300;
  41. float StartY = 400;
  42. float StartYL = 100;
  43.  
  44. int R = 0, G = 255, B = 0;
  45.  
  46.  
  47. std::string strBuff[];
  48.  
  49.  
  50.  
  51. // Отправить объявления функций, включенных в этот модуль кода:
  52. ATOM                MyRegisterClass(HINSTANCE hInstance);
  53. BOOL                InitInstance(HINSTANCE, int);
  54. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
  55. INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
  56.  
  57. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  58.     _In_opt_ HINSTANCE hPrevInstance,
  59.     _In_ LPWSTR    lpCmdLine,
  60.     _In_ int       nCmdShow)
  61. {
  62.     UNREFERENCED_PARAMETER(hPrevInstance);
  63.     UNREFERENCED_PARAMETER(lpCmdLine);
  64.  
  65.     // TODO: разместите код здесь.
  66.  
  67.     // Инициализация глобальных строк
  68.     LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  69.     LoadStringW(hInstance, IDC_DIGR, szWindowClass, MAX_LOADSTRING);
  70.     MyRegisterClass(hInstance);
  71.  
  72.     // Выполнить инициализацию приложения:
  73.     if (!InitInstance(hInstance, nCmdShow))
  74.     {
  75.         return FALSE;
  76.     }
  77.  
  78.     HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_DIGR));
  79.  
  80.     MSG msg;
  81.  
  82.     // Цикл основного сообщения:
  83.     while (GetMessage(&msg, nullptr, 0, 0))
  84.     {
  85.         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  86.         {
  87.             TranslateMessage(&msg);
  88.             DispatchMessage(&msg);
  89.         }
  90.     }
  91.  
  92.     return (int)msg.wParam;
  93. }
  94.  
  95.  
  96.  
  97. //
  98. //  ФУНКЦИЯ: MyRegisterClass()
  99. //
  100. //  НАЗНАЧЕНИЕ: регистрирует класс окна.
  101. //
  102. ATOM MyRegisterClass(HINSTANCE hInstance)
  103. {
  104.     WNDCLASSEXW wcex;
  105.  
  106.     wcex.cbSize = sizeof(WNDCLASSEX);
  107.  
  108.     wcex.style = CS_HREDRAW | CS_VREDRAW;
  109.     wcex.lpfnWndProc = WndProc;
  110.     wcex.cbClsExtra = 0;
  111.     wcex.cbWndExtra = 0;
  112.     wcex.hInstance = hInstance;
  113.     wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DIGR));
  114.     wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
  115.     wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  116.     wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_DIGR);
  117.     wcex.lpszClassName = szWindowClass;
  118.     wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  119.  
  120.     return RegisterClassExW(&wcex);
  121. }
  122.  
  123. //
  124. //   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
  125. //
  126. //   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
  127. //
  128. //   КОММЕНТАРИИ:
  129. //
  130. //        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
  131. //        создается и выводится на экран главное окно программы.
  132. //
  133. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  134. {
  135.     hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
  136.  
  137.     HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  138.         CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
  139.  
  140.     if (!hWnd)
  141.     {
  142.         return FALSE;
  143.     }
  144.  
  145.     ShowWindow(hWnd, nCmdShow);
  146.     UpdateWindow(hWnd);
  147.  
  148.     return TRUE;
  149. }
  150.  
  151. //
  152. //  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
  153. //
  154. //  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
  155. //
  156. //  WM_COMMAND — обработать меню приложения
  157. //  WM_PAINT — отрисовать главное окно
  158. //  WM_DESTROY — отправить сообщение о выходе и вернуться
  159. //
  160. //
  161. void Clean()
  162. {
  163.     EDi = 0;
  164.     DChoose = 0;
  165.     invert = 0;
  166.     Round = 0;
  167.     Frst = 1;
  168.     StartX = 300;
  169.     StartY = 400;
  170.     StartYL = 100;
  171.     R = 0, G = 255, B = 0;
  172.     sum = 0;
  173.     if (!conv)
  174.     {
  175.         for (int i = 0; i < n; i++)
  176.         {
  177.             a[i].val = 0;
  178.         }
  179.     }
  180.    
  181. }
  182.  
  183. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  184. {
  185.     switch (message)
  186.     {
  187.     case WM_COMMAND:
  188.     {
  189.         int wmId = LOWORD(wParam);
  190.         switch (wmId)
  191.         {
  192.         case ID_Diag:
  193.             Clean();
  194.             InvalidateRect(hWnd, NULL, true);
  195.             DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, About);
  196.             break;
  197.  
  198.         case ID_Clean:
  199.             Clean();
  200.             InvalidateRect(hWnd, NULL, true);
  201.             break;
  202.  
  203.         case IDM_EXIT:
  204.             DestroyWindow(hWnd);
  205.             break;
  206.         default:
  207.             return DefWindowProc(hWnd, message, wParam, lParam);
  208.         }
  209.         InvalidateRect(hWnd, NULL, false);
  210.     }
  211.     break;
  212.     case WM_PAINT:
  213.     {
  214.         PAINTSTRUCT ps;
  215.         HDC hdc = BeginPaint(hWnd, &ps);
  216.    
  217.         HPEN pen = CreatePen(0, 1, RGB(0, 0, 0));
  218.         SelectObject(hdc, pen);
  219.  
  220.         HBRUSH brush = CreateSolidBrush(RGB(R, G, B)); //G
  221.         SelectObject(hdc, brush);
  222.  
  223.         if (DChoose)
  224.         {
  225.             if (!Round)
  226.             {
  227.  
  228.  
  229.                 EDi = 0;
  230.  
  231.  
  232.                 if (!invert)
  233.                 {
  234.                     //y
  235.                     MoveToEx(hdc, StartX - 5, StartY + 5, NULL);
  236.                     LineTo(hdc, StartX - 5, StartY - (max * 5) - 10);
  237.                     //x
  238.                     MoveToEx(hdc, StartX - 10, StartY, NULL);
  239.                     LineTo(hdc, StartX + (n * 40), StartY);
  240.                 }
  241.                 else
  242.                 {
  243.                     //Iy
  244.                     MoveToEx(hdc, StartY, StartX + 10, NULL);
  245.                     LineTo(hdc, StartY, StartX - (n * 40));
  246.                     //Ix
  247.                     MoveToEx(hdc, StartY - 5, StartX + 5, NULL);
  248.                     LineTo(hdc, StartY + (max * 5) + 10, StartX + 5);
  249.                 }
  250.             }
  251.            
  252.             while (EDi < n)
  253.             {
  254.                 brush = CreateSolidBrush(RGB(R, G, B));
  255.                 SelectObject(hdc, brush);
  256.                
  257.                 Ellipse(hdc, 15, StartYL, 25, StartYL + 10);
  258.                 TextOutA(hdc, 35, StartYL - 3, a[EDi].name, 20);
  259.  
  260.                 StartYL += 25;
  261.                    
  262.                 if (!Round)
  263.                 {
  264.                     if (!invert)
  265.                     {
  266.                         Rectangle(hdc, StartX, StartY - (a[EDi].val * 5), StartX + 20, StartY);
  267.                         TextOutA(hdc, StartX, StartY - (a[EDi].val * 5) - 20, a[EDi].valT, 20);
  268.  
  269.                         StartX += 40;
  270.                     }
  271.                     else
  272.                     {
  273.                         Rectangle(hdc, StartY + (a[EDi].val * 5), StartX, StartY, StartX - 20);
  274.                         TextOutA(hdc, StartY + (a[EDi].val * 5) + 15, StartX - 20, a[EDi].valT, 20);
  275.  
  276.                         StartX -= 40;
  277.                     }
  278.                 }
  279.                 else
  280.                 {
  281.                     EDi==0?
  282.                         Pie(hdc,
  283.                             StartX - 180, StartY - 180, StartX + 180, StartY + 180,
  284.                             -180 * cos(a[0].valR*PI / 180) + StartX,
  285.                             -180 * sin(a[0].valR*PI / 180) + StartY,
  286.                             -180 * cos(a[n-1].valR*PI / 180) + StartX,
  287.                             -180 * sin(a[n-1].valR*PI / 180) + StartY)
  288.                         :
  289.                        
  290.                         Pie(hdc,
  291.                         StartX - 180, StartY - 180, StartX + 180, StartY + 180,
  292.                         -180 * cos(a[EDi].valR*PI / 180) + StartX,
  293.                         -180 * sin(a[EDi].valR*PI / 180) + StartY,
  294.                         -180 * cos(a[EDi-1].valR*PI / 180) + StartX,
  295.                         -180 * sin(a[EDi-1].valR*PI / 180) + StartY);
  296.                    
  297.                 }
  298.  
  299.  
  300.                 EDi++;
  301.  
  302.                 B += 40;
  303.                 G -= 40;
  304.                 R += 40;
  305.                 if (R > 255)
  306.                 {
  307.                     R = B = 0;
  308.                     G = 255;
  309.                 }
  310.             }
  311.  
  312.         }
  313.         EndPaint(hWnd, &ps);
  314.         EDi = 0;
  315.         Frst = 0;
  316.     }
  317.     break;
  318.     case WM_DESTROY:
  319.         PostQuitMessage(0);
  320.         break;
  321.     default:
  322.         return DefWindowProc(hWnd, message, wParam, lParam);
  323.     }
  324.     return 0;
  325. }
  326.  
  327.  
  328. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  329. {
  330.     UNREFERENCED_PARAMETER(lParam);
  331.    
  332.     switch (message)
  333.     {
  334.     case WM_INITDIALOG:
  335.         return (INT_PTR)TRUE;
  336.  
  337.     case WM_COMMAND:
  338.  
  339.         invert = (IsDlgButtonChecked(hDlg, IDC_CHCK1));
  340.        
  341.    
  342.  
  343.         switch (LOWORD(wParam))
  344.         {
  345.         case IDC_CHCK2:
  346.             if (IsDlgButtonChecked(hDlg, IDC_CHCK2))
  347.             {
  348.                 SetDlgItemTextA(hDlg, IDC_ED2, "Готово?");
  349.                 SetDlgItemTextA(hDlg, IDC_ED3, "Преждние значения");
  350.                 conv = 1;
  351.             }
  352.             else
  353.             {
  354.                 SetDlgItemTextA(hDlg, IDC_ED2, "");
  355.                 SetDlgItemTextA(hDlg, IDC_ED3, "");
  356.                 conv = 0;
  357.             }
  358.             break;
  359.  
  360.         case IDC_BUT1:
  361.             SetDlgItemTextA(hDlg, IDC_ED3, "");
  362.             n = GetDlgItemInt(hDlg, IDC_ED1, NULL, true);
  363.             break;
  364.  
  365.         case IDC_BUT2:
  366.             a[EDi].val = GetDlgItemInt(hDlg, IDC_ED2, NULL, true);
  367.             sum += a[EDi].val;
  368.             GetDlgItemTextA(hDlg, IDC_ED2, a[EDi].valT, 25);
  369.             GetDlgItemTextA(hDlg, IDC_ED3, a[EDi].name, 50);
  370.             SetDlgItemTextA(hDlg, IDC_ED2, "");
  371.             SetDlgItemTextA(hDlg, IDC_ED3, "");
  372.             EDi++;
  373.             if (EDi == n)
  374.             {
  375.                 max = a[0].val;
  376.                 for (int i = 0; i < n; i++)
  377.                 {
  378.                     a[i].valR = a[i].val * 360 / sum;
  379.                     if (a[i].val > max)
  380.                     {
  381.                         max = a[i].val;
  382.                     }
  383.  
  384.                 }
  385.                 SetDlgItemTextA(hDlg, IDC_ED2, "Готово?");
  386.             }
  387.            
  388.             break;
  389.  
  390.         case IDC_R2:
  391.             Round = 1;
  392.             break;
  393.  
  394.         case IDC_R1:
  395.             Round = 0;
  396.             break;
  397.  
  398.         case IDOK:
  399.             DChoose = 1;
  400.            
  401.             EndDialog(hDlg, LOWORD(wParam));
  402.             return (INT_PTR)TRUE;
  403.  
  404.             break;
  405.  
  406.         case IDC_Canc:
  407.             DChoose = 0;
  408.             EndDialog(hDlg, LOWORD(wParam));
  409.             return (INT_PTR)TRUE;
  410.             break;
  411.  
  412.         }
  413.    
  414.     }
  415.     return (INT_PTR)FALSE;
  416. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement