Для реализации такого подхода в Windowsпредусмотрен специальный объект, называемый контекстом устройства. Именно он хранит необходимую информацию, как об устройстве вывода, так и о параметрах соответственно рисования. Физически весь вывод происходит, естественно, на конкретное устройство, представленное в системе контекстом, описываемым, в свою очередь, дескриптором. Последний используют (в качестве параметра) все функции графического вывода Win32 API, т.е. при этом задействуется объект «контекст устройства», до чего MFC-приложению нет никакого дела – оно работает с объектами классов библиотеки MFC, что существенно удобнее и надежнее.
CDC – базовый класс для всех классов, инкапсулирующих контексты устройств Windows. Объекты этого класса используются для работы со всем экраном дисплея или с таким устройством, как принтер.
CClientDC – объекты этого класса обеспечивают доступ к клиентской части окна. Используется для графического вывода в любой функции. При создании объекта класса CClientDC в конструкторе вызывается функция Win32 APIGetDC, а при разрушении, в деструкторе – ReleaseDC, также из Win32 API, обеспечивая необходимые операции для подготовки и завершения процесса графического вывода именно и только в клиентскую часть окна. За создание объекта класса CClientDC отвечает разработчик приложения.
Графические объекты
Настройка параметров графического вывода проводится двумя путями. Одни параметры настраиваются при помощи вызова функций Win32 APIили функций-членов класса CDC и производных от него, другие – путем замены так называемых графических объектов. Библиотека MFC обеспечивает разработчиков всеми необходимыми классами, которые инкапсулируют соответствующие графические объекты Windows. Кроме того, библиотека имеет в своем составе дополнительные классы, значительно облегчающие решение ряда задач (к примеру классы CPointи CRect).
CPen – инкапсулирует объект Windows «карандаш», который может быть выбран (назначен) в контекст устройства и использоваться для определения типа и цвета линий и границ фигур.
CBrush – Инкапсулирует объект Windows «кисть», который может быть выбран (назначен) в контекст устройства и использоваться для определения типа и цвета заливки внутренних областей замкнутых фигур.
Создать объекты CPenи CBrush можно двумя способами:
1. Конструктор используется как для создания собственно объекта, так и для его инициализации.
2. Помимо использования конструктора, только создающего объект класса, дополнительно требуется вызов инициализирующей функции.
Второй способ предпочтительнее, т.к. невозможность инициализации, например, в случае исчерпания соответствующих системных ресурсов, легче определить при вызове именно функции инициализации. В противном случае для гарантии защиты от ошибок, вернее, для их своевременного обнаружения потребуется механизм обработки исключений.
Настройка режимов отображения
Функции этой группы устанавливают и настраивают систему координат, которая используется всеми функциями вывода – координаты вывода задаются именно в логических единицах. Кроме единиц по осям 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, создается объект «блок диалога FileOpen (Открытие файла)» и объект «блок диалога FileSaveAs (Сохранение файла)», если bOpenFileDialog равен FALSE.
virtualintCFileDialog::DoModal() – вызов этой функции выводит на экран модальный стандартный блок диалога для открытия или сохранения файла. При успешном завершении функция возвращает IDOKили IDCANCELв зависимости от того, при помощи какой кнопки пользователь закрыл блок диалога.
Для того чтобы получить имя файла, определенное пользователем в блоке диалога, в классе реализованы несколько функций:
virtualCStringCFileDialog::GetPathName() – возвращает полное имя файла, включая путь.
virtualCStringCFileDialog::GetFileName() – возвращает имя файла с расширением.
virtual CString CFileDialog::GetFileExt() – возвращаетрасширениеименифайла.
virtual CString CFileDialog::GetFileTitle() – возвращаетимяфайлабезрасширения.
Выводы
В ходе выполнения курсовой работы были получены основы разработки Windows – приложений с использованием MFС. Был освоен объектно-ориентированный язык программирования VisualC++.
В результате работы была написана программа, которая строит изображение фигуры, приведенной на рисунке 5. При исходных данных (x1, y1,R1, x2, y2, r2, x3, y3, r3), которые должны быть считаны из выбранного пользователем файла. Осуществил проверку исходных данных на соответствие варианту: две окружности находятся внутри третьей.
Список используемой литературы
1. Шилдт Герберт «Полный справочник по С++»- 4-е издание.: Пер.с англ. – М.: Издательский дом «Вильямс», 2002.- 704с.: ил.
2. Мешков А., Тихомиров Ю. «VisualC++ и 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);
}
voidCMyDlg::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()
{
CPaintDCdc(this); // контекст устройств для рисования
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRectrect; // объявили о создании объекта класса 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"));