Advertisement
ArchonHS

Bezier

Oct 29th, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.15 KB | None | 0 0
  1. //----------------------------------------------------
  2. #include "stdafx.h"
  3. #include <Windows.h>
  4. #include <tchar.h>
  5. #include <math.h>
  6. #include <cmath>
  7. #include <iostream>
  8. #include <fstream>
  9.  
  10. using namespace std;
  11. static int sx,sy;
  12. const int SCALE = 1000;
  13. const int MARK = 4;
  14.  
  15. void DcInLp(POINT &point){
  16.     point.x = point.x* SCALE/sx;
  17.     point.y = SCALE - point.y* SCALE/sy;
  18. }
  19. void transform(HDC& hdc)
  20. {
  21.     SetMapMode(hdc, MM_ANISOTROPIC);
  22.     SetWindowExtEx(hdc, SCALE, -SCALE, NULL);
  23.     SetViewportExtEx(hdc, sx, sy, NULL);
  24.     SetViewportOrgEx(hdc, 0, sy, NULL);
  25. }
  26.  
  27. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  28. TCHAR WinName[] = _T("MainFrame");
  29.  
  30. int APIENTRY WinMain(HINSTANCE This, HINSTANCE Prev, LPSTR cmd, int mode) {
  31.     HWND hWnd;  //Дескриптор главного окна программы
  32.     MSG msg;    //Структура для хранения сообщений
  33.     WNDCLASS wc;  //Класс окна
  34.     //Определение класса окон
  35.     wc.hInstance = This;
  36.     wc.lpszClassName = WinName;                  //Имя класса окна
  37.     wc.lpfnWndProc = WndProc;                    //Функция окна
  38.     wc.style = CS_HREDRAW | CS_VREDRAW;          //Стиль окна
  39.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);  //Стандартная иконка
  40.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);  //Стандартный курсор
  41.     wc.lpszMenuName = NULL;                    //Нет меню
  42.     wc.cbClsExtra = 0;  //Нет дополнительных данных класса
  43.     wc.cbWndExtra = 0;  //Нет дополнительных данных окна
  44.     //Заполнение окна белым цветом
  45.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);  //установка цвета фона
  46.  
  47.     if (!RegisterClass(&wc)) return 0;  //Регистрация класса окна
  48.  
  49.     //Создание окна
  50.     hWnd = CreateWindow(WinName,  //Имя класса окна
  51.         _T("Каркас Windows-приложения"),  //Заголовок окна
  52.         WS_OVERLAPPEDWINDOW,              //Стиль окна
  53.         CW_USEDEFAULT,                    // X
  54.         CW_USEDEFAULT,                    // Y
  55.         CW_USEDEFAULT,                    // Width
  56.         CW_USEDEFAULT,                    // Height
  57.         HWND_DESKTOP,  //Дескриптор родительского окна
  58.         NULL,  //Нет меню
  59.         This,  //Дескриптор приложения
  60.         NULL);  //Дополнительной информации нет
  61.  
  62.     ShowWindow(hWnd, mode);  //Показать окно
  63.  
  64.     //Цикл обработки сообщений
  65.     while (GetMessage(&msg, NULL, 0, 0))  //цикл получения сообщения
  66.     {
  67.         TranslateMessage(&msg);  //Функция трансляции кодов нажатой клавиши
  68.         DispatchMessage(&msg);  //Посылает сообщение функции WndProc()
  69.     }
  70.     return 0;
  71. }
  72.  
  73. //Оконная функция вызываемая операционной системой
  74. //и получает сообщения из очереди для данного приложения
  75. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {//обработчик сообщений
  76.     PAINTSTRUCT ps;
  77.     static HBRUSH hBrush;
  78.     static HPEN hDash, hBezier; // два пера
  79.     static HBRUSH hRect, hSel; // две кисти
  80.     static POINT pt[20]; // массив хранения плоских точек
  81.     static POINT point; // структура под одну плоскую точку
  82.     RECT rt; // структура точек прямоугольника
  83.     static int count, index; // счётчик точек,
  84.     static bool capture; // логическая переменная для мыши
  85.     int i;
  86.     ifstream in; //класс файлового потокового ввода-вывода
  87.     ofstream out;
  88.     HDC hdc;
  89.     switch (message)
  90.     {
  91.     case WM_CREATE:
  92.         in.open("dat.txt"); // открытие файлового потока
  93.         if (in.fail()){
  94.         MessageBox(hWnd, _T("Файл dat.txt не найден"),
  95.         _T("Открытие файла"), MB_OK | MB_ICONEXCLAMATION);
  96.         PostQuitMessage(0);
  97.         return 1;
  98.         }
  99.         for(count=0;in>>pt[count].x; count++)in>>pt[count].y;
  100.         in.close();
  101.         hDash=CreatePen(PS_DASH, 1, 0);
  102.         hBezier=CreatePen(PS_SOLID, 4, RGB(0, 0, 255));
  103.         hRect=CreateSolidBrush(RGB(128, 0, 128));
  104.         hSel=CreateSolidBrush(RGB(255, 0, 0));
  105.         break;
  106.     case WM_SIZE:
  107.         sx = LOWORD(lParam);//Ширина
  108.         sy = HIWORD(lParam);//Высота
  109.         break;
  110.     case WM_LBUTTONDOWN:
  111.         point.x = LOWORD(lParam);
  112.         point.y = HIWORD(lParam);
  113.         DcInLp(point);
  114.         for (i = 0; i <= count; i++){
  115.         SetRect(&rt, pt[i].x-MARK, pt[i].y-MARK, pt[i].x+MARK, pt[i].y+MARK);
  116.         if (PtInRect(&rt, point)){
  117.         index = i;
  118.         capture = true;
  119.         hdc = GetDC(hWnd);
  120.         transform(hdc); //Переход в логические координаты
  121.         FillRect(hdc, &rt, hSel);//Отметим прямоугольник цветом
  122.         ReleaseDC(hWnd, hdc);
  123.         SetCapture(hWnd);
  124.         return 0;
  125.         }
  126.         }
  127.         break;
  128.     case WM_LBUTTONUP:
  129.         if(capture){
  130.         ReleaseCapture();
  131.         capture=false;
  132.         }
  133.         break;
  134.     case WM_MOUSEMOVE:
  135.         if(capture){
  136.         point.x=LOWORD(lParam);
  137.         point.y=HIWORD(lParam);
  138.         DcInLp(point);
  139.         pt[index]=point;
  140.         InvalidateRect(hWnd, NULL, TRUE);
  141.         }
  142.         break;
  143.     case WM_PAINT:
  144.         hdc = BeginPaint(hWnd, &ps);//Установка режима
  145.         transform(hdc);
  146.         SelectObject(hdc, hDash);
  147.         Polyline(hdc, pt, count);
  148.         SelectObject(hdc, hBezier);
  149.         PolyBezier(hdc, pt, count);
  150.         for(int i = 0; i< count; i++){
  151.         SetRect(&rt, pt[i].x-MARK, pt[i].y-MARK, pt[i].x+MARK, pt[i].y+MARK);
  152.         FillRect(hdc, &rt, hRect);
  153.         }
  154.         break;
  155.     case WM_DESTROY:
  156.         DeleteObject(hDash);
  157.         DeleteObject(hBezier);
  158.         DeleteObject(hRect);
  159.         DeleteObject(hSel);
  160.         out.open("dat.txt");
  161.         for(int i=0; i<count; i++)out<<pt[i].x<<'\t'<<pt[i].y<<'\n';
  162.         out.close();
  163.         EndPaint(hWnd, &ps);
  164.         PostQuitMessage(0);
  165.         break;
  166.     default:return DefWindowProc(hWnd, message, wParam, lParam);
  167.     }
  168.     return 0;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement