Разработка приложения "Аналоговые часы" на языке 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(&centr_el_x,&centr_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(&centr_el_x,&centr_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


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.