
Опытный
 
Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск
Репутация: 33 Всего: 37
|
| Код | #include <windows.h> #include <wingdi.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <math.h>
typedef struct { int x, y; COLORREF color; } TAttr;
typedef struct { TAttr* point; size_t size; size_t max; } TPolygon;
TPolygon poly;
//----------------------------------------------// // Определяет длину линии float Length(const TAttr* a, const TAttr* b) { return sqrt(pow(a->x - b->x, 2) + pow(a->y - b->y, 2)); } //----------------------------------------------// // Заполняем случайные значения TPolygon* RandomValues(TPolygon* poly) { size_t idx = poly->size; while (idx--) { poly->point[idx].x = rand() % 450; poly->point[idx].y = rand() % 350; poly->point[idx].color = RGB(rand()%255, rand()%255, rand()%255); }
return poly; } //----------------------------------------------// // Определяем индекс самой длинной линии int MaxLength(const TPolygon* poly) { struct { size_t idx; float val; } max = {0, 0};
size_t i; for (i=0; i<poly->size-1; ++i) { float val = Length(&poly->point[i], &poly->point[i+1]); if (max.val < val) { max.val = val; max.idx = i; } } return max.idx; } //----------------------------------------------// // Рисуем линии void DrawLines(HDC hdc, const TPolygon* poly) { MoveToEx(hdc, poly->point->x, poly->point->y, NULL);
size_t i; for (i=1; i<poly->size-1; ++i) { HPEN hPen = CreatePen(PS_SOLID, 1, poly->point[i].color); SelectObject(hdc, hPen); LineTo(hdc, poly->point[i].x, poly->point[i].y); DeleteObject(hPen); } } //----------------------------------------------// //Функция окна LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam) { HDC hdc; //создаём контекст устройства PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода HPEN hPen;
//Цикл обработки сообщений switch (messg) { //сообщение рисования case WM_PAINT : hdc = BeginPaint(hWnd, &ps); DrawLines(hdc, &poly); hPen = CreatePen(PS_SOLID, 3, RGB(255, 0, 0)); SelectObject(hdc, hPen); MoveToEx(hdc, poly.point[poly.max].x, poly.point[poly.max].y, NULL); LineTo(hdc, poly.point[poly.max+1].x, poly.point[poly.max+1].y); DeleteObject(hPen);
ValidateRect(hWnd, NULL); EndPaint(hWnd, &ps); break;
//сообщение выхода - разрушение окна case WM_DESTROY: PostQuitMessage(0); //Посылаем сообщение выхода с кодом 0 - нормальное завершение break;
default: return(DefWindowProc(hWnd, messg, wParam, lParam)); //освобождаем очередь приложения от нераспознаных } return 0; } //----------------------------------------------// int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { srand(time(0)); poly.size = rand()%30 + 10; poly.point = (TAttr*) malloc(sizeof(TAttr) * poly.size); RandomValues(&poly); poly.max = MaxLength(&poly); static const char szProgName[] = "Ломаная";
WNDCLASS w;
w.lpszClassName = szProgName; //имя программы - объявлено выше w.hInstance = hInstance; //идентификатор текущего приложения w.lpfnWndProc = WndProc; //указатель на функцию окна w.hCursor = LoadCursor(NULL, IDC_ARROW); //загружаем курсор w.hIcon = 0; w.lpszMenuName = 0; w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //цвет фона окна w.style = CS_HREDRAW | CS_VREDRAW; w.cbClsExtra = 0; w.cbWndExtra = 0;
//Если не удалось зарегистрировать класс окна - выходим if (!RegisterClass(&w)) { return 0; }
//Создадим окно в памяти, заполнив аргументы CreateWindow HWND hWnd = CreateWindow(szProgName, //Имя программы "graph", //Заголовок окна WS_OVERLAPPEDWINDOW, //Стиль окна - перекрывающееся CW_USEDEFAULT, //положение окна на экране по х CW_USEDEFAULT, //положение по у 500, //ширина 400, //высота (HWND)NULL, //идентификатор родительского окна (HMENU)NULL, //идентификатор меню (HINSTANCE)hInstance, //идентификатор экземпляра программы (HINSTANCE)NULL); //отсутствие дополнительных параметров
//Выводим окно из памяти на экран ShowWindow(hWnd, nCmdShow); //Обновим содержимое окна UpdateWindow(hWnd);
MSG lpMsg; //Цикл обработки сообщений while (GetMessage(&lpMsg, NULL, 0, 0)) { TranslateMessage(&lpMsg); DispatchMessage(&lpMsg); } free(poly.point); return(lpMsg.wParam); } //----------------------------------------------//
|
Присоединённый файл ( Кол-во скачиваний: 2 )
graph.7z 4,37 Kb
--------------------
Я знаю, что ничего не знаю© Сократ 
|