Разработка приложения 'Аналоговые часы' на языке C++ с использованием библиотеки MFC

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    265,07 Кб
  • Опубликовано:
    2014-03-10
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка приложения 'Аналоговые часы' на языке C++ с использованием библиотеки MFC

Введение


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

Программа написана и откомпилирована 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

{:InitInstance()

{*p ;= new CClockFrame();>ShowWindow(1);_pMainWnd = p;1;

}

};

class CClockFrame

Это главный класс всего приложения (программы). Данный класс - это класс фрейма, главное окно. Принимает на себя нагрузку по организации взаимодействия пользователя с окном вида, а также реализации всей математики приложения и визуализации.

2. Исходный код

//*************************************************************************************

// Класс часов -Графическая форма. Тут же логика. CClockFrame :public CFrameWnd

//наследуемся от встроенного класса фреймвого окна CFrameWnd.

{:_rect;

//базовая структура, описывает координаты верхнего левого и

//и нижнего правого углов прямоугольника. Данная структура

//будет использоваться для описания клиентской области окна.

//--------центрирование фрейма относительно экрана монитора (диагонали)-

public: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.y = ((cs.cy * 1.5) - cs.cy)/2;

//получаем необходимую точку для центрирования фрейма

//CClockFrame относительно заданного экрана.

//Пропорционально выбранному делителю - 1.5 по y.x = ((cs.cx * 2) - cs.cx)/2;

//-2 по x.TRUE;

}

//----конструктор класса CClockFrame (вид фрейма как фрейма или диалога; определение клавиш упр.)

CClockFrame()

{brush = (HBRUSH)::CreateSolidBrush(RGB(0,0,0));

//Определение свойств кисти. Заливка сплошным цветом.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 - оконное меню в строке заголовка фрейма.

}

//-----------------рисвание фреймаOnCreate(LPCREATESTRUCT l)

// LPCREATESTRUCT - cтруктура, описывающая параметры фрейма

// при его создании (API-функция)

{::OnCreate(l);

// OnCreate - функция-член для создание окна. (1,1000,NULL);

// (системный таймер)

// Функция посылающее "сообщение" фрейму через каждую 1 секунду

// необходимо для создания часов (получ. данных через 1 секунду)

// логика: получение системного времени->перерисовка стрелок

// через 1 секунду1;

}

void OnPaint()

{d(this);

// Вывод чего либо (примитивы, регионы) на контекст устройства.

//-----------b(RGB(192,192,192));

//Задание цвета кисти для последующего применения к примитивам

float x1 = -220;y1 = -220;x2 = 220; y2 = 220;

// координаты центральная область под стрелками и цифрами(&x1,&y1);

// передаем в пользовательскую процедуру. Изменение размеров областей

// при изменении размеров фрейма. (левый-верхний)(&x2,&y2);

// (нижний правый)

CRect rect(x1,y1,x2,y2);

// область прямоугольник-циферблат. (передаем координаты).FillRect(&rect,&b);

// заполняем выбранный прямоуголник rect заданной кистью b (заполняем цветом)

// выводим все это в область _rect класса CClockFrame

/*l_LogBrush;

// линия из точек без задания расстояния

l_LogBrush.lbColor = RGB(0,0,0);_LogBrush.lbStyle = BS_SOLID;_LogBrush.lbHatch=10;l_pen(PS_GEOMETRIC | PS_DOT, 3, &l_LogBrush, 0, NULL);

*/el_outer(PS_SOLID,1,RGB(0,0,0));el_brush_outer(RGB(226,226,226));.SelectObject(el_outer);.SelectObject(el_brush_outer);.Ellipse(&rect);

// рисуем внешний элипс (круг) по координатам закрашенной

// области-квадрата и устанавливаем ему определенный цвет.

d.SelectStockObject(WHITE_BRUSH);

// восстанавливаем все в белоеl_pen;

// рисуем циферблат (пункты секунд) - пунктирная линия

LOGBRUSH lb;.lbColor=RGB(153,0,0);

// устанавливаем цвет (пункты секунд) они же точки

lb.lbStyle=BS_SOLID;.lbHatch=0; arr[2];

arr[0]=2;// играемся промежутками между пунктирами

arr[1]=19.6;//_pen.CreatePen(PS_USERSTYLE|PS_GEOMETRIC,3,&lb,2,arr);

// устанавливаем свой геометрический стиль линии «ручке»

d.SelectObject(&l_pen);centr_el_x=0;centr_el_y=0;(&centr_el_x,&centr_el_y);(&d,centr_el_x,centr_el_y,330);

// рисуем внутренний круг и обрамляем края линией

// своего стиля - пунктиром. Центр круга - 0,0

//-----------p2(PS_SOLID,6,RGB(8,28,255));

// установка цвета для минуты и часа стрелок

CPen sec_p(PS_SOLID,4,RGB(153,0,0));

// установка цвета секундной стрелки.SelectObject(&p2);

// заносим объект типа (CPen) p2 в контекст типа (CPaintDC) dfhour;// поля для час, минута, секунда

float fmin;fsec;t1;t = CTime::GetCurrentTime();

// получаем системное время из OC Windows (формат UTC)

// начальная инициализация (секунды, минуты, часы)= t.GetHour()%12;

// получаем час (0-23). Переводим в 12 часовую форму.= t.GetMinute();

// получаем минуты (0-59)= t.GetSecond();

// получаем секунды (0-59)+= fmin/60;

// час=час+минута(ы)/60 чтобы часовая стрелка тоже двигалась = fhour * 360 / 12;

// смещение (дискретное) на 30 град (360/12) * час.

// Если час дробный, то

// смещение происходит на какую-то долю.

// Полученное значение - радианы.= fmin * 360 / 60;

// смещение (дискретное) на 6 град. (360/60) по окружности

// каждую минуту (рад)= 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);ym = 100 * sin((-fmin * (PI / 180.0))+ PI/2.0);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;y = 0;

// начальные значения - центр(&x,&y);

// изменение при перерисовке центра (0,0)

Transform(&xh,&yh);.MoveTo(x,y);

// перемещение (час).LineTo(xh,yh);

// рисование (час). До указ. Координаты.(&xm,&ym); .MoveTo(x,y);// перемещение (минута).LineTo(xm,ym);// рисование (минута).SelectObject(&sec_p);

// применение цвета к секундной стрелке(&xs,&ys);.MoveTo(x,y);// перемещение (секунда).LineTo(xs,ys);// рисование (секунда)

d.SelectObject(el_outer);.SelectObject(el_brush_outer);

// делаем закрывающий шпиндель сверху стрелок)

//---------рисование циферблата (цифры по окружности)

d.SelectObject(&p2);

// цвет*str[] = {"3","2","1","12","11","10","9","8","7","6","5","4"};

// раставление от квандрант Pi=180 град. против час.

/**str_point[]={".",".",".",".",".",".",".",".",".",".",".",".",

".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",

".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",

".","."};

// рисование пунктов [.] текстом - не лучшее реш.

//*/f;.CreatePointFont(170,(LPCTSTR)"Times New Roman");

// стиль буковок.SelectObject(&f);.SetBkMode(TRANSPARENT);

// установка режима фона//TRANSPARENT не изменять до отрисовки

CString txt_header = CString("СПБГПУ ИУС");txt_bottom = CString("Киряков С.В.");.SetTextColor(RGB(0,0,0));xtext1=-80;ytext1=60;xtext2=-70;ytext2=-80;(&xtext1,&ytext1);(&xtext2,&ytext2);.TextOutW(xtext1,ytext1,txt_header);

// указание позиции надписи и самого объекта надписи

d.TextOutW(xtext2,ytext2,txt_bottom);.SetTextColor(RGB(8,28,255));(int i = 0;i < 12;i++)// перебор цифр

{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);(&x,&y);.TextOut(x-5,y-10,CString(str[i]),strlen(str[i]));

// выравнивание циферблата. x-5; y-1// выбрано имперически. Выравнивание в массиве

// одинарного символа и двойного происходит по-раз.

}

/*.SetTextColor(RGB(153,0,0));

// перебор пунктов циферблата [.] текстом - отказался

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

{x = 170 * cos(i * PI / 24.0);

// R * cos(i*Pi/24 град) кол-во элементов для размещ-48.

float y = 170 * sin(i * PI / 24.0);(&x,&y);.TextOut(x,y,CString(str_point[i]),strlen(str_point[i]));

}

//*/

}

/*------метод изменения (перерисовки) координат примитивов (прямоугольника, линий итд) как только изменяется клиентская область окна (изменение размеров) происходит изменение (перерисовка) переданных координат. */Transform(float *px , float *py)

{

::GetClientRect(m_hWnd,&_rect);

// GetClientRect - клиентская часть окна

//- прямоугольник окна(клиентская область окна)

// m_hWnd - указатель на само окно (handle)

// _rect - стуктура с координатами, описанная в классе CClockFrame

float width = (_rect.right-_rect.left)/2;height = (_rect.bottom-_rect.top)/2;

*px = *px + width;

// именно так! (иначе все в обратном порядке)

*py = height - *py;

}

//-------------затирка старого фона (перерисовка)-получ.динам. картинки---------

void OnTimer(UINT n)

{>Invalidate();// (0)

// CWnd::Invalidate - стирать ли фон в области обновления

// без этого метода получим статичную картинку

// -> выбор элемента по указателю.

}

//-------------рисуем эллипс типа круг по заданному R (x, y, R)

void drawCircle (CPaintDC *aDC, int aX, int aY, int aD)

{r=aD/2;>Ellipse(aX-r,aY-r,aX+r,aY+r);

}

// этим методом рисуем эллипс типа круг

// задаем нач. позиции X и Y и указываем R_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

// константа для вычислений окружностиdouble PI = 3.14159;

// Класс часов -Графическая форма. Тут же логика. CClockFrame :public CFrameWnd

//наследуемся от встроенного класса фреймвого окна CFrameWnd.

