Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

VisualC_Studio / Lab / lb_01

.htm
Скачиваний:
7
Добавлен:
21.03.2015
Размер:
79.72 Кб
Скачать

Лабораторная работа № 1 Лабораторная работа № 1

 

Тема: Интерфейс Microsoft Visual Studio C++. Окно проектов. Класс "Окно-Рамка". Класс "Приложение". События класса "Окно-Рамка". Таблица откликов. Отладка программы.

 

            Итак, Вы загрузили Microsoft Visual Studio C++. До сих пор Вы создавали лишь консольные приложения. Теперь займемся созданием Вашего первого проекта под Windows.

 

Создание простейшего приложения "Пустое окно"

            Выполните цепочку команд: File > New > Project. В открывшемся окне New  Project

·      в качестве типа проекта Project types выберите Visual C++ > Win32;

·      в качестве Templates выберите Win32 Project;

·      в качестве имени Вашего проекта Name введите MyPr01;

·      в качестве места расположения Вашего проекта Location укажите свой директорий;

·      нажмите "OK".

 

            В открывшемся окне мастера проектов Win32 Application Wizard перейдите на следующую страницу (Next) и в разделе Additional options выберите An Empty Project (пустой проект), после чего нажмите кнопку Finish для подтверждения своего выбора. IDE VC++ генерирует набор файлов, необходимых для работы с проектом и его сборки.

 

             С помощью Проводника убедитесь, что в Вашем директории появилась новая папка с именем MyPr01. Скопируйте в эту папку из папки VisualC_Part01\FilesForStud файлы с именами:

MyPr01.h, MyPr01.cpp, MainFrm.h, MainFrm.cpp.

 

             Чтобы добавить файл MyPr01.cpp в проект, выполните цепочку команд:

Project  > Add Existing Item.

            В открывшемся окне Add Existing Item выберите MyPr01.cpp и нажмите "OK".

 

Чтобы убедиться, что файл MyPr01.cpp добавлен в проект, перейдите на вкладку Solution Explorer  окна проектов (расположено слева). Если эта вкладка на экране отсутствует, откройте её через главное меню: View > Solution Explorer. Раскройте папку Source Files (Файлы исходных кодов или Файлы Реализации). Файл MyPr01.cpp действительно добавлен в проект.

 

 

 

 При необходимости удалить файл из проекта можно, выделив (щелкнуть правой кнопкой мыши) его в списке Source Files, как показано на рисунке, и выбрав команду Remove в открывшемся контекстном меню.

 

            Аналогичным образом добавьте в проект остальные три файла. Убедитесь, что файлы с расширением *.h попали в раздел заголовочных файлов Header Files.

 

            Теперь необходимо настроить проект так, чтобы он использовал библиотеку основных классов  MFC (Microsoft Foundation Class Library). Кроме того, надо сменить кодировку (не забывайте менять кодировку и в последующих лабораторных работах!). Делается это так: на вкладке Solution Explorer выделите строку MyPr01, а затем  выполните цепочку команд:

Главное меню: Project > Properties

и в открывшемся окне Property Pages внесите указанные на рисунке изменения, после чего  нажмите OK.

 

 

Даже для того, чтобы создать элементарнейшее приложение, которое ровным счётом ничего не делает, необходимо объявить и описать, как минимум, два класса   класс "ОКНО_ РАМКА" и класс "ПРИЛОЖЕНИЕ".

           

Перейдите на вкладку Solution Explorer окна проектов. Раскройте список заголовочных файлов Header Files. Дважды щелкнув левой кнопкой мыши имя файла MainFrm.h, откройте этот файл и просмотрите его. В этом заголовочном файле объявлен класс "ОКНО_РАМКА", названный нами  CMainWnd, и его конструктор. Этот класс объявлен,  как производный от стандартного класса CFrameWnd.

Закройте файл MainFrm.h.

 

            Откройте файл MyPr01.h и просмотрите его. В этом заголовочном файле объявлен класс"ПРИЛОЖЕНИЕ", названный нами  CMyApp, его конструктор и функция InitInstance(). Этот класс объявлен,  как производный от стандартного класса CWinApp.

В каждой программе, написанной на языке на С++, есть главная функция программы; в Dos − это main(), в Windows  − WinMain(). Эта функция обеспечивает запуск программы. Она проверяет операционную среду, выполняет некоторые настройки и, если все нормально, непосредственно передает управление Вашему коду. Класс CWinApp, содержащийся в MFC, и включает главную функцию программы, которая явно в тексте программы не присутствует.

Наш класс CMyApp, являясь потомком класса CWinApp, унаследовал все его свойства и методы. В этом классе мы объявили конструктор по умолчанию (без параметров). Он необходим, т.к. без него программу не удастся скомпилировать.

Закройте файл MyPr01.h.

 

            Откройте файл MainFrm.cpp и просмотрите его.

Класс CMainWnd ("ОКНО_РАМКА") является производным от стандартного класса CFrameWnd, который отвечает за работу окна программы в стиле одного документа (SDI   single document interface). Он создает окно, управляет сообщениями и т.д. В конструкторе этого класса мы вызвали функцию создания окна Create.

            Закройте файл MainFrm.cpp.

 

            Откройте файл MyPr01.cpp и просмотрите его.

Родительский класс CWinApp имеет виртуальный метод InitInstance() ("заглушку"). Для дочернего класса CMyApp в нашей программе создан свой метод в виде функции InitInstance(). Этот метод должен возвращать ненулевое значение, если инициализация прошла нормально и 0 в противном случае. Он предназначен, чтобы Вы могли описать класс окна CMainWnd и отобразить окно на экране.

Родительский класс CWinApp содержит общедоступный указатель на класс окна   m_pMainWnd. Если по окончании работы функции InitInstance() он будет равен нулю, то приложение завершится. И, естественно, после завершения приложения он обнуляется.

Строкой

m_pMainWnd=new CMainWnd();

мы присваиваем этому указателю адрес класса CMainWnd.

Функция  ASSERT(m_pMainWnd) сравнит значение указателя m_pMainWnd с нулем. Если объект "ОКНО_РАМКА" по какой-либо причине не был создан, то значение m_pMainWnd  окажется равно нулю и, благодаря функции  ASSERT,  Вы получите сообщение об ошибке с указанием имени файла и номера строки, в которых произошла эта ошибка.

Так как m_pMaiWnd имеет то же значение, что и CMainWnd, то мы используем эту переменную, чтобы вывести окно на экран.

В строке

CMyApp theApp;

объявляется один-единственный объект theApp класса CMyApp. Так осуществляется запуск приложения.

 

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

Соберите приложение:

Build > Build Solution (F7)

и запустите его на выполнение:

Debug >  Start Without Debugging (Ctrl+F5).

            Перед Вами появилось чистое окно с заголовком "Лабораторная работа № 1".

 

            Замечание. Вообще говоря, вместо четырёх файлов можно было использовать только один. Однако это противоречило бы концепции генератора кодов AppWizard, который Вы будете использовать, начиная со следующей лабораторной работы. Согласно этой концепции, для каждого нового класса AppWizard автоматически генерирует два новых файла: заголовочный файл (с расширением *.h) и файл реализации (с расширением *.cpp).

 

События класса "ОКНО_РАМКА"

            Предположим, что сегодня

·      мама велела Вам зайти после занятий в магазин за хлебом,

·      преподаватель напомнил о том, что завтра   крайний срок сдачи курсовой работы,

·      младший брат потребовал, чтобы Вы сделали за него домашнее задание по математике.

Если требования младшего брата можно и даже нужно проигнорировать (пусть сам задачки решает!), то к требованиям мамы и преподавателя имеет смысл отнестись более серьёзно.

Наше приложение пока не реагирует ни на какие требования. Оно очень "демократично" в том смысле, что ему на всех наплевать, вне зависимости от чинов и званий. Научим его быть более "ответственным":   заставим реагировать  на нажатие клавиш и двойной щелчок левой кнопки мыши в любом месте окна приложения.

            Пусть при нажатии любой клавиши появляется информационное окно с надписью:

"Нажата клавиша",

а при двойном нажатии левой кнопки мыши -  с надписью:

"Двойной щелчок левой кнопкой мыши".

 

Внесите следующие изменения в тексты исходных файлов.

 

1. В раздел public описания класса "ОКНО_РАМКА" (файл MainFrm.h) добавьте объявление двух закрытых виртуальных функций:

// объявление функции - реакции на двойной щелчок левой кнопки мыши

afx_msg void OnLButtonDblClk(UINT, CPoint);

// объявление функции - реакции на нажатие клавиши

afx_msg void OnKeyDown(UINT, UINT, UINT);

 

            2. В раздел private (расположите его под разделом public) описания класса "ОКНО_РАМКА" добавьте объявление таблицы откликов:

 

private:

DECLARE_MESSAGE_MAP(); // объявление таблицы откликов

 

            3. Перед конструктором CMainWnd() (файл MainFrm.cpp) вставьте таблицу откликов:

 

// таблица откликов на сообщения

BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)        

ON_WM_LBUTTONDBLCLK()                 // реакция на щелчок левой кнопки мыши

ON_WM_KEYDOWN()                              // реакция на нажатие клавиши

END_MESSAGE_MAP()

 

            4. После конструктора CMainWnd() вставьте тексты процедур-реакций на внешние события:

 

// процедуры-реакции на события

 

// Функция OnKeyDown - обработчик сообщения WM_KEYDOWN

void CMainWnd::OnKeyDown(UINT, UINT, UINT)

{

AfxMessageBox("Нажата клавиша");

}

 

// Функция OnLButtonDblClk - обработчик сообщения WM_LBUTTONDBLCLK

void CMainWnd::OnLButtonDblClk(UINT, CPoint)

{

AfxMessageBox("Двойной щелчок левой кнопкой мыши");

}

 

Соберите приложение и запустите его на выполнение. Убедитесь, что Ваше приложение научилось откликаться на двойной щелчок левой кнопки мыши и на нажатие клавиши.

Таким образом, чтобы добавить лишь одну функцию, реагирующую на внешние воздействия (такие функции называют обработчиками сообщения), программист обязан:

·         объявить функцию (в заголовочном файле);

·         внести соответствующее сообщение в таблицу откликов (в файле реализации);

·         создать текст функции (в файле реализации).

А поскольку запомнить наизусть названия сообщений, имена функций и их параметров практически невозможно, программист вынужден буквально "не вылезать" из справочных руководств. Каким образом можно существенно облегчить эту работу, Вы узнаете в следующей лабораторной работе.

 

Задание для самостоятельной работы

            "Научите" свое приложение откликаться на щелчки правой кнопки мыши в любом месте окна приложения. Пусть после щелчка Ваша программа с Вами вежливо поздоровается. Результат покажите преподавателю.

 

Быстрый доступ к элементам проекта

            Перейдите на вкладку ClassView окна проектов (если вкладка отсутствует на экране, её можно открыть через пункт View Главного меню) и раскройте список MyPr01 .

 

 

 

            Здесь перечислены классы, существующие в проекте, а также их процедуры и переменные. В списке Global Functions and Variables описаны глобальные переменные проекта. В нашем случае такая переменная одна − the App. С помощью этого окна Вы можете получить быстрый доступ к описанию классов, кодам процедур и объявлению переменных.

            Дважды щелкните левой кнопкой мыши строку the App, и перед Вами открылся файл реализации, причем курсор указывает на строку, в которой объявлена данная переменная. Закройте файл реализации.

            Дважды щелкните левой кнопкой мыши строку CMyApp, и перед Вами открылся заголовочный файл, причем курсор указывает на строку, в которой объявлен данный класс. Закройте заголовочный файл.

            Щелкните левой кнопкой мыши строку CMainWnd в верхней половине вкладки и дважды щелкните левой кнопкой мыши строку OnLButtonDblClk(UINT, Cpoint) в нижней половине вкладки, и перед Вами открылся файл реализации, причем курсор указывает на первую строку кода функции. Закройте файл реализации.

           

 

