Мегаобучалка Главная | О нас | Обратная связь


Настройка режимов отображения



2020-02-04 189 Обсуждений (0)
Настройка режимов отображения 0.00 из 5.00 0 оценок




Функции этой группы устанавливают и настраивают систему координат, которая используется всеми функциями вывода – координаты вывода задаются именно в логических единицах. Кроме единиц по осям X и Y, функции этой группы задают направление осей и начало координат. Практически все функции группы реализованы парами. Функции с префиксом Get позволяют получить текущее значение параметра, а с префиксом Set устанавливают новое значение и возвращают предыдущее. По умолчанию начало координат находится в левом верхнем углу области вывода, (прежде всего окна). При этом ось X направлена слева направо, а ось Y – сверху вниз. Единица измерения – один пиксель (режим MM_TEXT). Кстати сказать, именно поэтому на различных устройствах, вследствие различий в размерах пикселя, фактический (визуальный) размер по оси X может не соответствовать размеру по оси Y.

Для настройки системы координат в Windows используются два понятия – физическая область вывода (viewport), координаты и размеры которой задаются в физических единицах – пикселях, и логическая область вывода (window), координаты и размеры которой задаются в логических единицах, определяемых размером рисования.

И физическая и логическая области вывода характеризуются точкой, определяющей начало координат. Для настройки начала координат физической области вывода используются функции:

virtual CPoint CDC::SetViewportOrg(int x, int y) или

virtual CPoint CDC::SetViewportOrg(POINT point)

Для настройки логической области вывода используются следующие функции:

CPoint CDC::SetWindowOrg(int x, int y) или

CPoint CDC::SetWindowOrg(POINT point)

Все четыре функции в качестве параметров получают новые значения для установки начала координат, а возвращают предыдущие значения. Здесь есть одна тонкость: если для физической области вывода указываются координаты, которые в дальнейшем будут являться началом координат, то для логической области вывода указываются логические координаты, которые в дальнейшем будут соответствовать левому верхнему углу логической области вывода.

Из вышесказанного следует, что есть смысл настраивать начало координатной сетки только для одной из областей, т.к система координат логической области вывода относительна системе координат физической области.

 

Рисование линий

Функции этой группы предназначены для рисования прямых (LineTo), гладких (Arc, ArcTo) и ломаных линий (Polyline, PolylineTo), установленным на момент рисования карандашом. Часть функций меняют при этом текущее положение карандаша, другие – нет. Даже если в результате рисования контур получается замкнутым, закрашивание не осуществляется.

Класс CFileDialog

Этот класс отвечает за создание и работоспособность двух блоков диалога: один позволяет выбрать файл для его последующего открытия, а другой предназначен для выбора места расположения и имени файла при его сохранении.

Ниже описаны некоторые основные функции класса.

CFileDialog::CFileDialog(BOOL bOpenFileDialog,

LPCTSTR lpszDefExt = NULL,

LPCTSTR lpszFileName = NULL,

DWORD dwFlags = OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,

LPCSTR lpszFilter = NULL,

CWnd *pParentWnd = NULL) – конструктор класса, создает объект «стандартный блок диалога».

Если параметр bOpenFileDialog равен TRUE, создается объект «блок диалога File Open (Открытие файла)» и объект «блок диалога File Save As (Сохранение файла)», если bOpenFileDialog равен FALSE.

virtual int CFileDialog::DoModal() – вызов этой функции выводит на экран модальный стандартный блок диалога для открытия или сохранения файла. При успешном завершении функция возвращает IDOK или IDCANCEL в зависимости от того, при помощи какой кнопки пользователь закрыл блок диалога.

Для того чтобы получить имя файла, определенное пользователем в блоке диалога, в классе реализованы несколько функций:

virtual  CString CFileDialog::GetPathName() – возвращает полное имя файла, включая путь.

virtual CString CFileDialog::GetFileName() – возвращает имя файла с расширением.

virtual CString CFileDialog::GetFileExt() – возвращает расширение имени файла.

virtual CString CFileDialog::GetFileTitle() – возвращает имя файла без расширения.

Выводы

 

В ходе выполнения курсовой работы были получены основы разработки Windows – приложений с использованием MFС. Был освоен объектно-ориентированный язык программирования Visual C++.

В результате работы была написана программа, которая строит изображение фигуры, приведенной на рисунке 5. При исходных данных (x1, y1,R1, x2, y2, r2, x3, y3, r3), которые должны быть считаны из выбранного пользователем файла. Осуществил проверку исходных данных на соответствие варианту: две окружности находятся внутри третьей.

 

Список используемой литературы

 

1. Шилдт Герберт «Полный справочник по С++»- 4-е издание.: Пер.с англ. – М.: Издательский дом «Вильямс», 2002.- 704с.: ил.

 

2. Мешков А., Тихомиров Ю. «Visual C++ и MFC» - СПб.:БХВ-Петербург. 2002 – 1017с.

 

3. Карпов Б., Баранов Т. «С++: специальный справочник» - СПб.: Питер, 2001. – 480 с.:ил.

 

