Разработка приложения 'Аналоговые часы' на языке 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;(¢r_el_x,¢r_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;(¢r_el_x,¢r_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