{:_rect;

//базовая структура, описывает координаты верхнего левого и

//и нижнего правого углов прямоугольника. Данная структура _rect

//будет использоваться для описания клиентской области окна.

//--------центрирование фрейма относительно экрана монитора (диагонали)-

public:CClockFrame::PreCreateWindow(CREATESTRUCT& cs){

//Изменение функционала (функциональных возможностей) окна CClockFrame

//через PreCreateWindow. :: - глобальное разрешение функции PreCreateWindow

//вне класса.CREATESTRUCT - определяет параметры инициализации

//передаваемой оконной процедуре.cy = ::GetSystemMetrics(SM_CYSCREEN) / 1.5;

//получаем размер экрана меньший в 1.5 раза

cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 2;

//- в 2 раза.y = ((cs.cy * 1.5) - cs.cy)/2;

//получаем необходимую точку для центрирования фрейма

//CClockFrame относительно заданного экрана.

//Пропорционально выбранному делителю - 1.5.x = ((cs.cx * 2) - cs.cx)/2;

//-2TRUE;

}

//------------конструктор класса CClockFrame (вид фрейма как фрейма или диалога; определение клавиш упр.)

CClockFrame()

{brush = (HBRUSH)::CreateSolidBrush(RGB(0,0,0));

//Определение свойств кисти. Заливка сплошным цветом.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 - оконное меню в строке заголовка фрейма.

}

//-----------------рисвание фреймаOnCreate(LPCREATESTRUCT l)

//LPCREATESTRUCT - cтруктура, описывающая параметры фрейма

//при его создании (api-функция)

{::OnCreate(l);

//OnCreate - функция-член для создание окна. (1,1000,NULL);

//(системный таймер)

//Функция посылающее "сообщение" фрейму через каждую 1 секунду

//необходимо для создание часов (перерисовка через 1 секунду)

//логика: получение системного времени->перерисовка стрелок через 1 секунду1;

}

//-----------------рисуем стрелки, циферблат (цифры)

void OnPaint()

{d(this);

//Вывод чего либо (примитивы, регионы) на контекст устройства.

//------------------------b(RGB(192,192,192));

//Задание цвета кисти для последующего применения к примитивамx1 = -220;//центральная область под стрелками и цифрами - прямоугольник

float y1 = -220;x2 = 220;y2 = 220;

Transform(&x1,&y1);// передаем в пользовательскую процедуру. Изменение размеров областей

// при изменении размеров фрейма. (левый-верхний)(&x2,&y2); // (нижний правый)

CRect rect(x1,y1,x2,y2);

//область прямоугольник-циферблат. (передаем координаты).FillRect(&rect,&b);

//заполняем выбранный прямоуголник rect заданной кистью b (заполняем цветом)

//выводим все это в область _rect класса CClockFrame

/*l_LogBrush;// линия из точек без задания расстояния

l_LogBrush.lbColor = RGB(0,0,0);_LogBrush.lbStyle = BS_SOLID;_LogBrush.lbHatch=10;l_pen(PS_GEOMETRIC | PS_DOT, 3, &l_LogBrush, 0, NULL);

*/el_outer(PS_SOLID,1,RGB(0,0,0));

//d.SelectStockObject(GRAY_BRUSH);// только предопределенные цвета

CBrush el_brush_outer(RGB(226,226,226));.SelectObject(el_outer);.SelectObject(el_brush_outer);.Ellipse(&rect);.SelectStockObject(WHITE_BRUSH); //восстанавливаем все в белое

CPen l_pen;// рисуем циферблат (пункты секунд) - пунктиром

LOGBRUSH lb;.lbColor=RGB(153,0,0);.lbStyle=BS_SOLID;.lbHatch=0;arr[2];[0]=2;//1.2[1]=19.6;//19.6_pen.CreatePen(PS_USERSTYLE|PS_GEOMETRIC,3,&lb,2,arr);.SelectObject(&l_pen);centr_el_x=0;centr_el_y=0;(&centr_el_x,&centr_el_y);(&d,centr_el_x,centr_el_y,330);

// установка цвета для минуты и часа стрелок

CPen sec_p(PS_SOLID,4,RGB(153,0,0));

// установка цвета секундной стрелки.SelectObject(&p2);

// заносим объект типа (CPen) p2 в контекст типа (CPaintDC) dfhour ;// поля для час, минута, секунда

float fmin ;fsec ;t1;t = CTime::GetCurrentTime(); // получаем системное время из OC Windows (формат UTC)

// начальная инициализация (секунды, минуты, часы)= t.GetHour()%12; // получаем час (0-23). Переводим в 12 часовую форму.= t.GetMinute(); // получаем минуты (0-59)= t.GetSecond(); // получаем секунды (0-59)+= fmin/60; // час=час+минута(ы)/60 чтобы часовая стрелка тоже двигалась = fhour * 360 / 12; // смещение (дискретное) на 30 град (360/12) * час. Если час дробный, то

// смещение происходит на какую-то долю. Полученное значение - радианы.= fmin * 360 / 60; // смещение (дискретное) на 6 град. (360/60) по окружности каждую минуту (рад)= 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);xm = 100 * cos((-fmin * (PI / 180.0))+ PI/2.0);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.4y = 0;(&x,&y);// изменение при перерисовки центра (0,0)(&xh,&yh);.MoveTo(x,y);// перемещение (час).LineTo(xh,yh);// рисование (час)(&xm,&ym); .MoveTo(x,y);// перемещение (минута).LineTo(xm,ym);// рисование (минута).SelectObject(&sec_p); // применение цвета к секундной стрелке(&xs,&ys);.MoveTo(x,y);// перемещение (секунда).LineTo(xs,ys);// рисование (секунда).SelectObject(el_outer);// делаем закрывающий шпиндель)

d.SelectObject(el_brush_outer);

drawCircle(&d,x,y,20);

//---------рисование циферблата (цифры по окружности)

d.SelectObject(&p2);

// цвет*str[] = {"3","2","1","12","11","10","9","8","7","6","5","4"};

// раставление от квандрант Pi=180 град. против час.

/**str_point[]={".",".",".",".",".",".",".",".",".",".",".",".",

".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",

".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",

".","."};// рисование пунктов [.] текстом - не лучшее реш.

//*/f;.CreatePointFont(170,(LPCTSTR)"Times New Roman");// стиль буковок.SelectObject(&f);.SetBkMode(TRANSPARENT);// установка режима фона

// TRANSPARENT не изменять до отрисовкиtxt_header = CString("СПБГПУ ИУС");txt_bottom = CString("Киряков С.В.");.SetTextColor(RGB(0,0,0));xtext1=-80;ytext1=60;xtext2=-70;ytext2=-80;(&xtext1,&ytext1);(&xtext2,&ytext2);

d.TextOutW(xtext1,ytext1,txt_header);// указание позиции надписи и самого объекта надписи

d.TextOutW(xtext2,ytext2,txt_bottom);.SetTextColor(RGB(8,28,255));// перебор цифр(int i = 0;i < 12;i++)

{x = 194 * cos(i * PI / 6.0);// R * cos(i*Pi/6 град) кол-во элементов для размещ-12.

float y = 190 * sin(i * PI / 6.0);(&x,&y);.TextOut(x-5,y-10,CString(str[i]),strlen(str[i])); // выравнивание циферблата. x-5; y-10

// выбрано имперически. Выравнивание в массиве

// одинарного символа и двойного происходит по-раз.

}

/*.SetTextColor(RGB(153,0,0));// перебор пунктов циферблата [.] текстом

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

{x = 170 * cos(i * PI / 24.0);// R * cos(i*Pi/24 град) кол-во элементов для размещ-48.y = 170 * sin(i * PI / 24.0);(&x,&y);.TextOut(x,y,CString(str_point[i]),strlen(str_point[i]));

}

//*/

}

//----------метод изменения (перерисовки) координат примитивов (прямоугольника, линий итд)

// как только изменяется клиентская область окна (изменение размеров) происходит изменение

// (перерисовка) переданных координат. Transform(float *px , float *py)

{

::GetClientRect(m_hWnd,&_rect);

// GetClientRect - клиентская часть окна

//- прямоугольник окна(клиентская область окна)

// m_hWnd - указатель на само окно (handle)

// _rect - стуктура с координатами, описанная в классе CClockFrame

float width = (_rect.right-_rect.left)/2;height = (_rect.bottom-_rect.top)/2;

*px = *px + width; // именно так! (иначе все в обратном порядке)

*py = height - *py;

}

//-------------затирка старого фона (перерисовка)-получ.динам. картинки--------------------

void OnTimer(UINT n)

{>Invalidate(); // (0)

// CWnd::Invalidate - стирать ли фон в области обновления

// без этого метода получим статичную картинку

// -> выбор элемента по указателю.

}

//-------------рисуем эллирс типа круг (x, y, R)

void drawCircle (CPaintDC *aDC, int aX, int aY, int aD)

{r=aD/2;>Ellipse(aX-r,aY-r,aX+r,aY+r);

}

// этим методом рисуем эллипс типа круг

// задаем нач. позиции X и Y и указываем R_MESSAGE_MAP(); // класс определяем сопоставление сообщениям. Если он

// реагирует на какие-либо события

};

//*****************************************************************************************************

BEGIN_MESSAGE_MAP(CClockFrame,CFrameWnd)

ON_WM_CREATE()// реакция на событие создание окна_WM_PAINT()// реакция на отображение графики_WM_TIMER()// реакция на событие таймера_MESSAGE_MAP()

//****************************************************************************************************

//-------------внутренний класс с которого запускаем экземпляр CClockFrame----------------------------

class CClockApp:public CWinApp

{:InitInstance()

{*p ;= new CClockFrame();>ShowWindow(1);_pMainWnd = p;1;

}

};

//****************************************************************************************************a; // поле для иниц. класса CClockApp

Похожие работы на - Разработка приложения 'Аналоговые часы' на языке C++ с использованием библиотеки MFC

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!