4. Основы Microsoft Visual Studio. Net 2003/ Пер. с англ. - М.:Издательство- торговый дом "Русская редакция", 2003.-464 с: ил.

 

5. Круглински Д., Уингоу С, Шеферд Дж. «Программирование на Microsoft Visual C++ 6.0 для профессионалов»/Пер. с англ.- СПб: Питер, М.:Издательсво- торговый дом "Русская Редакция", 2004.- 861 с.:ил.

 

6. Бьярн Страуструп « Введение в язык СИ++», 1995

 

 

Приложение А

CMyDlg.cpp

#include "stdafx.h"

#include "4ertejmfc.h"

#include "4ertejmfcDlg.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) // конструктор класса, создает объект “стандартный блок   

                                                                                    диалога”

   : CDialog(CMyDlg::IDD, pParent)

{

   m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

 

void CMyDlg::DoDataExchange(CDataExchange* pDX)

{

   CDialog::DoDataExchange(pDX);

}

 

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)

   ON_WM_PAINT()

   ON_WM_QUERYDRAGICON()

   ON_WM_SIZE()

   ON_BN_CLICKED(IDC_BUTTON2, &CMyDlg::OnBtnUpdate)

   ON_BN_CLICKED(IDC_BUTTON1, &CMyDlg::OnBtnLoad)

END_MESSAGE_MAP()

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

 

BOOL CMyDlg::OnInitDialog()

{

   CDialog::OnInitDialog();

 

   SetIcon(m_hIcon, TRUE);          // Set big icon

   SetIcon(m_hIcon, FALSE);        // Set small icon

 

   return TRUE;

}

 

void CMyDlg::OnPaint()

{

   CPaintDC dc(this); // контекст устройств для рисования

 

   if (IsIconic())

   {

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

 

                  int cxIcon = GetSystemMetrics(SM_CXICON);

                  int cyIcon = GetSystemMetrics(SM_CYICON);

                  CRect rect; // объявили о создании объекта класса CRect

                  GetClientRect(&rect); //передаем размеры иконки  в объект Rect

                  int x = (rect.Width() - cxIcon + 1) / 2;

                  int y = (rect.Height() - cyIcon + 1) / 2;

 

                  dc.DrawIcon(x, y, m_hIcon); //рисование

   }

   else

   {

                  k_Draw.Draw(&dc);

   }

}

 

HCURSOR CMyDlg::OnQueryDragIcon()

{

   return static_cast<HCURSOR>(m_hIcon);

}

 

 

void CMyDlg::OnBtnLoad()

{

      CFileDialog fd(1, 0, 0, 4|2, _T("txt files (.txt)|*.txt|"), this); // CFileDialog fd(TRUE, ".txt", "ReadMe", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, Filter);

объявили о создании объекта класса CFileDialog для открытия файла

 

   if(fd.DoModal() != IDOK)return;

   k_filePath = fd.GetPathName(); // открыли файл, выбранный пользователем, на чтение

   if(!k_Draw.LoadParamFromFile(k_filePath.GetString()))

                  this->MessageBox(_T("Can't load params"));

   this->RedrawWindow();

}

void CMyDlg::OnSize(UINT nType, int cx, int cy)

{

   CDialog::OnSize(nType, cx, cy);

   this->RedrawWindow();

}

// функция OnSize вызывается при всяком изменении размера окна

void CMyDlg::OnBtnUpdate()

{

   if(k_filePath.GetLength() <= 0)return;

   if(!k_Draw.LoadParamFromFile(k_filePath.GetString()))

                  this->MessageBox(_T("Can't load params"));

   this->RedrawWindow();

}

 

Рисование

#include "StdAfx.h"

#include "Draw.h"

#include <Math.h>

 

inline int sqrt(int arg){return (int)sqrt((double) (arg)); }

 

CDraw::CDraw(void):

   isCorrectState(false)

{

}

 

CDraw::~CDraw(void)

{

}

bool CDraw::LoadParamFromFile(const TCHAR* path)

{

   CStdioFile file;

   if(!file.Open(path, CStdioFile::modeRead | CStdioFile::typeText))return false;

       

   CString strs[9];

   for(int i = 0; i < 9; i++)

   {

                  if(!file.ReadString(strs[i]))

                  {

                                  file.Close();

                                  return false;

                  }

   }

   int i = 0;

   X1 = _tstoi(strs[i++].GetString());

   Y1 = _tstoi(strs[i++].GetString());

   R1 = _tstoi(strs[i++].GetString());

   x2 = _tstoi(strs[i++].GetString());

   y2 = _tstoi(strs[i++].GetString());

   r2 = _tstoi(strs[i++].GetString());

   x3 = _tstoi(strs[i++].GetString());

   y3 = _tstoi(strs[i++].GetString());

   r3 = _tstoi(strs[i++].GetString());

 

   //test

 

   isCorrectState =

                  (R1 > 0) &&

                  (R1 > 2*r2) && (R1 > 2*r3) &&

                  ((x2 - r2) > x3) &&

                  sqrt((x2 - X1)*(x2 - X1) + (y2 - Y1)*(y2 - Y1)) + r2 < R1 &&

                  sqrt((x3 - X1)*(x3 - X1) + (y3 - Y1)*(y3 - Y1)) + r3 < R1 ;

                      

 

   return isCorrectState;

}

 

 

