This will be shown to users with no Flash or Javascript.
Урок VII
Связывание событий с элементами управления
С помощью панели Controls расставьте элементы, управления как показано на рис.

Разместите радиокнопки обязательно в том порядке в котором они даны в таблице. Не забудьте установить свойство Group у радиокнопки Red. Это означает, что все три радиокнопки будут объединены в одну группу, и при выборе одной из них, значек "отмечено" будет перемещаться.
Зайдите в Resource Symbols в меню View и убедитесь в том, что итендификаторы кнопок являются последовательные числа.
Связывание переменной с радиокнопками
Теперь вам необходимо связать переменную с радиокнопками, которые вы разместили в диалоговой панели IDD_CUSTOM_DIALOG.
Выполните правый щелчок по пункту IDD_CUSTOM_DIALOG, и выбирите пункт ClassWizard в меню View.
Появиться диалоговая панель(Add class), которая спросит вас: создать новый класс или добавить в существующий. Вы выбираете создать новый Create a new class.
В диалоговой панели New Class задайте имя CSetDlg..
Убедитесь, что окно в Class Name установлено на CSetDlg. Затем щелкните на пункт Member Varibles и выбирите пункт IDC_RED_RADIO.
Нажмите на кнопку Add Varible и задайте в появившемся диалоговом окне Variable Name: m_RedRadio Category: Value Variable Type: int
Следовательно, когда значение перменной m_RedRadio равно 0 - выбрана радиокнопка RED, когда 1 - радиокнопка CREEN, когда 2 - радиокнопка BLUE.
Создание объекта класса CSetDlg
В предыдущей главе вы создали класс CSetDlg(). Он является производным клссом от класса CDialog, а диалоговая панель IDD_CUSTOM_DIALOG связана с классом CSetDlg. C классом CSetDlg ассоциированы два файла : SetDlg.cpp и SetDlg.h.
Теперь вы создадите объект класса CSetDlg. В объявление класса CGraphDlg(в файле CGraphDlg.h) добавьте следующий код, который объявляет переменную m_dlg объектом класса CSetDlg. Это нужно для того, чтобы мы могли иметь доступ к переменным класса CSetDlg:
class CGraphDlg : public CDialog
{
// Construction
public:
CGraphDlg(CWnd* pParent = NULL); // standard constructor
////Мой код начинается здесь////
CSetDlg m_dlg;
////Мой код заканчивается здесь////
//...
}
Введенный вами код создает объект m_dlg класса CSetDlg.
Однако, когда компилятор встречает слово CSetDlg в файле CGraphDlg, он его не поймет. Значит надо добавить следующий оператор #include в файл CGraphDlg, в самое начало:
// GraphDlg.h : header file
//
////Мой код начинается здесь////
#include "SetDlg.h"
////Мой код заканчивается здесь////
Модификация кода кнопки Draw Graphics
Class Name: CGraphDlg
Object ID: IDC_DRAWGRAPHICS_BUTTON
Messages: BN_CLICKED
BOOL CGraphDlg::OnDrawgraphicsButton()
{
// TODO: Add your message handler code here
////////Мой код начинается здесь///////////
m_dlg.DoModal();
////////Мой код заканчивается здесь///////////
}
Вы добавили единственнный оперaтор:
m_dlg.DoModal();
который вызывает диалговую панель IDD_CUSTOM_DIALOG(выводит объект m_dlg).
Хотя код еще не закончен, можно посмотреть частичто введенный код.
Постройте и выполните программу.
Нажмите на кнопку Draw Graphics, поэксперементируйте с радиокнопками.
Инициализация радиокнопок
Вам необходимо включить в программу код, который инициализирует радиокнопку RED, выбирал ее при запуске программы.
Class Name: CGraphDlg
Object ID: CGraphDlg
Messages: WM_INITDIALOG
BOOL CGraphDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//....
////////Мой код начинается здесь///////////
///Установить системный таймер
int iInstallResult;
iInstallResult=SetTimer(1, 50, NULL);
if(iInstallResult==FALSE)
{
MessageBox("Cannot install timer",
"Error message",
MB_OK+MB_ICONERROR);
}
//Выбрать радиокнопку RED
m_dlg.m_RedRadio=0;
////////Мой код заканчивается здесь///////////
return TRUE; // return TRUE unless you set the focus to a control
}
Код, который вы ввели присваивает переменной m_RedRadio значение 0, используя для этого объект класса m_dlg, т.к. переменная m_RedRadio, является членом класса CSetDlg.
Добавление переменных элементов в класс CGraphDlg
Теперь вам необходимо включить две переменные в класс CGraphDlg, так чтобы они были доступны из любой функции-элемента классаю
Включите объявления в класс CGraphDlg слдеующим образом:
class CGraphDlg : public CDialog
{
// Construction
public:
CGraphDlg(CWnd* pParent = NULL); // standard constructor
////Мой код начинается здесь////
CSetDlg m_dlg;
int m_Radius;
int m_Direction;
////Мой код заканчивается здесь////
///...
}
Инициализация радиокнопок
Вам нужно написать код, который инициализирует переменные m_Radius и m_Direction.
Class Name: CGraphDlg
Object ID: CGraphDlg
Messages: WM_INITDIALOG
BOOL CGraphDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//....
////////Мой код начинается здесь///////////
///Установить системный таймер
int iInstallResult;
iInstallResult=SetTimer(1, 50, NULL);
if(iInstallResult==FALSE)
{
MessageBox("Cannot install timer",
"Error message",
MB_OK+MB_ICONERROR);
}
//Выбрать радиокнопку RED
m_dlg.m_RedRadio=0;
m_Radius=50;
m_Direction=1;
////////Мой код заканчивается здесь///////////
return TRUE; // return TRUE unless you set the focus to a control
}
Код, который вы ввели инициализирует перменные m_Radius и m_Direction:
m_Radius=50;
m_Direction=1;
Связвание кода с событием Timer
В начале программы мы написали код, который генерирует событие WM_TIMER, каждые 500 миллискекунд.
Class Name: CGraphDlg
Object ID: СGraphDlg
Messages: WM_TIMER
BOOL CGraphDlg::OnTimer(UINT nIDEvent)
{
//....
////////Мой код начинается здесь///////////
//MessageBeep((WORD)-2);
m_Radius=m_Radius+m_Direction;
if(m_Radius>=100)
{
m_Direction=-1;
}
if(m_Radius<=10)
{
m_Direction=1;
}
//Инициировать исполнение функции OnPaint() Invalidate(); ////////Мой код
///ивается здесь///////////
CDialog::OnTimer(UINT nIDEvent);
}
Переменная m_Direction может принимать значения 1 или -1. Значит при выполнении оператора m_Radius=m_Radius+m_Direction; значение переменной будет уменьшаться или увеличиваться, взависимости от того какое значени имеет переменная m_Direction. Таким образом радиус круга будет то увеличиваться, то уменьшаться.
Чтобы радиуск круга бузгранично не увеличивался и не уменьшался, вы написали следующую конструкцию операторов IF в функции OnTimer:
if(m_Radius>=100)
{
m_Direction=-1;
}
if(m_Radius<=10)
{
m_Direction=1;
}
которые оперделяют: 1) если значение переменной m_Radius больше или равно 100, то переменная m_Direction принимает значение -1, и тогда радиус круга начинает уменьшаться. 2) когда значение переменной равно m_Radius меньше или равно 10, тогда все происходит наоборот.
Последний оператор, который вы написали Invalidate() генерирует принудительно событие WM_PAINT, которое вызывает каждый раз функцию OnPaint().
Модификация кода, связанного с событием WM_POINT
Class Name: CGraphDlg
Object ID: CGraphDlg
Messages: WM_PAINT
void CGraphDlg::OnPaint()
{
if (IsIconic())
{
//....
}
else
{
////Мой код начинается здесь////
// OnDrawgraphicsButton();
///Создать объект контекста устройства(DC)
CPaintDC dc(this);
//Создать новое перо
CPen MyNewPen;
MyNewPen.CreatePen(PS_SOLID, 10, RGB(255,0,0));
//Выбрать перо
CPen* pOriginalPen;
pOriginalPen=dc.SelectObject(&MyNewPen);
// CRect MyRectangle(20, 10, 120,110);
CRect MyRectangle(20, 10, 20+m_Radius*2,10+m_Radius*2);
//Нарисовать круг
dc.Ellipse(&MyRectangle);
//Выбрать первоначальное перо
dc.SelectObject(pOriginalPen);
////Мой код заканчивается здесь////
//...
}
}
Вы поместили старый код, в котором вы задавали координаты квадрата, в комментарий.
Модифицировали старый код, так что радиус круга будет зависеть от переменной m_Radius. Мы написали:
CRect MyRectangle(20, 10, 20+m_Radius*2,10+m_Radius*2);
видно что, когда значение переменной m_Radius будет равно 50, то диаметр круга будет равен 20+50*2=120. Когда значение переменной m_Direction будет равно -1, то радиус будет уменьшаться.
Управление цветом
Программа Graph рисует круги красного цвета, чтоб изменять цвет круга - это делать надо с помощью панели IDD_CUSTOM_DIALOG. В упражнении, в конце этой главы, будет рассмотрен код, который позволяет рисовать круги выбраннго цвета. цвета.