Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Void DisplayClass::display(char character)




{

cout<< character;

}

void DisplayClass::display(char* string)

{

cout <<string;

}

Но как C++ определяет, какую версию display() использовать при вызове метода? По типу передаваемого параметра. Например, если параметр относится к символьному типу, вызывается версия display() для символьного параметра. Если же передать ему строку, будет использована вторая версия.

Далее мы увидим, как применить их на практике при создании настоящих программ для Windows.

2. Наша первая настоящая программа для Windows на Visual C++

Ранее мы приступили к работе с C++ и научились создавать консольные приложения Win32. Сейчас мы напишем настоящую программу, умеющую работать с окнами. Мы создадим свою первую полноценную Windows-программу при помощи инструментов Visual C++ и запустим ее.

Затем мы тщательно изучим результат. Программы на Visual C++ обычно содержат немалый объем кода — к счастью, большая его часть автоматически генерируется средствами Visual C++. Перед тем как продолжать изучение, необходимо понять, для чего нужны различные части стандартной программы на Visual C++, потому что на ее основе будут построены все остальные программы.

При создании программ на Visual C++ обычно применяются мастера(wizards), например Visual C++ AppWizard, которым мы воспользуемся далее. После того как мастер сгенерирует код, мы отредактируем программу и настроим ее в соответствии со своими требованиями. Для этого нужно понимать, как работают различные компоненты программы на Visual C. Давайте немедленно приступим к делу.

Наша первая настоящая (то есть работающая в окне) программа на Visual C++ будет очень простой: так легче изучить новую тему. Все что она будет делать — это создавать окно и выводить в нем текст "Добро пожаловать в Visual C++".

На самом деле возможности нашей первой программы вовсе не ограничиваются! простым выводом сообщения. Visual C++ встроит в нее меню и панель инструментов, хотя они и не будут ничего делать (вскоре мы научимся работать с меню и панелями инструментов). Но давайте займемся построением программы. Это станет нашим первым шагом в полноценном программировании для Windows на Visual C++.

1. Запустите Visual C++ и выполните командуFile|New; открывается окно для выбора New.

 2. Выберите из спискаМFC AppWizard(exe).

3. Введите в текстовом поле Project Nameимя проекта welcome.

4. Нажмите кнопку ОК, чтобы запустить мастер Visual C++ AppWizard.

 5. AppWizard напишет за нас основную часть программного кода.

6. На экране появляется окно первого (Step 1) из шести этапов работы с AppWizard.

7. Оставьте без изменений все стандартные параметры AppWizard, кроме одного — по умолчанию AppWizard создает программы с несколькими окнами, а нам нужна программа с одним окном. Это облегчит знакомство с темой и сделает ее более понятной.

8. Установите переключатель Single Document и нажмите кнопку Next. Мы переходим ко второму этапу (Step 2) работы с AppWizard.

9. На этапе 2 AppWizard спрашивает, следует ли включить в программу какую-либо поддержку баз данных; оставьте установленным переключатель None.

10. Нажимайте кнопку Nextдо тех пор, пока не доберетесь до шестого этапа (Step 6) AppWizard..

11. На шестом этапе AppWizard сообщает, какие классы он собирается создать в новой программе: CWelcomeApp, CMainFrame, CWelcomeDocи CWelcomeView. Далее мы рассмотрим все эти классы.

12. Нажмите кнопку Finish— откроется окно New Project Information.

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

Welcome.clw Файл Class Wizard
Welcome.dsw Основной файл рабочей области
Welcome.h Заголовочный файл приложения
welcome.cpp Исходный текст приложения
StdAfx.h Заголовочный файл для стандартного «каркаса» приложения
StdAfx.cpp Исходный текст стандартного «каркаса» приложения
MainFrm.h Заголовочный файл главного окна
MainFrm.cpp Исходный текст главного окна
welcomeDoc.h Заголовочный файл документа
welcomeDoc.cpp Исходный текст документа
welcomeView.h Заголовочный файл вида
welcomeView.cpp Исходный текст вида
Resource.h Файл с ресурсными константами
welcome.rc Файл с ресурсами
welcome.ncb Файл с информацией о представлении и взаимных связях
welcome.dsp Файл проекта
res Каталог для ресурсов

14. Наша программа готова!

AppWizard также создает файл с именем ReadMe.txt,в котором более подробно разъясняется назначение некоторых файлов, созданных AppWizard:

MICROSOFT FOUNDATION CLASS LIBRARY: welcome

AppWizard создал приложение welcome за вас. Оно не только демонстрирует основные принципы использования классов Microsoft Foundation, но и является отправной точкой для написания вашего собственного приложения.

В этом файле содержится краткое описание всех файлов, составляющих приложение welcome.

welcome.dsp

Файл проекта содержит общие сведения о проекте и используется при построении отдельного проекта или подпроекта. Другие пользователи могут пользоваться файлом проекта (.dsp), однако они должны выполнить локальное экспортирование make-файлов.

welcome.h

Главный заголовочный файл приложения. Он включает другие заголовочные файлы проекта (в том числе Resource.h) и объявляет класс приложения СWelcomeApp.

AppWizard создает один тип документа и один вид:

welcomeDoc.h, welcomeDoc.cpp - документ

Файлы содержат класс CWelcomeDoc. Отредактируйте их, чтобы внести в документ специфические данные и реализовать сохранение/загрузку файлов (через CWelcomeDoc::Serialize).

welcomeView.h, welcomeView.cpp - вид документа

Файлы содержат класс CWelcomeView. Объекты CWelcomeView используются для просмотра объектов CWelcomeDoc.

Другие стандартные файлы:

StdAfx.h, StdAfx.cpp

Файлы используются для построения предварительно компилированных файлов - заголовочного (РСН) файла welcome.pen, а также файла типов StdAfx.obj.

Resource.h

Стандартный заголовочный файл, в котором определяются идентификаторы новых ресурсов. Microsoft Visual C++ читает этот файл и обновляет его содержимое.

 Примечания:

AppWizard помечает комментарием "TODO:" те части исходного текста, которые вам следует дополнить или изменить.

 Итак, наша программа готова. Давайте познакомимся с ней поближе.

Части программы на Visual C++

Программа, созданная Visual C++ AppWizard, состоит из четырех основных частей: объекта приложения, объекта главного окна, объекта документа и объекта вида.

Объект приложения

Объект приложения, находящийся в файлах welcome.h и welcome.cpp (файл .h coдержит определения констант, а также объявления переменных и методов класса), то что Windows запускает при старте программы. Когда этот объект начинает работу, он размещает на экране главное окно.

Объект главного окна

Объект главного окна отображает на экране саму программу; в нем находится меню, заголовок окна и панель инструментов. Объект главного окна отвечает за вce, что происходит вокруг того места, где собственно работает наша программа (где она рисует, выводит текст и т. д.). Рабочая зона программы называется клиентской областьюокна; например, текст выводится в клиентской области текстового редактора. За работу с клиентской областью отвечает объект вида.

Объект вида

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

Объект документа

В объекте документа хранятся данные программы. Возможно, у вас возникнет вoпрос — а почему бы не хранить эти данные в объекте вида? Дело в том, что таких данных бывает много, причем не все они отображаются в клиентской области. Visual C++ облегчает нашу задачу и позволяет сохранить все данные в объекте документа, а затем поручить объекту вида отобразить лишь те данные, которые попадают в клиентскую область объекта вида. Как мы вскоре увидим, для одного документа можно иметь несколько одновременно открытых видов.

Взаимосвязь четырех частей программы на Visual C++ выглядит так:

А теперь давайте заставим нашу программу хоть что-то делать.

Вывод приветствия

Пока что мы рассматривали программу, написанную мастером AppWizard. Давайте изменим ее так, чтобы она выводила сообщение «Добро пожаловать в Visual C++!» Для этого мы добавим небольшой фрагмент кода в метод OnDraw() класса CWelcomeView (вспомните, что этот класс служит для отображения данных). Программа вызывает метод OnDraw(), когда ей требуется вывести что-либо в клиентской области про граммы (например, при запуске программы, при свертывании и восстановлении окна или при перемещении другого окна, закрывающего часть клиентской области). В данный момент метод OnDraw() выглядит так (см. файл welcomeView.cpp):

void CWelcomeView::OnDraw(CDC* pDC)

{

CWelcomeDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: добавьте код для отображения данных ,

}

Мы добавим в этот метод код для вывода сообщения,

1. Чтобы приступить к редактированию метода, перейдите в окне просмотра Visual C++ на вкладку ClassView.

2. Найдите в иерархическом списке название классаCWelcomeView.

3. Щелкните на знаке <плюс> рядом с элементом. На экране выводится список методов данного класса.

 4.    Найдите в списке метод OnDraw() и дважды щелкните на нем — метод откроется в текстовом редакторе.

5.     Чтобы изменить поведение нашей программы, добавьте в OnDraw() всего две строки:

void CWelcomeView::OnDraw(CDC* pDC)

{

CString welcome_string = "Добро пожаловать в Visual C++";

 CWelcomeDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDC->TextOut(0, 0, welcome_string);

}

6. Программа готова. Запустите ее: для этого выполните команду Build |Build welcome.exe, а затем — команду Build | Execute welcome.exe.

7. Как видите, программа успешно выводит в окне сообщение. Настало время разобрать ее по кусочкам и понять, как она работает.

 Исследуем объект приложения

При запуске приложения Windows вызывает функцию WinMain() объекта приложения, поэтому наше знакомство с программой начнется именно с объекта приложения. С нашей точки зрения объект приложения должен выполнять три задачи:

· запустить программу,

· создать главное окно и

· организовать передачу сообщений Windows в главное окно и из него.

Что такое «сообщения Windows»? Это особые сигналы с минимальным объемом служебных данных, посредством которых различные объекты в среде Windows общаются между собой. Например, когда пользователь завершает работу программы, Windows посылает объекту приложения сообщение WM_QUIT. Если же пользователь изменяет размеры окна программы, она получает сообщение WM_SIZE. Наиболее интересные сообщения Windows перечислены в табл. 2.1.

Таблица 2.1. Некоторые сообщения Windows

Сообщение Windows Значение
WМ_ACTIVATE Окно становится активным или неактивным
WM_ACTIVATEAPP Активизируемое окно принадлежит другому приложению
WM_CANCELMODE Отмена системного режима
WМ_CHILDACTIVATE Активизируется дочернее окно
WM_CLOSE Окно было закрыто
WM_.CREATE Была вызвана функция создания окна
WM_DESTROY Была вызвана функция уничтожения окна
WM_ENABLE Окно было заблокировано или разблокировано
WM_ENDSESSION Сеанс работы завершается
WM_ENTERIDLE Начало пассивного цикла, которым можно воспользоваться для нужд программы
wm_erasebkgnd Необходимо стереть фон окна
WM_GETMINMAXINFO Получение информации о размерах окна
WM_GETTEXT Получение текста, связанного с окном
WM_GETTEXTLENGTH Получение длины текста, связанного с окном
WM_ICONERASEBKGND Необходимо стереть фон окна
WM_KILLFOCUS Окно теряет фокус ввода
WM_MENUCHAR Пользователь нажал клавишу, не используемую в текущем меню
WM_MENUSELECT Выбрана команда меню
WM_MOVE Окно переместилось
WM_PAINT Перерисовать часть окна
WM_PAINTICON Перерисовать часть значка приложения
WM_PARENTNOTIFY Окно создается или уничтожается
WM_QUERYENDSESSION Получена команда на завершение сеанса
WM_QUIT Завершение работы приложения
WM_SETFOCUS Окно получило фокус ввода
WM_SETFONT Изменился шрифт
WM_SETREDRAW Снимает флаг перерисовки
WM_SETTEXT Задает текст в заголовке окна
 WM_SHOWWINDOW Окно необходимо скрыть или вывести на экран