bool CDraw::Draw(CPaintDC* pDC)

{

   if(!isCorrectState)return false;

 

   RECT cr;

   pDC->GetWindow()->GetClientRect(&cr);

   int x0 = (cr.right - cr.left) /2;

   int y0 = (cr.bottom - cr.top) / 2;

       

   pDC->Rectangle(&cr);

 

 

   pDC->MoveTo(x0, cr.top);

   pDC->LineTo(x0, cr.bottom);

 

   pDC->MoveTo(cr.left,y0);

   pDC->LineTo(cr.right,y0);

 

   CRect r;

       

   r.SetRect(X1 - R1, -(Y1 - R1), X1 + R1, -(Y1 + R1));

   r.OffsetRect(x0, y0);

   pDC->Arc(&r, CPoint(r.left, r.top), CPoint(r.left, r.top));

 

   pDC->MoveTo(x2 + x0, r.top + 10);

   pDC->LineTo(x2 + x0, r.bottom - 10);

       

   pDC->MoveTo(x3 + x0, r.top + 10);

   pDC->LineTo(x3 + x0, r.bottom - 10);

 

   r.SetRect(x2 - r2, -(y2 - r2), x2 + r2, -(y2 + r2));

   r.OffsetRect(x0, y0);

   pDC->Arc(&r, CPoint(r.left, r.top), CPoint(r.left, r.top));

 

   r.SetRect(x3 - r3, -(y3 - r3), x3 + r3, -(y3 + r3));

   r.OffsetRect(x0, y0);

   pDC->Arc(&r, CPoint(r.left, r.top), CPoint(r.left, r.top));

 

   CPen pen(PS_SOLID, 7, (COLORREF)(0));

   CPen* penLast = pDC->SelectObject(&pen);

 

 

   pDC->MoveTo(X1 + x0, -Y1 + y0);

   pDC->LineTo(X1 + x0, -Y1 + y0);

 

   pDC->MoveTo(x2 + x0, -y2 + y0);

   pDC->LineTo(x2 + x0, -y2 + y0);

 

   pDC->MoveTo(x3 + x0, -y3 + y0);

   pDC->LineTo(x3 + x0, -y3 + y0);

 

   r.SetRect(x2 - r2, -(y2 - r2), x2 + r2, -(y2 + r2));

   r.OffsetRect(x0, y0);

   pDC->Arc(&r, CPoint(r.CenterPoint().x, r.bottom), CPoint(r.CenterPoint().x, r.top));

 

   r.SetRect(x3 - r3, -(y3 - r3), x3 + r3, -(y3 + r3));

   r.OffsetRect(x0, y0);

   pDC->Arc(&r, CPoint(r.CenterPoint().x, r.bottom), CPoint(r.CenterPoint().x, r.top));

 

 

   //rb

   int lu = Y1 + sqrt(R1*R1 - (X1 - x3)*(X1 - x3));

   int ru = Y1 + sqrt(R1*R1 - (x2 - X1)*(x2 - X1));

   int rd = Y1 -(ru - Y1);

   int ld = Y1 -(lu - Y1);

       

       

   pDC->MoveTo(x2 + x0, -(y2 - r2) + y0);

   pDC->LineTo(x2 + x0, -rd + y0);

 

   pDC->MoveTo(x2 + x0, -(y2 + r2) + y0);

   pDC->LineTo(x2 + x0, -ru + y0);

 

   pDC->MoveTo(x3 + x0, -(y3 - r3) + y0);

   pDC->LineTo(x3 + x0, -ld + y0);

 

   pDC->MoveTo(x3 + x0, -(y3 + r3) + y0);

   pDC->LineTo(x3 + x0, -lu + y0);

 

 

   r.SetRect(X1 - R1, -(Y1 - R1), X1 + R1, -(Y1 + R1));

   r.OffsetRect(x0, y0);

   pDC->Arc(&r, CPoint(x3 + x0, -ld + y0), CPoint(x2 + x0, -rd + y0));

   pDC->Arc(&r, CPoint(x2 + x0, -ru + y0), CPoint(x3 + x0, -lu + y0));

 

 

   pDC->SelectObject(penLast);

 

   //CRect rto = cr;

   //rto.right -= 10;

   //rto.bottom -= 10;

       

   //pDC->SetTextColor(0);

   //pDC->SetBkColor(RGB(255,255,255));

   //pDC->DrawText(_T("4ertenie 4ever!"),-1, &rto, DT_RIGHT | DT_BOTTOM | DT_SINGLELINE );

 

   return true;

}

 

 



2020-02-04 189 Обсуждений (0)
Настройка режимов отображения 0.00 из 5.00 0 оценок









Обсуждение в статье: Настройка режимов отображения

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (189)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)