Advertisement
_BYTE

lab5.cpp

Dec 11th, 2013
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.93 KB | None | 0 0
  1. // lab5.cpp: определяет точку входа для приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "lab5.h"
  6. #include "Functions.h"
  7.  
  8. const int ScreenWidth = GetSystemMetrics(SM_CXSCREEN);   //Разрешение экрана по вертикали
  9. const int ScreenHeight = GetSystemMetrics(SM_CYSCREEN);  //Разрешение экрана по горизонтали
  10.  
  11. const int Space = 100;  //Отступ от краев экрана
  12.  
  13. const int FormWidth = ScreenWidth - 2 * Space;    //Ширина формы
  14. const int FormHeight = ScreenHeight - 2 * Space;  //Высота формы
  15.  
  16. #define MAX_LOADSTRING 100
  17.  
  18. // Глобальные переменные:
  19. HINSTANCE hInst;                                // текущий экземпляр
  20. TCHAR szTitle[MAX_LOADSTRING];                  // Текст строки заголовка
  21. TCHAR szWindowClass[MAX_LOADSTRING];            // имя класса главного окна
  22.  
  23. // Отправить объявления функций, включенных в этот модуль кода:
  24. ATOM                MyRegisterClass(HINSTANCE hInstance);
  25. BOOL                InitInstance(HINSTANCE, int);
  26. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
  27. INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
  28.  
  29. int APIENTRY _tWinMain(HINSTANCE hInstance,
  30.                      HINSTANCE hPrevInstance,
  31.                      LPTSTR    lpCmdLine,
  32.                      int       nCmdShow)
  33. {
  34.     UNREFERENCED_PARAMETER(hPrevInstance);
  35.     UNREFERENCED_PARAMETER(lpCmdLine);
  36.  
  37.     // TODO: разместите код здесь.
  38.     MSG msg;
  39.     HACCEL hAccelTable;
  40.  
  41.     // Инициализация глобальных строк
  42.     LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  43.     LoadString(hInstance, IDC_LAB5, szWindowClass, MAX_LOADSTRING);
  44.     MyRegisterClass(hInstance);
  45.  
  46.     // Выполнить инициализацию приложения:
  47.     if (!InitInstance (hInstance, nCmdShow))
  48.     {
  49.         return FALSE;
  50.     }
  51.  
  52.     hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_LAB5));
  53.  
  54.     // Цикл основного сообщения:
  55.     while (GetMessage(&msg, NULL, 0, 0))
  56.     {
  57.         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  58.         {
  59.             TranslateMessage(&msg);
  60.             DispatchMessage(&msg);
  61.         }
  62.     }
  63.  
  64.     return (int) msg.wParam;
  65. }
  66.  
  67.  
  68.  
  69. //
  70. //  ФУНКЦИЯ: MyRegisterClass()
  71. //
  72. //  НАЗНАЧЕНИЕ: регистрирует класс окна.
  73. //
  74. //  КОММЕНТАРИИ:
  75. //
  76. //    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
  77. //    был совместим с системами Win32, не имеющими функции RegisterClassEx'
  78. //    которая была добавлена в Windows 95. Вызов этой функции важен для того,
  79. //    чтобы приложение получило "качественные" мелкие значки и установило связь
  80. //    с ними.
  81. //
  82. ATOM MyRegisterClass(HINSTANCE hInstance)
  83. {
  84.     WNDCLASSEX wcex;
  85.  
  86.     wcex.cbSize = sizeof(WNDCLASSEX);
  87.  
  88.     wcex.style          = CS_HREDRAW | CS_VREDRAW;
  89.     wcex.lpfnWndProc    = WndProc;
  90.     wcex.cbClsExtra     = 0;
  91.     wcex.cbWndExtra     = 0;
  92.     wcex.hInstance      = hInstance;
  93.     wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LAB5));
  94.     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
  95.     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
  96.     wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_LAB5);
  97.     wcex.lpszClassName  = szWindowClass;
  98.     wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  99.  
  100.     return RegisterClassEx(&wcex);
  101. }
  102.  
  103. //
  104. //   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
  105. //
  106. //   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
  107. //
  108. //   КОММЕНТАРИИ:
  109. //
  110. //        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
  111. //        создается и выводится на экран главное окно программы.
  112. //
  113. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  114. {
  115.    HWND hWnd;
  116.  
  117.    hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
  118.  
  119.    /*hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  120.       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);*/
  121.  
  122.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  123.        Space, Space, FormWidth, FormHeight, NULL, NULL, hInstance, NULL);
  124.  
  125.    if (!hWnd)
  126.    {
  127.       return FALSE;
  128.    }
  129.  
  130.    ShowWindow(hWnd, nCmdShow);
  131.    UpdateWindow(hWnd);
  132.  
  133.    return TRUE;
  134. }
  135.  
  136. const int Count = 7;
  137.  
  138. POINT3 WPT[Count]; //Мировые координаты углов пирамиды
  139. POINT SPT[Count];  //Экранные координаты углов пирамиды
  140.  
  141. double R = 100;  //Расстояние от точки наблюдения до начала мировой системы координат
  142. double A = 0;   //Полярный угол в горизонтальной плоскости
  143. double B = 0;   //Полярный угол в вертикальной плоскости
  144. double d;
  145.  
  146.  
  147. //
  148. //  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
  149. //
  150. //  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
  151. //
  152. //  WM_COMMAND  - обработка меню приложения
  153. //  WM_PAINT    -Закрасить главное окно
  154. //  WM_DESTROY   - ввести сообщение о выходе и вернуться.
  155. //
  156. //
  157. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  158. {
  159.     int wmId, wmEvent;
  160.     PAINTSTRUCT ps;
  161.     HDC hdc;
  162.  
  163.     //Вычисление координат пирамиды относительно размеров формы
  164.  
  165.     const int z = 500;
  166.     const int w = FormWidth;
  167.     const int h = FormHeight;
  168.  
  169.     WPT[0] = PointEx(Round(w/2), Round(h/10), z);
  170.     WPT[1] = PointEx(Round(w/3), Round(h/2), z);
  171.     WPT[2] = PointEx(Round(w/3) + (Round(w/2) - Round(w/3))*2, Round(h/2), z);
  172.     WPT[3] = PointEx(w - Round(w/8), h - Round(h/3), z);
  173.     WPT[4] = PointEx(w - Round(w/3), h - Round(h/6), z);
  174.     WPT[5] = PointEx(Round(w/3), h - Round(h/6), z);
  175.     WPT[6] = PointEx(Round(w/8), h - Round(h/3), z);
  176.  
  177.     int size_img = FormWidth * FormHeight; //Размер изображения
  178.     int size_object = (WPT[3].x - WPT[6].x) * (WPT[4].y - WPT[0].y); //Размер объекта
  179.     d = R * ((double) size_img / (double) size_object);
  180.  
  181.     const double RotateAngle = 1;
  182.  
  183.     switch (message)
  184.     {
  185.     case WM_COMMAND:
  186.         wmId    = LOWORD(wParam);
  187.         wmEvent = HIWORD(wParam);
  188.         // Разобрать выбор в меню:
  189.         switch (wmId)
  190.         {
  191.         case IDM_ABOUT:
  192.             DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  193.             break;
  194.         case IDM_EXIT:
  195.             DestroyWindow(hWnd);
  196.             break;
  197.         default:
  198.             return DefWindowProc(hWnd, message, wParam, lParam);
  199.         }
  200.         break;
  201.     case WM_KEYDOWN:
  202.         {
  203.             switch(wParam)
  204.             {
  205.                 case 'A':
  206.                     {
  207.                         A = A + RotateAngle;
  208.                         InvalidateRect(hWnd, NULL, TRUE);
  209.                         UpdateWindow(hWnd);
  210.                     } break;
  211.                 case 'D':
  212.                     {
  213.                         A = A - RotateAngle;
  214.                         InvalidateRect(hWnd, NULL, TRUE);
  215.                         UpdateWindow(hWnd);
  216.                     }
  217.                 case 'W':
  218.                     {
  219.                         B = B + RotateAngle;
  220.                         InvalidateRect(hWnd, NULL, TRUE);
  221.                         UpdateWindow(hWnd);
  222.                     } break;
  223.                 case 'S':
  224.                     {
  225.                         B = B - RotateAngle;
  226.                         InvalidateRect(hWnd, NULL, TRUE);
  227.                         UpdateWindow(hWnd);
  228.                     } break;
  229.                 case 0x31:
  230.                     {
  231.                         R = R + R/5;
  232.                         InvalidateRect(hWnd, NULL, TRUE);
  233.                         UpdateWindow(hWnd);
  234.                     } break;
  235.                 case 0x32:
  236.                     {
  237.                         R = R - R/5;
  238.                         InvalidateRect(hWnd, NULL, TRUE);
  239.                         UpdateWindow(hWnd);
  240.                     } break;
  241.                 case 0x33:
  242.                     {
  243.                         d = d + d/5;
  244.                         InvalidateRect(hWnd, NULL, TRUE);
  245.                         UpdateWindow(hWnd);
  246.                     } break;
  247.                 case 0x34:
  248.                     {
  249.                         d = d - d/5;
  250.                         InvalidateRect(hWnd, NULL, TRUE);
  251.                         UpdateWindow(hWnd);
  252.                     } break;
  253.             }
  254.         } break;
  255.     case WM_PAINT:
  256.         hdc = BeginPaint(hWnd, &ps);
  257.         // TODO: добавьте любой код отрисовки...
  258.         for(int i = 0; i < Count; i++)
  259.         {
  260.             POINT3 EPT = GlobalPointToScreen(WPT[i],A,B,R);
  261.             SPT[i] = Perspective(EPT,d);
  262.         }
  263.         Piramid(hdc, SPT, Count);
  264.         EndPaint(hWnd, &ps);
  265.         break;
  266.     case WM_DESTROY:
  267.         PostQuitMessage(0);
  268.         break;
  269.     default:
  270.         return DefWindowProc(hWnd, message, wParam, lParam);
  271.     }
  272.     return 0;
  273. }
  274.  
  275. // Обработчик сообщений для окна "О программе".
  276. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  277. {
  278.     UNREFERENCED_PARAMETER(lParam);
  279.     switch (message)
  280.     {
  281.     case WM_INITDIALOG:
  282.         return (INT_PTR)TRUE;
  283.  
  284.     case WM_COMMAND:
  285.         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  286.         {
  287.             EndDialog(hDlg, LOWORD(wParam));
  288.             return (INT_PTR)TRUE;
  289.         }
  290.         break;
  291.     }
  292.     return (INT_PTR)FALSE;
  293. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement