понедельник, 15 мая 2017 г.

Программирование правильного многоугольника

В этой  статье мы научимся программировать правильные многоугольники с помощью Visual studio.
Открываем разархивированный архив Program2015. Запускаем, меняем разрядность, компилируем. Получаем пустое окно.
Solution Explorer → ProgramDlg.cpp
#include "stdafx.h"
#include "Program.h"
#include "ProgramDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// диалоговое окно CProgramDlg
  

CProgramDlg::CProgramDlg(CWndpParent /*=NULL*/)
       : CDialog(IDD_PROGRAM_DIALOGpParent)
{
       m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CProgramDlg::DoDataExchange(CDataExchangepDX)
{
       CDialog::DoDataExchange(pDX);



       fg = true;

       SetWindowTextW(L"Program");
}

BEGIN_MESSAGE_MAP(CProgramDlgCDialog)
       ON_WM_PAINT()
       ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()


// обработчики сообщений CProgramDlg

BOOL CProgramDlg::OnInitDialog()
{
       CDialog::OnInitDialog();

       // Задает значок для этого диалогового окна.  Среда делает это автоматически,
       //  если главное окно приложения не является диалоговым
       SetIcon(m_hIcon, TRUE);                 // Крупный значок
       SetIcon(m_hIcon, FALSE);          // Мелкий значок

       // TODO: добавьте дополнительную инициализацию

       return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
}

// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
//  чтобы нарисовать значок.  Для приложений MFC, использующих модель документов или представлений,
//  это автоматически выполняется рабочей областью.

void CProgramDlg::OnPaint()
{
       if (IsIconic())
       {
             CPaintDC dc(this); // контекст устройства для рисования

             SendMessage(WM_ICONERASEBKGNDreinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

             // Выравнивание значка по центру клиентского прямоугольника
             int cxIcon = GetSystemMetrics(SM_CXICON);
             int cyIcon = GetSystemMetrics(SM_CYICON);
             CRect rect;
             GetClientRect(&rect);
             int x = (rect.Width() - cxIcon + 1) / 2;
             int y = (rect.Height() - cyIcon + 1) / 2;

             // Нарисуйте значок
             dc.DrawIcon(x, y, m_hIcon);
       }
       else
       {
             CClientDC dc(this);
             GetClientRect(&rc);
            

             dc.FillSolidRect(&rc, RGB(255, 255, 255));
             cf = RGB(255, 255, 255);
             COLORREF ck = RGB(50, 70, 120);

             int cxClient, cyClient;
             cyClient = rc.bottom;//высота
             cxClient = rc.right;//ширина

             hPenOxy = CreatePen(PS_SOLID, 2, ck);//создаем кисть цветом "crOxy"
             hOldPen = (HPEN)SelectObject(dc, hPenOxy);

             int XX[100], YY[100];
             int n = 3;
             int r = 200;
             for (k = 0; k <= n; k++)
             {
                    XX[k] = cxClient / 2 + r*sin(pi * 2 / n*k);
                    YY[k] = cyClient / 2 + r*cos(pi * 2 / n*k);
         }
             //for (k = 0; k < n; k++)
             k = 0;
             {
                    dc.MoveTo(XX[k], YY[k]);
                    for (i = 0; i <= n; i++)
                    {
                           dc.LineTo(XX[i], YY[i]);
                           //dc.MoveTo(XX[k], YY[k]);
                    }
             }

             SelectObject(dc, hOldPen);
             DeleteObject(hPenOxy);

            
             CDialog::OnPaint();
       }
}

// Система вызывает эту функцию для получения отображения курсора при перемещении
//  свернутого окна.
HCURSOR CProgramDlg::OnQueryDragIcon()
{
       return static_cast<HCURSOR>(m_hIcon);
}

             int n = 3; Меняя число, мы можем менять количество углов в многоугольнике.
int=5
int=17

Комментариев нет:

Отправить комментарий