Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //----------------------------------------------------
- #include "stdafx.h"
- #include <Windows.h>
- #include <tchar.h>
- #include <math.h>
- #include <cmath>
- #include <iostream>
- #include <fstream>
- #include <stdio.h>
- #define MAX 100
- #define N 30
- using namespace std;
- static int sx, sy;
- const int SCALE = 1000;
- const int MARK = 4;
- void DcInLp(POINT &point) {
- point.x = point.x* SCALE / sx;
- point.y = SCALE - point.y* SCALE / sy;
- }
- void transform(HDC& hdc)
- {
- SetMapMode(hdc, MM_ANISOTROPIC);
- SetWindowExtEx(hdc, SCALE, -SCALE, NULL);
- SetViewportExtEx(hdc, sx, sy, NULL);
- SetViewportOrgEx(hdc, 0, sy, NULL);
- }
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- TCHAR WinName[] = _T("MainFrame");
- int APIENTRY WinMain(HINSTANCE This, HINSTANCE Prev, LPSTR cmd, int mode) {
- HWND hWnd; //Дескриптор главного окна программы
- MSG msg; //Структура для хранения сообщений
- WNDCLASS wc; //Класс окна
- //Определение класса окон
- wc.hInstance = This;
- wc.lpszClassName = WinName; //Имя класса окна
- wc.lpfnWndProc = WndProc; //Функция окна
- wc.style = CS_HREDRAW | CS_VREDRAW; //Стиль окна
- wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //Стандартная иконка
- wc.hCursor = LoadCursor(NULL, IDC_ARROW); //Стандартный курсор
- wc.lpszMenuName = NULL; //Нет меню
- wc.cbClsExtra = 0; //Нет дополнительных данных класса
- wc.cbWndExtra = 0; //Нет дополнительных данных окна
- //Заполнение окна белым цветом
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //установка цвета фона
- if (!RegisterClass(&wc)) return 0; //Регистрация класса окна
- //Создание окна
- hWnd = CreateWindow(WinName, //Имя класса окна
- _T("Каркас Windows-приложения"), //Заголовок окна
- WS_OVERLAPPEDWINDOW, //Стиль окна
- CW_USEDEFAULT, // X
- CW_USEDEFAULT, // Y
- CW_USEDEFAULT, // Width
- CW_USEDEFAULT, // Height
- HWND_DESKTOP, //Дескриптор родительского окна
- NULL, //Нет меню
- This, //Дескриптор приложения
- NULL); //Дополнительной информации нет
- ShowWindow(hWnd, mode); //Показать окно
- //Цикл обработки сообщений
- while (GetMessage(&msg, NULL, 0, 0)) //цикл получения сообщения
- {
- TranslateMessage(&msg); //Функция трансляции кодов нажатой клавиши
- DispatchMessage(&msg); //Посылает сообщение функции WndProc()
- }
- return 0;
- }
- //Оконная функция вызываемая операционной системой
- //и получает сообщения из очереди для данного приложения
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {//обработчик сообщений
- PAINTSTRUCT ps;
- static HBRUSH hBrush;
- static HPEN hDash, hBezier; // два пера
- static HBRUSH hRect, hSel; // две кисти
- static POINT pt[20]; // массив хранения плоских точек
- static POINT point; // структура под одну плоскую точку
- RECT rt; // структура точек прямоугольника
- static int count, index; // счётчик точек,
- static bool capture; // логическая переменная для мыши
- float x[MAX], y[MAX], eps = 0.04, X, Y, t, xA, xB, xC, xD,
- yA, yB, yC, yD, a0, a1, a2, a3, b0, b1, b2, b3;
- int n, i, j, first;
- ifstream in; //класс файлового потокового ввода-вывода
- ofstream out;
- HDC hdc;
- switch (message)
- {
- case WM_CREATE:
- in.open("dat.txt"); // открытие файлового потока
- if (in.fail()) {
- MessageBox(hWnd, _T("Файл dat.txt не найден"),
- _T("Открытие файла"), MB_OK | MB_ICONEXCLAMATION);
- PostQuitMessage(0);
- return 1;
- }
- for (count = 0; in >> pt[count].x; count++)in >> pt[count].y;
- in.close();
- hDash = CreatePen(PS_DASH, 1, 0);
- hBezier = CreatePen(PS_SOLID, 4, RGB(0, 0, 255));
- hRect = CreateSolidBrush(RGB(128, 0, 128));
- hSel = CreateSolidBrush(RGB(255, 0, 0));
- break;
- case WM_SIZE:
- sx = LOWORD(lParam);//Ширина
- sy = HIWORD(lParam);//Высота
- break;
- case WM_LBUTTONDOWN:
- point.x = LOWORD(lParam);
- point.y = HIWORD(lParam);
- DcInLp(point);
- for (i = 0; i <= count; i++) {
- SetRect(&rt, pt[i].x - MARK, pt[i].y - MARK, pt[i].x + MARK, pt[i].y + MARK);
- if (PtInRect(&rt, point)) {
- index = i;
- capture = true;
- hdc = GetDC(hWnd);
- transform(hdc); //Переход в логические координаты
- FillRect(hdc, &rt, hSel);//Отметим прямоугольник цветом
- ReleaseDC(hWnd, hdc);
- SetCapture(hWnd);
- return 0;
- }
- }
- break;
- case WM_LBUTTONUP:
- if (capture) {
- ReleaseCapture();
- capture = false;
- }
- break;
- case WM_MOUSEMOVE:
- if (capture) {
- point.x = LOWORD(lParam);
- point.y = HIWORD(lParam);
- DcInLp(point);
- pt[index] = point;
- InvalidateRect(hWnd, NULL, TRUE);
- }
- break;
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);//Установка режима
- transform(hdc);
- SelectObject(hdc, hDash);
- Polyline(hdc, pt, count);
- SelectObject(hdc, hBezier);
- PolyBezier(hdc, pt, count);
- for (int i = 0; i < count; i++) {
- SetRect(&rt, pt[i].x - MARK, pt[i].y - MARK, pt[i].x + MARK, pt[i].y + MARK);
- //FillRect(hdc, &rt, hRect);
- SelectObject(hdc, hBrush);
- MoveToEx(hdc, pt[i].x - MARK, pt[i].y - MARK, NULL);
- LineTo(hdc, pt[i].x + MARK, pt[i].y + MARK);
- MoveToEx(hdc, pt[i].x - MARK, pt[i].y + MARK, NULL);
- LineTo(hdc, pt[i].x + MARK, pt[i].y - MARK);
- n = count;
- }
- for (i = 0; i <= n; i++)
- {
- X = pt[i].x; Y = pt[i].y;
- MoveToEx(hdc, X - eps, Y - eps, NULL); LineTo(hdc, X + eps, Y + eps);
- MoveToEx(hdc, X + eps, Y - eps, NULL); LineTo(hdc, X - eps, Y + eps);
- }
- first = 1;
- for (i = 1; i < n - 2; i++)
- {
- xA = pt[i - 1].x; xB = pt[i].x; xC = pt[i + 1].x; xD = pt[i + 2].x;
- yA = pt[i - 1].y; yB = pt[i].y; yC = pt[i + 1].y; yD = pt[i + 2].y;
- a3 = (-xA + 3 * (xB - xC) + xD) / 6.0; b3 = (-yA + 3 * (yB - yC) + yD) / 6.0;
- a2 = (xA - 2 * xB + xC) / 2.0; b2 = (yA - 2 * yB + yC) / 2.0;
- a1 = (xC - xA) / 2.0; b1 = (yC - yA) / 2.0;
- a0 = (xA + 4 * xB + xC) / 6.0; b0 = (yA + 4 * yB + yC) / 6.0;
- for (j = 0; j <= N; j++)
- {
- t = (float)j / (float)N;
- X = ((a3*t + a2)*t + a1)*t + a0;
- Y = ((b3*t + b2)*t + b1)*t + b0;
- if(first) { first = 0; MoveToEx(hdc, X, Y, NULL); }
- else LineTo(hdc, X, Y);
- }
- }
- break;
- case WM_DESTROY:
- DeleteObject(hDash);
- DeleteObject(hBezier);
- DeleteObject(hRect);
- DeleteObject(hSel);
- out.open("dat.txt");
- for (int i = 0; i < count; i++)out << pt[i].x << '\t' << pt[i].y << '\n';
- out.close();
- EndPaint(hWnd, &ps);
- PostQuitMessage(0);
- break;
- default:return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement