Создание приложений, основанных на диалоговом окне
Цель работы: приобретение навыков создания приложений для Windows, знакомство с основами визуального проектирования.
Задание к лабораторной работе
1. Ознакомиться с основными принципами визуального проектирования, элементами управления, их свойствами и событиями;
2. Выполнить последовательно все пункты, указанные в разделе «Ход работы»;
3. Оформить отчет.
Ход работы
1. Создать проект программы
Создать программу TEST.EXE, которая должна работать следующим образом:
- При вводе в строке редактирования слов "Paint" и "Calculator", запускаются соответственно "Windows Paint" и "Windows Calc".
- При снятии флажка Visible, строка редактирования исчезает, а при снятии флажка Enabled, закрывается доступ к окну редактирования.
- При отмечании флажков, все происходит наоборот.
2. Выполнить визуальное проектирование диалоговой панели
При запуске программы, главное окно должно выглядеть так:
Задайте свойства элементов управления в соответствии с таблицей.
Объект | Свойство | Установка |
Dialog Box | ID | IDD_TEST_DIALOG |
Caption | The Test Program | |
Font | System, Size 10, страница Styles | |
панель Minimize | отмечена, страница Styles | |
панель Maximize | отмечена, страница Styles | |
Edit Box | ID | IDC_TEST_EDIT |
Group Box | ID | IDC_STATIC |
Caption | Test | |
Static Text | ID | IDC_STATIC |
Caption | INSTRUCTIONS: To execute the Paint program: type Paint in the edit box. To execute the Calculator program, type Calculator in the edit box. To terminate the program, type Exit in the edit box. | |
Check Box | ID | IDC_VISIBLE_CHECK |
Caption | &Visible | |
Check Box | ID | IDC_ENABLED_CHECK |
Caption | &Enabled | |
Push Button | ID | IDC_TEST_BUTTON |
Caption | &Test | |
Push Button | ID | IDC_CLEAR_BUTTON |
Caption | &Test | |
Push Button | ID | IDC_EXIT_BUTTON |
Caption | E&xit | |
Client edge | отмечен, страница Extended Styles | |
Static edge | отмечен, страница Extended Styles | |
Modal frame | отмечен, страница Extended Styles |
· В объекте Dialog Box вы задаете следующие данные:
Caption - название диалогового окна.
Font - здесь вы уcтановили шрифт -System и его размер 10
Панель Minimize и Maximaze отмечены для того, чтобы вы могли свертывать окно и наоборот рассматривать его во весь экран. Для их установки вам необходимо зайти в Dialog Box Propertions и на странице Styles отметить их.
· Edit Box - это окно редактирования, в нем вы можете вводить свой текст. Мы не задавали этому элементу никаких дополнительных параметров, нам необходимо только знать его итендификатор(IDC_TEST_EDIT).
· В следующем пункте Group Box, который служит для выделения эелементов управления в рамку. Вы указали для этого элемента название(Captions) Test и итендификатор IDC_STATIC.
· Static Text - это элемент текста, он вставляется как обычный элемент управления, но не выполняет ни каких функций, так как служит для показа текста, который вы зададите в Captions. В данном случае мы вставляем инструкцию по применению программы:INSTRUCTIONS: To execute ....Вы, наверное, заметили, что этот элемент имеет такой же итендификатор, как и у Group Box, так как мы не будем их использовать в программе и связывать с ними события( хотя это и невозможно).
· Следующие два элемента Check Box с Captions &Visible и &Enable, будут служить для скрытия окна редактирования и закрытия доступа к окну редактироавния, и наоборот. Если они включены, то окно видимо и есть к нему доступ, и наоборот. При запуске программы они должны будут быть отмечены. Для этого в дальнейшем мы напишем специальный код.
· Затем идут три кнопки Test, Clear и Exit. При нажатии на кнопку Test в окне редактирования появляется текст: This is a Test, а при нажатии на кнопку Clear, окно редактирования очищается. Кнопка E&xit, служащая для завершения программы, имеет еще дополнительные параметры, которые можно включить на странице Extended Styles. Они служат для разнообразного обрамления, выделения.
3. Связать переменные с окном редактирования и флажками
Более подробная информация приведена в Приложении Г.
4. Связать элементы управления с событиями
Событие – инициализация диалогового окна.
Напишите следующий код в функции OnInitDialog():
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
...
...
// TODO: Add extra initialization here
// Добавьте свою инициализацию
////////Мой код начинается здесь///////////
//Устаноить переменную флажка VisibleCheck и EnabledCheck в состояние
//TRUE
m_VisibleCheck=TRUE;
m_EnableCheck=TRUE;
//Обновить экран
UpdateData(FALSE);
////////Мой код заканчивается здесь///////////
return TRUE; // Вернуть TRUE, если только вы не установили фокус на элемент управления
}
Рассмотрим код:
Первый и второй операторы, который которые вы ввели присваивают переменным m_VisibleCheck и m_EnableCheck значение TRUE. Это означает, что при запуске программы флажки будут отмечены.
Последний оператор UpdateData(FALSE) обновляет экран, т.е. он обновляет значения переменных элементов управления на текущие. В нашем случае, при выполнении этого оператора текущие содержимое переменных связанных с флажками будет передано к ним.
Теперь для того, чтобы посмотреть инициализирующий код в действии выполните программу.
Событие – нажатие на кнопку.
Связывание кода с событием BN_CLICKED кнопки Exit При нажатии на кнопку Exit программа Test.Exe завершится. Добавьте в функцию обработки события для этой кнопки следующий код:
void CTestDlg::OnExitButton()
{
// TODO: Add your control notification handler code here
////////Мой код начинается здесь///////////
OnOK();
////////Мой код заканчивается здесь///////////
}
Функция OnOK(), которую вы ввели завершает программу, при нажатии на кнопку Exit.
Связывание кода с событием BN_CLICKED кнопки Test При нажатии на кнопку Test программа Test.Exe в окне редактирования напишет текст: This is a Test
Чтобы связать код с событием BN_CLICKED кнопки Test, напишите следующий код в функции OnTestButton():
void CTestDlg::OnTestButton()
{
// TODO: Add your control notification handler code here
////////Мой код начинается здесь///////////
///Присвоить переменной окна редактирования IDC_TEST_EDIT значение This is a Test.
m_TestEdit="This is a Test";
//// Обновить экран UpdateData(FALSE);
////////Мой код заканчивается здесь///////////
}
Код, который вы ввели содержит два оператора:
Первый присваивает переменной m_TestEdit типа CString значение This is a Test.
А второй оператор UpdateData(FALSE); обновляет экран, т.е. сообщает переменным диалогового окна текущие их значения.
Связывание кода с событием BN_CLICKED кнопки Clear При нажатии на кнопку Clear программа Test.Exe должна стирать текст из окна редактирования.
Чтобы связать код с событием BN_CLICKED кнопки Clear, напишите следующий код в функции OnClearButton():
void CTestDlg::OnClearButton()
{
// TODO: Add your control notification handler code here
////////Мой код начинается здесь///////////
///Присвоить переменной окна редактирования IDC_TEST_EDIT значение NULL.
m_TestEdit=" ";
//// Обновить экран
UpdateData(FALSE);
////////Мой код заканчивается здесь///////////
}
Код, который вы ввели содержит два оператора:
Первый присваивает переменной m_TestEdit типа CString значение NULL, т.е. окно редактирования не будет содержать никакого текста.
А второй оператор UpdateData(FALSE); обновляет экран, т.е. сообщает переменным диалогового окна текущие их значения. При выполнении этого оператора весь текст из окна редактирования удалится.
Теперь сохраните свою работу, выбрав Save All в меню File. Чтобы увидеть в действии код программы выполните и запустите ее. Напишите что-нибудь в окне редактирования. Щелкните на кнопку Clear, вы видите что текст стирается. Теперь нажмите на кнопку Test в окне редактирования появится текст This is a Test.
Если все это выполняется, значит, вы совершенно правильно связали события с кнопками Test и Clear.
Событие – установка флажка.
Связывание кода с событием BN_CLICKED флажка Visible. При включении флажка Visible программа Test.Exe должна сделать окно редактирования невидимым, а при выключении - наоборот. Чтобы связать код с событием BN_CLICKED флажка Visible,: напишите следующий код в функции OnEnableButton():
void CTestDlg::OnVsibleCheck()
{
// TODO: Add your control notification handler code here
////////Мой код начинается здесь///////////
////Обновить значения переменных элементов управления,
////(содержимое эрана передается переменным элементов управления)
UpdateData(TRUE);
///Если отметка флажка Visible зделать окно редактирования видимым
///А если нет - то невидимым
if(m_VisibleCheck==TRUE)
GetDlgItem(IDC_TEST_EDIT)->ShowWindow(SW_SHOW);
else
GetDlgItem(IDC_TEST_EDIT)->ShowWindow(SW_HIDE);
////////Мой код заканчивается здесь///////////
}
Код который вы ввели содержит следующие операторы:
UpdateData(TRUE); - этот оператор обновляет значения переменных элементов управления текущими значениями, которые содержаться на экране. Т.е. при нажатии на флажок переменная может принимать два значения TRUE или FALSE, TRUE - это когда флажок включен, а FASLE - наоборот. Значит при выполнении этого оператора переменная флажка управления принимаеит текущее положение флажка и все остальные переменные обновляются значениями, которые отображаются на экране.
Следующие оператор проверяет включен или выключен флажок. Если он включен, то выполняется оператор GetDlgItem(IDC_TEST_EDIT)->ShowWindow(SW_SHOW);, где GetDlgItem(IDC_TEST_EDIT) извлекает указатель на элемент управления, а функция ShowWindow(SW_SHOW); с параметром SW_SHOW, делает окно редактирования видимым.
А если флажок не отмечен, то выполняется таже самая функция ShowWindow(); с параметром SW_HIDE, этот параметр означает спрятать окно редактирования.
Связывание кода с событием BN_CLICKED флажка.Enable При включении флажка Enable программа Test.Exe должна сделать окно редактирования доступным, а при выключении - недоступным. Чтобы связать код с событием BN_CLICKED флажка Enable,: напишите следующий код в функции OnEnableButton():
void CTestDlg::OnEnableCheck()
{
// TODO: Add your control notification handler code here
////////Мой код начинается здесь///////////
////Обновить значения переменных элементов управления,
////(содержимое эрана передается переменным элементов управления)
UpdateData(TRUE);
///Если отметка флажка Enable зделать окно редактирования видимым
///А если нет - то невидимым
if(m_EnableCheck==TRUE)
GetDlgItem(IDC_TEST_EDIT)->EnableWindow(SW_SHOW);
else
GetDlgItem(IDC_TEST_EDIT)->EnableWindow(SW_HIDE);
////////Мой код заканчивается здесь///////////
}
Код который вы ввели содержит следующие операторы:
UpdateData(TRUE) - обновляет переменные элементов управления текущими их значениями на экране. После выполнения этого оператора перменной m_EnableCheck присваивается текущее значение флажка Enable.
Следующие операторы имееют ту же конструкцию, как и у флажка Visible, но только функция ShowWindow заменена на EnableWindow(), которая предназначена для того, чтобы элемент управления был недоступен или доступен. Она имеет те же параметры, что и функция ShowWindow.
Событие – изменение строки в окне редактирования.
Связывание кода с событием EN_CHANGE окна редактирования. В нашей программе при вводе слова CALCULATOR запускается калькулятор, а при вводе Paint - графический редактор Paint. Чтобы связать код с событием EN_CHANGE окна редактирования, напишите следующий код в функции OnChangeTestEdit():
void CTestDlg::OnChangeTestEdit()
{
...
// TODO: Add your control notification handler code here
////////Мой код начинается здесь///////////
///Обновить переменные
UpdateData(TRUE);
///Содать переменную типа CString, присвоить ей значение
///переменной m_TestEdit и выполнить перевод символов в верхний
///регистр.
CString UpperValue;
UpperValue=m_TestEdit;
UpperValue.MakeUpper();
///Если в окне редактирования напечатано PAINT
///запускается редактор PAINT и окно редактирования становится пустым.
if(UpperValue=="PAINT")
{
system("pbrush.exe");
m_TestEdit=" ";
UpdateData(FALSE);
}
///Если в окне редактирования напечатано CALCULATOR
///запускается калькулятор и окно редактирования становится пустым.
if(UpperValue=="CALCULATOR")
{
system("calc.exe");
m_TestEdit=" ";
UpdateData(FALSE);
}
////////Мой код заканчивается здесь///////////
}
Код который вы ввели содержит следующие операторы:
UpdateData(TRUE); обновляет переменную m_TestEdit значением содержимого окна редактирования, при каждом его изменении, так как окно редактирования связано с событием EN_CHANGE.
Следующий оператор CString UpperValue; содает новую переменную типа CString.
Затем переменной UpperValue приравнивается значение переменной m_TestEdit, это можно сделать, так как они имеют одинаковый тип.
Оператор UpperValue.MakeUpper(); переводит все символы переменной UpperValue в верхний регистр.
Оператор if(UpperValue=="PAINT"); проверяет, если введено ли слово PAINT, то выполняются следующие три оператора:
Первый system("pbrush.exe"); запускает графический редактор, так как не указан явный путь к файлу, то программа будет искать его в каталоге C:\WINDOWS.
Второй оператор m_TestEdit=""; присваивает переменной окна редактирования значение NULL, а следующий оператор UpadteData(FALSE) - обновляет экран. Вследствии этого, весь текст из окна редактирования удалится.
Заметьте, что мы перевели символы переменной UpperValue в верхний регистр - это нужно потому, что в языке С++ символы нижнего и верхнего регистра имеют разные значения, поэтому при переводе на верхний регистр, мы 100% будем уверены, что написанное нами слово PaInT совпадет с PAINT.
Следующая конструкция операторов полностью идеинтична предыдущей, только проверяется равно ли значение переменной m_TestEdit слову CALCULATOR, если да, то запускается калькулятор, и окно редактирования очищается.
ПРИЛОЖЕНИЕ А