Отладка программы

            Часто при отладке программы необходимо узнать текущее значение некоторой переменной, которая изменяется "где-то там внутри...".  Проще всего сделать это с помощью уже известной Вам функции AfxMessageBox.

            Рассмотрим конкретный пример. Организуем счётчик MyCount, который будет увеличиваться при каждом нажатии клавиши. При двойном щелчке левой кнопкой мыши появится сообщение о текущем значении счётчика.

 

            1. Откройте заголовочный файл MainFrm.h и в конец объявления класса CMainWnd вставьте объявление закрытой переменной MyCount:

 

private:

            int MyCount;

 

Закройте файл MainFrm.h (естественно, сохранив внесённые изменения).

 

            2. Откройте файл MainFrm.cpp и внесите в него следующие изменения:

2.1. В конец конструктора CMainWnd вставьте строку, определяющую начальное значение переменной MyCount:

 

MyCount=0;

 

2.2. В тексте процедуры OnKeyDown

·         закомментируйте оператор AfxMessageBox("Нажата клавиша");

·         добавьте оператор, увеличивающий значение счетчика:

 

MyCount++;

 

            2.3. В тексте процедуры OnLButtonDblClk

·        закомментируйте оператор AfxMessageBox("Двойной щелчок левой кнопкой мыши");

·        добавьте следующие строки:

 

CString MyStr;                                                           // Объявляем строковую переменную

MyStr.Format("MyCount = %d\n",MyCount); // Заносим в строку MyStr значение счётчика

AfxMessageBox(MyStr);                                            // Выводим строку MyStr на экран

 

Пояснения.

Символы "%d" в операторе

 

MyStr.Format("MyCount = %d\n",MyCount);

 

означают, что в строку заносится значение целочисленной переменной.

            Если бы Ваша переменная MyCount имела вещественный тип double, то вместо "%d" следовало указать, например, "%5.2f". Такая запись означает, что на значение переменной будет отведено 5 позиций, причём две из них - на дробную часть.

            Формат вывода переменных других типов Вы можете посмотреть в описании стандартного оператора printf языка программирования С.

            Символы "\n" обеспечивают переход на новую строку после того, как переменная будет напечатана.

 

3. Соберите приложение и запустите его на выполнение. Дважды щелкните левой кнопкой мыши. Значение переменной MyCount, как и следовало ожидать, равно 0. Несколько раз нажмите на клавиши, а затем снова дважды щелкните левой кнопкой мыши. Убедитесь, что значение счётчика увеличилось.

 

 

            К сожалению, отладка программ с помощью оператора AfxMessageBox, мягко говоря, не всегда удобна. Например, Вам необходимо отследить значение переменной внутри цикла. В этом случае Вы быстро выйдете из себя (и не вернётесь обратно), раз за разом нажимая ОК, чтобы закрыть очередное окно AfxMessageBox.

 

           Среда программирования Visual C++ предоставляет возможность разрабатывать приложение в режиме отладочной сборки (Debug mode), а отлаженная готовая программа собирается заново в режиме окончательной сборки (Release mode). Исполняемые файлы, собранные в режиме Release, имеют меньший размер и работают быстрее. Однако на стадии разработки программы удобнее работать в режиме Debug.

 

            Выполните цепочку команд: Build > Configuration Manager. Перед Вами открылось окно Configuration Manager. Убедитесь, что по умолчанию выбран режим Win32 Debug и нажмите Close. В этом режиме отладка осуществляется с помощью оператора TRACE, который выводит сообщения в окно отладки Output (см. вкладку Output внизу экрана).

 

             В тексте процедуры OnLButtonDblClk закомментируйте оператор AfxMessageBox(MyStr);, заменив его оператором

 

TRACE(MyStr);

 

Соберите приложение (F7) и на этот раз запустите его на выполнение с помощью команды:

Debug >  Start Debugging (F5).

            Значение счётчика MyCount после двойного щелчка левой кнопкой мыши теперь появляется в окне Output.

 

Задание для самостоятельной работы

            Объявите вещественную переменную MyVar, задайте её начальное значение равным MyVar = 1,05. Пусть при нажатии клавиши значение этой переменной увеличивается вдвое, а при щелчке правой кнопки мыши функция AfxMessageBox выводит её значение на экран. Результат покажите преподавателю.

 

 

В начало.

К следующей лабораторной работе.

 

Соседние файлы в папке Lab