Разработка приложения "Аналоговые часы" на языке C++ с использованием библиотеки MFC
Особенности разработки и представления проекта программы, представляющей собой аналоговые часы с циферблатом, часовой, минутной и секундной стрелкой. Применение MS Visual Studio 2010, языка С++ для ее написания и компилирования. Специфика библиотеки MFC.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 17.03.2014 |
Размер файла | 440,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
26
Введение
В данном курсовом проекте представлена программа, представляющая собой аналоговые часы с циферблатом, часовой, минутной и секундной стрелкой.
Программа написана и откомпилирована MS Visual Studio 2010.
Список файлов, составляющих проект:
Исходный код:
mysimple_clock.cpp
Схема приложения (в целях изучения библиотеки MFC и Windows API, для простоты проектирования и понимания, весь функционал приложения был описан одним единственным файлом mysimple_clock.cpp). Схема взаимодействия методов классов, описанных в mysimple_clock.cpp представлена на диаграмме:
1. Описание классов программы
class CClockApp
Класс предназначен для запуска и инициализации всего приложения. Он создает экземпляр (instance) главного класса CClockFrame, который одновременно реализует всю математику приложения и визуализацию посредством MFC (Microsoft Foundation Classes). Запуск осуществляет через конструктор CClockFrame().
Исходный код:
class CClockApp:public CWinApp
{
public:
int InitInstance()
{
CClockFrame *p ;
p = new CClockFrame();
p->ShowWindow(1);
m_pMainWnd = p;
return 1;
}
};
class CClockFrame
Это главный класс всего приложения (программы). Данный класс - это класс фрейма, главное окно. Принимает на себя нагрузку по организации взаимодействия пользователя с окном вида, а также реализации всей математики приложения и визуализации.
2. Исходный код
//*************************************************************************************
// Класс часов -Графическая форма. Тут же логика.
class CClockFrame :public CFrameWnd
//наследуемся от встроенного класса фреймвого окна CFrameWnd.
{
private:
RECT _rect;
//базовая структура, описывает координаты верхнего левого и
//и нижнего правого углов прямоугольника. Данная структура
//будет использоваться для описания клиентской области окна.
//--------центрирование фрейма относительно экрана монитора (диагонали)-
public:
BOOL CClockFrame::PreCreateWindow(CREATESTRUCT& cs){
//Изменение функционала окна CClockFrame
//через PreCreateWindow.
//:: - глобальное разрешение функции PreCreateWindow
//вне класса.CREATESTRUCT - определяет параметры инициализации
//передаваемой оконной процедуре
cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 1.5;
//получаем размер экрана меньший в 1.5 раза по y
cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 2;
//- в 2 раза по x
cs.y = ((cs.cy * 1.5) - cs.cy)/2;
//получаем необходимую точку для центрирования фрейма
//CClockFrame относительно заданного экрана.
//Пропорционально выбранному делителю - 1.5 по y
cs.x = ((cs.cx * 2) - cs.cx)/2;
//-2 по x.
return TRUE;
}
//----конструктор класса CClockFrame (вид фрейма как фрейма или диалога; определение клавиш упр.)
CClockFrame()
{
HBRUSH brush = (HBRUSH)::CreateSolidBrush(RGB(0,0,0));
//Определение свойств кисти. Заливка сплошным цветом.
CString mywindow = AfxRegisterWndClass(
// CString - класс милкософта для передачи строк.
// В mfc пользуем именно его.
// регистрируем свой класс окна с предъустановл. сво-ми.
CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,0,brush,0);
// CS_HREDRAW - перерисовка внутр. области окна при изм. ширины
// CS_VREDRAW - тоже самое при высоте.
// CS_DBLCLKS - сообщение при двойном нажатии мыши
Create(mywindow,CString("Мои часы. С циферблатом и секундной стрелкой"),
WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
// создаем ограничение -> невозможность произвольно
// менять размер окна
// можно получить диалог.окно WS_SYSMENU
// создаем сам фрейм окна и передаем ранее заданные дескрипторы
// mywindow - свойства окна; название заголовка окна;
// WS_SYSMENU - оконное меню в строке заголовка фрейма.
}
//-----------------рисвание фрейма
int OnCreate(LPCREATESTRUCT l)
// LPCREATESTRUCT - cтруктура, описывающая параметры фрейма
// при его создании (API-функция)
{
CFrameWnd::OnCreate(l);
// OnCreate - функция-член для создание окна.
SetTimer(1,1000,NULL);
// (системный таймер)
// Функция посылающее "сообщение" фрейму через каждую 1 секунду
// необходимо для создания часов (получ. данных через 1 секунду)
// логика: получение системного времени->перерисовка стрелок
// через 1 секунду
return 1;
}
//-----------------рисуем стрелки, циферблат (цифры)
void OnPaint()
{
CPaintDC d(this);
// Вывод чего либо (примитивы, регионы) на контекст устройства.
//-----------
CBrush b(RGB(192,192,192));
//Задание цвета кисти для последующего применения к примитивам
float x1 = -220;
float y1 = -220;
float x2 = 220;
float y2 = 220;
// координаты центральная область под стрелками и цифрами
Transform(&x1,&y1);
// передаем в пользовательскую процедуру. Изменение размеров областей
// при изменении размеров фрейма. (левый-верхний)
Transform(&x2,&y2);
// (нижний правый)
CRect rect(x1,y1,x2,y2);
// область прямоугольник-циферблат. (передаем координаты)
d.FillRect(&rect,&b);
// заполняем выбранный прямоуголник rect заданной кистью b (заполняем цветом)
// выводим все это в область _rect класса CClockFrame
/*
LOGBRUSH l_LogBrush;
// линия из точек без задания расстояния
l_LogBrush.lbColor = RGB(0,0,0);
l_LogBrush.lbStyle = BS_SOLID;
l_LogBrush.lbHatch=10;
CPen l_pen(PS_GEOMETRIC | PS_DOT, 3, &l_LogBrush, 0, NULL);
*/
CPen el_outer(PS_SOLID,1,RGB(0,0,0));
CBrush el_brush_outer(RGB(226,226,226));
d.SelectObject(el_outer);
d.SelectObject(el_brush_outer);
d.Ellipse(&rect);
// рисуем внешний элипс (круг) по координатам закрашенной
// области-квадрата и устанавливаем ему определенный цвет.
d.SelectStockObject(WHITE_BRUSH);
// восстанавливаем все в белое
CPen l_pen;
// рисуем циферблат (пункты секунд) - пунктирная линия
LOGBRUSH lb;
lb.lbColor=RGB(153,0,0);
// устанавливаем цвет (пункты секунд) они же точки
lb.lbStyle=BS_SOLID;
lb.lbHatch=0;
DWORD arr[2];
arr[0]=2;// играемся промежутками между пунктирами
arr[1]=19.6;//
l_pen.CreatePen(PS_USERSTYLE|PS_GEOMETRIC,3,&lb,2,arr);
// устанавливаем свой геометрический стиль линии «ручке»
d.SelectObject(&l_pen);
float centr_el_x=0;
float centr_el_y=0;
Transform(¢r_el_x,¢r_el_y);
drawCircle(&d,centr_el_x,centr_el_y,330);
// рисуем внутренний круг и обрамляем края линией
// своего стиля - пунктиром. Центр круга - 0,0
//-----------
CPen p2(PS_SOLID,6,RGB(8,28,255));
// установка цвета для минуты и часа стрелок
CPen sec_p(PS_SOLID,4,RGB(153,0,0));
// установка цвета секундной стрелки
d.SelectObject(&p2);
// заносим объект типа (CPen) p2 в контекст типа (CPaintDC) d
float fhour;// поля для час, минута, секунда
float fmin;
float fsec;
CTime t1;
CTime t = CTime::GetCurrentTime();
// получаем системное время из OC Windows (формат UTC)
// начальная инициализация (секунды, минуты, часы)
fhour = t.GetHour()%12;
// получаем час (0-23). Переводим в 12 часовую форму.
fmin = t.GetMinute();
// получаем минуты (0-59)
fsec = t.GetSecond();
// получаем секунды (0-59)
fhour += fmin/60;
// час=час+минута(ы)/60 чтобы часовая стрелка тоже двигалась
fhour = fhour * 360 / 12;
// смещение (дискретное) на 30 град (360/12) * час.
// Если час дробный, то
// смещение происходит на какую-то долю.
// Полученное значение - радианы.
fmin = fmin * 360 / 60;
// смещение (дискретное) на 6 град. (360/60) по окружности
// каждую минуту (рад)
fsec = fsec * 360 / 60;
// смещение (дискретное) на 6 град. по окружности каждую
// секунду (рад)
// d[град]=d[рад]*(Pi/180) // общая формула x=cos_d*R; y=sin_d*R
// xs,ys -коор.секунда xm,ym - коор.минута xh,yh - коор.час
float xs = 130 * cos((-fsec * (PI / 180.0))+ PI/2.0);
// R*cos((-d[рад]*Pi/180)+ Pi/2)
// PI/2 - начало отсчета I квадрант(вертикаль)
// против час. стрелки
float ys = 130 * sin((-fsec * (PI / 180.0))+ PI/2.0);
float xm = 100 * cos((-fmin * (PI / 180.0))+ PI/2.0);
float ym = 100 * sin((-fmin * (PI / 180.0))+ PI/2.0);
float xh = 70 * cos((-fhour * (PI / 180.0))+ PI/2.0);
// длинна стрелки (позиция новой точки) fhour
float yh = 70 * sin((-fhour * (PI / 180.0))+ PI/2.0);
float x = 0;
float y = 0;
// начальные значения - центр
Transform(&x,&y);
// изменение при перерисовке центра (0,0)
Transform(&xh,&yh);
d.MoveTo(x,y);
// перемещение (час)
d.LineTo(xh,yh);
// рисование (час). До указ. Координаты.
Transform(&xm,&ym);
d.MoveTo(x,y);// перемещение (минута)
d.LineTo(xm,ym);// рисование (минута)
d.SelectObject(&sec_p);
// применение цвета к секундной стрелке
Transform(&xs,&ys);
d.MoveTo(x,y);// перемещение (секунда)
d.LineTo(xs,ys);// рисование (секунда)
d.SelectObject(el_outer);
d.SelectObject(el_brush_outer);
drawCircle(&d,x,y,20);
// делаем закрывающий шпиндель сверху стрелок)
//---------рисование циферблата (цифры по окружности)
d.SelectObject(&p2);
// цвет
char *str[] = {"3","2","1","12","11","10","9","8","7","6","5","4"};
// раставление от квандрант Pi=180 град. против час.
/*
char *str_point[]={".",".",".",".",".",".",".",".",".",".",".",".",
".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",
".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",
".","."};
// рисование пунктов [.] текстом - не лучшее реш.
//*/
CFont f;
f.CreatePointFont(170,(LPCTSTR)"Times New Roman");
// стиль буковок
d.SelectObject(&f);
d.SetBkMode(TRANSPARENT);
// установка режима фона//TRANSPARENT не изменять до отрисовки
CString txt_header = CString("СПБГПУ ИУС");
CString txt_bottom = CString("Киряков С.В.");
d.SetTextColor(RGB(0,0,0));
float xtext1=-80;
float ytext1=60;
float xtext2=-70;
float ytext2=-80;
Transform(&xtext1,&ytext1);
Transform(&xtext2,&ytext2);
d.TextOutW(xtext1,ytext1,txt_header);
// указание позиции надписи и самого объекта надписи
d.TextOutW(xtext2,ytext2,txt_bottom);
d.SetTextColor(RGB(8,28,255));
for(int i = 0;i < 12;i++)// перебор цифр
{
float x = 194 * cos(i * PI / 6.0);
// R * cos(i*Pi/6 град) кол-во элементов для размещ-12.
// 194 или 190 - сдвиг относительно x и y
float y = 190 * sin(i * PI / 6.0);
Transform(&x,&y);
d.TextOut(x-5,y-10,CString(str[i]),strlen(str[i]));
// выравнивание циферблата. x-5; y-1// выбрано имперически. Выравнивание в массиве
// одинарного символа и двойного происходит по-раз.
}
/*
d.SetTextColor(RGB(153,0,0));
// перебор пунктов циферблата [.] текстом - отказался
for(int i = 0;i < 48;i++)
{
float x = 170 * cos(i * PI / 24.0);
// R * cos(i*Pi/24 град) кол-во элементов для размещ-48.
float y = 170 * sin(i * PI / 24.0);
Transform(&x,&y);
d.TextOut(x,y,CString(str_point[i]),strlen(str_point[i]));
}
//*/
}
/*------метод изменения (перерисовки) координат примитивов (прямоугольника, линий итд) как только изменяется клиентская область окна (изменение размеров) происходит изменение (перерисовка) переданных координат. */
void Transform(float *px , float *py)
{
::GetClientRect(m_hWnd,&_rect);
// GetClientRect - клиентская часть окна
//- прямоугольник окна(клиентская область окна)
// m_hWnd - указатель на само окно (handle)
// _rect - стуктура с координатами, описанная в классе CClockFrame
float width = (_rect.right-_rect.left)/2;
float height = (_rect.bottom-_rect.top)/2;
*px = *px + width;
// именно так! (иначе все в обратном порядке)
*py = height - *py;
}
//-------------затирка старого фона (перерисовка)-получ.динам. картинки---------
void OnTimer(UINT n)
{
this->Invalidate();// (0)
// CWnd::Invalidate - стирать ли фон в области обновления
// без этого метода получим статичную картинку
// -> выбор элемента по указателю.
}
//-------------рисуем эллипс типа круг по заданному R (x, y, R)
void drawCircle (CPaintDC *aDC, int aX, int aY, int aD)
{
double r=aD/2;
aDC->Ellipse(aX-r,aY-r,aX+r,aY+r);
}
// этим методом рисуем эллипс типа круг
// задаем нач. позиции X и Y и указываем R
DECLARE_MESSAGE_MAP();
// класс определяем сопоставление сообщениям. Если он
// реагирует на какие-либо события
};
//*************************************************************************************
3. Пример выполнения программы
Заключение
программа часы аналоговый
В результате данного курсового проекта была разработана программа mysimple_clock выполняющая функцию стрелочных часов и готовая к практическому применению. В ходе создания я познакомился с библиотекой MFC и возможностями предоставляемыми разработчику этой библиотекой. В качестве примера применения этого приложения - использование собственного скринсейвера (хранитель экрана) на ОС Windows 7:
Готовый исполняющий файл, полученный в ходе компиляции программы в ide (Microsoft Visual Studio 2010 sp1) - mysimple_clock.exe, находящийся в каталоге Debug корня проекта, необходимо переименовать в mysimple_clock.scr. Далее данный файл необходимо поместить в C:\Windows\System32. Теперь в заставках Windows (Персонализация->Заставка) есть новая заставка - mysimple_clock.
Приложение
Весь исходный код
#include <afxwin.h> // большинство заголовочных файлов для mfc
#include <afxext.h>// для доп. возможностей mfc
#include <math.h>// математические функции
//#define _AFXDLL
// константа для вычислений окружности
const double PI = 3.14159;
//****************************************************************************************************
// Класс часов -Графическая форма. Тут же логика.
class CClockFrame :public CFrameWnd
//наследуемся от встроенного класса фреймвого окна CFrameWnd.
{
private:
RECT _rect;
//базовая структура, описывает координаты верхнего левого и
//и нижнего правого углов прямоугольника. Данная структура _rect
//будет использоваться для описания клиентской области окна.
//--------центрирование фрейма относительно экрана монитора (диагонали)-
public:
BOOL CClockFrame::PreCreateWindow(CREATESTRUCT& cs){
//Изменение функционала (функциональных возможностей) окна CClockFrame
//через PreCreateWindow. :: - глобальное разрешение функции PreCreateWindow
//вне класса.CREATESTRUCT - определяет параметры инициализации
//передаваемой оконной процедуре
cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 1.5;
//получаем размер экрана меньший в 1.5 раза
cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 2;
//- в 2 раза
cs.y = ((cs.cy * 1.5) - cs.cy)/2;
//получаем необходимую точку для центрирования фрейма
//CClockFrame относительно заданного экрана.
//Пропорционально выбранному делителю - 1.5
cs.x = ((cs.cx * 2) - cs.cx)/2;
//-2
return TRUE;
}
//------------конструктор класса CClockFrame (вид фрейма как фрейма или диалога; определение клавиш упр.)
CClockFrame()
{
HBRUSH brush = (HBRUSH)::CreateSolidBrush(RGB(0,0,0));
//Определение свойств кисти. Заливка сплошным цветом.
CString mywindow = AfxRegisterWndClass(
//CString - класс милкософта для передачи строк.
//В mfc пользуем именно его.
//регистрируем свой класс окна с предъустановл. сво-ми.
CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,0,brush,0);
//CS_HREDRAW - перерисовка внутр. области окна при изм. ширины
//CS_VREDRAW - тоже самое при высоте.
//CS_DBLCLKS - сообщение при двойном нажатии мыши
Create(mywindow,CString("Мои часы. С циферблатом и секундной стрелкой"),
WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
// создаем ограничение -> невозможность произвольно
// менять размер окна
// можно получить диалог.окно WS_SYSMENU
// создаем сам фрейм окна и передаем ранее заданные дескрипторы
// mywindow - свойства окна; название заголовка окна;
// WS_SYSMENU - оконное меню в строке заголовка фрейма.
}
//-----------------рисвание фрейма
int OnCreate(LPCREATESTRUCT l)
//LPCREATESTRUCT - cтруктура, описывающая параметры фрейма
//при его создании (api-функция)
{
CFrameWnd::OnCreate(l);
//OnCreate - функция-член для создание окна.
SetTimer(1,1000,NULL);
//(системный таймер)
//Функция посылающее "сообщение" фрейму через каждую 1 секунду
//необходимо для создание часов (перерисовка через 1 секунду)
//логика: получение системного времени->перерисовка стрелок через 1 секунду
return 1;
}
//-----------------рисуем стрелки, циферблат (цифры)
void OnPaint()
{
CPaintDC d(this);
//Вывод чего либо (примитивы, регионы) на контекст устройства.
//------------------------
CBrush b(RGB(192,192,192));
//Задание цвета кисти для последующего применения к примитивам
float x1 = -220;//центральная область под стрелками и цифрами - прямоугольник
float y1 = -220;
float x2 = 220;
float y2 = 220;
Transform(&x1,&y1);// передаем в пользовательскую процедуру. Изменение размеров областей
// при изменении размеров фрейма. (левый-верхний)
Transform(&x2,&y2); // (нижний правый)
CRect rect(x1,y1,x2,y2);
//область прямоугольник-циферблат. (передаем координаты)
d.FillRect(&rect,&b);
//заполняем выбранный прямоуголник rect заданной кистью b (заполняем цветом)
//выводим все это в область _rect класса CClockFrame
/*
LOGBRUSH l_LogBrush;// линия из точек без задания расстояния
l_LogBrush.lbColor = RGB(0,0,0);
l_LogBrush.lbStyle = BS_SOLID;
l_LogBrush.lbHatch=10;
CPen l_pen(PS_GEOMETRIC | PS_DOT, 3, &l_LogBrush, 0, NULL);
*/
CPen el_outer(PS_SOLID,1,RGB(0,0,0));
//d.SelectStockObject(GRAY_BRUSH);// только предопределенные цвета
CBrush el_brush_outer(RGB(226,226,226));
d.SelectObject(el_outer);
d.SelectObject(el_brush_outer);
d.Ellipse(&rect);
d.SelectStockObject(WHITE_BRUSH); //восстанавливаем все в белое
CPen l_pen;// рисуем циферблат (пункты секунд) - пунктиром
LOGBRUSH lb;
lb.lbColor=RGB(153,0,0);
lb.lbStyle=BS_SOLID;
lb.lbHatch=0;
DWORD arr[2];
arr[0]=2;//1.2
arr[1]=19.6;//19.6
l_pen.CreatePen(PS_USERSTYLE|PS_GEOMETRIC,3,&lb,2,arr);
d.SelectObject(&l_pen);
float centr_el_x=0;
float centr_el_y=0;
Transform(¢r_el_x,¢r_el_y);
drawCircle(&d,centr_el_x,centr_el_y,330);
//-----------------------
CPen p2(PS_SOLID,6,RGB(8,28,255));
// установка цвета для минуты и часа стрелок
CPen sec_p(PS_SOLID,4,RGB(153,0,0));
// установка цвета секундной стрелки
d.SelectObject(&p2);
// заносим объект типа (CPen) p2 в контекст типа (CPaintDC) d
float fhour ;// поля для час, минута, секунда
float fmin ;
float fsec ;
CTime t1;
CTime t = CTime::GetCurrentTime(); // получаем системное время из OC Windows (формат UTC)
// начальная инициализация (секунды, минуты, часы)
fhour = t.GetHour()%12; // получаем час (0-23). Переводим в 12 часовую форму.
fmin = t.GetMinute(); // получаем минуты (0-59)
fsec = t.GetSecond(); // получаем секунды (0-59)
fhour += fmin/60; // час=час+минута(ы)/60 чтобы часовая стрелка тоже двигалась
fhour = fhour * 360 / 12; // смещение (дискретное) на 30 град (360/12) * час. Если час дробный, то
// смещение происходит на какую-то долю. Полученное значение - радианы.
fmin = fmin * 360 / 60; // смещение (дискретное) на 6 град. (360/60) по окружности каждую минуту (рад)
fsec = fsec * 360 / 60; // смещение (дискретное) на 6 град. по окружности каждую секунду (рад)
// d[град]=d[рад]*(Pi/180)
// общая формула x=cos_d*R; y=sin_d*R
float xs = 130 * cos((-fsec * (PI / 180.0))+ PI/2.0); // R*cos((-d[рад]*Pi/180)+ Pi/2).
// PI/2 - начало отсчета I квадрант
// против час. стрелки
float ys = 130 * sin((-fsec * (PI / 180.0))+ PI/2.0);
float xm = 100 * cos((-fmin * (PI / 180.0))+ PI/2.0);
float ym = 100 * sin((-fmin * (PI / 180.0))+ PI/2.0);
float xh = 70 * cos((-fhour * (PI / 180.0))+ PI/2.0);// длинна стрелки (позиция новой точки)// fhour
float yh = 70 * sin((-fhour * (PI / 180.0))+ PI/2.0);// -fhour
float x = 0;// начальные значения - центр //x=7 y=-8.4
float y = 0;
Transform(&x,&y);// изменение при перерисовки центра (0,0)
Transform(&xh,&yh);
d.MoveTo(x,y);// перемещение (час)
d.LineTo(xh,yh);// рисование (час)
Transform(&xm,&ym);
d.MoveTo(x,y);// перемещение (минута)
d.LineTo(xm,ym);// рисование (минута)
d.SelectObject(&sec_p); // применение цвета к секундной стрелке
Transform(&xs,&ys);
d.MoveTo(x,y);// перемещение (секунда)
d.LineTo(xs,ys);// рисование (секунда)
d.SelectObject(el_outer);// делаем закрывающий шпиндель)
d.SelectObject(el_brush_outer);
drawCircle(&d,x,y,20);
//---------рисование циферблата (цифры по окружности)
d.SelectObject(&p2);
// цвет
char *str[] = {"3","2","1","12","11","10","9","8","7","6","5","4"};
// раставление от квандрант Pi=180 град. против час.
/*
char *str_point[]={".",".",".",".",".",".",".",".",".",".",".",".",
".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",
".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",
".","."};// рисование пунктов [.] текстом - не лучшее реш.
//*/
CFont f;
f.CreatePointFont(170,(LPCTSTR)"Times New Roman");// стиль буковок
d.SelectObject(&f);
d.SetBkMode(TRANSPARENT);// установка режима фона
// TRANSPARENT не изменять до отрисовки
CString txt_header = CString("СПБГПУ ИУС");
CString txt_bottom = CString("Киряков С.В.");
d.SetTextColor(RGB(0,0,0));
float xtext1=-80;
float ytext1=60;
float xtext2=-70;
float ytext2=-80;
Transform(&xtext1,&ytext1);
Transform(&xtext2,&ytext2);
d.TextOutW(xtext1,ytext1,txt_header);// указание позиции надписи и самого объекта надписи
d.TextOutW(xtext2,ytext2,txt_bottom);
d.SetTextColor(RGB(8,28,255));// перебор цифр
for(int i = 0;i < 12;i++)
{
float x = 194 * cos(i * PI / 6.0);// R * cos(i*Pi/6 град) кол-во элементов для размещ-12.
float y = 190 * sin(i * PI / 6.0);
Transform(&x,&y);
d.TextOut(x-5,y-10,CString(str[i]),strlen(str[i])); // выравнивание циферблата. x-5; y-10
// выбрано имперически. Выравнивание в массиве
// одинарного символа и двойного происходит по-раз.
}
/*
d.SetTextColor(RGB(153,0,0));// перебор пунктов циферблата [.] текстом
for(int i = 0;i < 48;i++)
{
float x = 170 * cos(i * PI / 24.0);// R * cos(i*Pi/24 град) кол-во элементов для размещ-48.
float y = 170 * sin(i * PI / 24.0);
Transform(&x,&y);
d.TextOut(x,y,CString(str_point[i]),strlen(str_point[i]));
}
//*/
}
//----------метод изменения (перерисовки) координат примитивов (прямоугольника, линий итд)
// как только изменяется клиентская область окна (изменение размеров) происходит изменение
// (перерисовка) переданных координат.
void Transform(float *px , float *py)
{
::GetClientRect(m_hWnd,&_rect);
// GetClientRect - клиентская часть окна
//- прямоугольник окна(клиентская область окна)
// m_hWnd - указатель на само окно (handle)
// _rect - стуктура с координатами, описанная в классе CClockFrame
float width = (_rect.right-_rect.left)/2;
float height = (_rect.bottom-_rect.top)/2;
*px = *px + width; // именно так! (иначе все в обратном порядке)
*py = height - *py;
}
//-------------затирка старого фона (перерисовка)-получ.динам. картинки--------------------
void OnTimer(UINT n)
{
this->Invalidate(); // (0)
// CWnd::Invalidate - стирать ли фон в области обновления
// без этого метода получим статичную картинку
// -> выбор элемента по указателю.
}
//-------------рисуем эллирс типа круг (x, y, R)
void drawCircle (CPaintDC *aDC, int aX, int aY, int aD)
{
double r=aD/2;
aDC->Ellipse(aX-r,aY-r,aX+r,aY+r);
}
// этим методом рисуем эллипс типа круг
// задаем нач. позиции X и Y и указываем R
DECLARE_MESSAGE_MAP(); // класс определяем сопоставление сообщениям. Если он
// реагирует на какие-либо события
};
//*****************************************************************************************************
//--------------------макрос-таблица откликов (на что должен реагировать класс)----------------
BEGIN_MESSAGE_MAP(CClockFrame,CFrameWnd)
ON_WM_CREATE()// реакция на событие создание окна
ON_WM_PAINT()// реакция на отображение графики
ON_WM_TIMER()// реакция на событие таймера
END_MESSAGE_MAP()
//****************************************************************************************************
//-------------внутренний класс с которого запускаем экземпляр CClockFrame----------------------------
class CClockApp:public CWinApp
{
public:
int InitInstance()
{
CClockFrame *p ;
p = new CClockFrame();
p->ShowWindow(1);
m_pMainWnd = p;
return 1;
}
};
//****************************************************************************************************
CClockApp a; // поле для иниц. класса CClockApp
Размещено на Allbest.ru
Подобные документы
Проведение сравнительного анализа языков программирования. Создание алгоритма и специфика составления математической модели программы "Механические часы, показывающие текущее время" в среде Microsoft Visual Studio 2010, на базе языка программирования С++.
курсовая работа [408,9 K], добавлен 11.03.2013Теоретические основы разработки Windows-приложений с использованием библиотеки MFC. Создание приложения с помощью Visual C++. Описание логической структуры приложения. Установка и запуск программы. Входные и выходные данные. Преимущество MFC библиотек.
курсовая работа [563,2 K], добавлен 21.06.2011Разработка трехмерной модели приложения "Гоночный автомобиль" на языке С++ с использованием библиотеки OpenGL и MFC, создание программы в среде Visual Studio 6.0. Информационное обеспечение, логическая структура и функциональная декомпозиция проекта.
курсовая работа [3,9 M], добавлен 29.06.2011Разработка программы для рисования различных правильных многоугольников с помощью объектно-ориентированного языка программирования. Использование для разработки среды C++ Builder 6 и библиотеки VCL. Разработка интерфейса приложения и алгоритма его работы.
курсовая работа [616,4 K], добавлен 18.10.2010Отображение графики с помощью Canvas, представляющей собой область компонента, на которой можно рисовать или отображать готовые изображения. Операторы, применяемые в программе создания аналоговых часов, ее интерфейс и алгоритм решения на языке Delphi.
курсовая работа [2,3 M], добавлен 20.01.2016Объектно-ориентированная технология создания программ. Среда разработки Visual Studio.NET. Особенности среды Microsoft Visual Studio 2010. Приложения C# для расчетов по формулам, консольный ввод-вывод. Форматирование значений данных. Программы с циклами.
методичка [2,1 M], добавлен 11.09.2014Определение программного модуля. Принципы использования dll-библиотеки. Преимущества и недостатки использования dll-библиотек. Описание коэффициентов моделей. Разработка структуры классов. Реализация библиотеки классов в среде разработки MS Visual Studio.
дипломная работа [676,6 K], добавлен 16.06.2015Создание приложения на языке программирования Visual C++ с использованием библиотеки MFC на тему "Тестирование по разделу "Законы механики Ньютона". Описание логической структуры программы, тестовых прогонов. Требования к техническому обеспечению.
курсовая работа [2,2 M], добавлен 29.06.2011Теоретические основы написания Windows-приложений с использованием библиотеки MFC. Основы программирования под Windows. Проектирование приложений в среде Microsoft Visual C++. Описание логической структуры приложения, его функциональное назначение.
курсовая работа [1,3 M], добавлен 12.12.2011Техника создания графики при помощи API функций, экспортируемых библиотекой GDI32.DLL. Разработка на языке программирования С++ в среде программирования Microsoft Visual C++ программы для отображения часов реального времени в цифровом и аналоговом виде.
курсовая работа [2,8 M], добавлен 27.01.2010