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. В упражнении, в конце этой главы, будет рассмотрен код, который позволяет рисовать круги выбраннго цвета. цвета.
Резюме и упражнение
<-Назад |Содержание| Дальше ->
Используются технологии uCoz