WM_SIZE Изменился размер окна

Объект приложения отсылает большинство полученных сообщений объекту главного окна (не считая WM_QUIT, которое завершает работу объекта приложения).

Объекты в программе на Visual C++ интенсивно общаются друг с другом. Это вполне понятно, поскольку программа делится на четыре главных объекта и каждому из них иногда приходится обращаться к услугам других объектов. На приведенной ниже схеме показано, как организовано взаимодействие четырех главных объектов в программе на Visual C++.

Код объекта приложения содержится в файле welcome.cpp. Наибольший интерес для нас представляет метод Initlnstance(), поскольку именно в нем программа собирает остальные классы (главного окна, документа и вида) и объединяет их в шаблон документа, в соответствии с которым объект приложения организует работу программы:

BOOL CWelcomeApp::lnitlnstance()

{

AfxEnableControlContainer();

// Стандартная инициализация

// Если вы не пользуетесь какими-либо функциями и желаете

// сократить размер выполняемого файла, удалите

 // ненужные процедуры инициализации.

#ifdef _AFXDLL

Enable3dControls();        // Вызывается при    использовании

// MFC в виде совместной DLL

else

Enable3dControlsStatic(); // Вызывается при статической

// компоновке MFC .

#endif

// Изменить ключ реестра, под которым будут сохраняться .

// параметры. Замените строку более подходящей, например,

 // названием вашей компании или организации. SetRegistryKey(_T("Local AppWizard-Generated Applications"));

LoadStdProfileSettings(); // Загрузить стандартные параметры

// из INI-файла (включая MRU)

// Зарегистрировать шаблоны документов приложения.

// Шаблоны документов объединяют документы, обрамленные окна и виды.

CSingleDocTemplate* pDocTemplate;

pDocTemplate = new CSingleDocTemplate(

IDR_MAINFRAME,

RUNTIME_CLASS(CWelcomeDoc),

RUNTIME_CLASS(CMainFrame).  // Главное обрамленное окно SDI

RUNTIME_CLASS(CWelcomeView));

AddDocTemplate(pDocTemplate);

// Просмотреть командную строку в поисках стандартных команд оболочки,

// DDE и открытия файлов

 CCommandLineInfo cmdinfo;

ParseCommandLine(cmdInfo);

// Организовать обработку команд, содержащихся в командной строке

if (!ProcessShellCommand(cmdInfo)) return FALSE;

// Было инициализировано всего одно окно; отобразить и обновить его.

m_pMainWnd->ShowWindow(SW_SHOW):

m_pMainWnd->UpdateWindow();

return TRUE;

}

 Обратите также внимание на строку m_pMainWnd->ShowWindow(SW_SHOW); в конце метода InitInstance(). Именно в ней наш объект приложения отображает главное окно программы, вызывая метод ShowWindow() объекта главного окна. Переменная m_pMainWnd содержит указатель на объект главного окна, а оператор -> действует точно так же, как и оператор . («точка»), только он работает с указателем на объект. Другими словами, этот оператор обращается к переменным и методам того объекта, на который ссылается данный указатель.

Имена переменных классов в Visual C++ имеют стандартный префикс m_. На самом деле в Visual C++ аналогичные префиксы используются для всех имен переменных (так называемая «венгерская запись»). Префикс обозначает тип перемен ной; например, префикс сиспользуется для символьных типов, поэтому с первого взгляда становится ясно, что cInput — символьная переменная. Наиболее распространенные префиксы венгерской записи перечислены в табл. 2.2.

Таблица 2.2. Префиксы венгерской записи










Последнее изменение этой страницы: 2018-04-12; просмотров: 413.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...