Одна из главных целей операционной системы Microsoft Windows – дать человеку, который хотя бы немного знаком с системой, возможность сесть за компьютер и запустить любое приложение без предварительной подготовки



Pdf просмотр
страница1/7
Дата28.11.2016
Размер0.9 Mb.
Просмотров1533
Скачиваний0
  1   2   3   4   5   6   7

ВВЕДЕНИЕ
Одна из главных целей операционной системы Microsoft Windows – дать человеку, который хотя бы немного знаком с системой, возможность сесть за компьютер и запустить любое приложение без предварительной подготовки (изучения интерфейса, команд и т. п.). Для этого Windows предоставляет дружественный интерфейс пользователя, такой, чтобы пользователь думал над тем, что программа делает, а не над тем, как ею пользоваться. Ведь, фактически, значительная часть кода Windows- приложения предназначена именно для организации интерфейса с поль- зователем (но не самая важная в приложении).
Хотя создание удобного интерфейса «под Windows» является посто- янной задачей при написании любой Windows-программы, такой интер- фейс не создается автоматически.
Объем исходного кода операционной системы Microsoft Windows, начиная с версии Windows 95, составляет более миллиона строк. Часть его программисты-разработчики оформили в виде функций интерфейса прикладной программы Win32 API, некоторые из которых вошли в со- став библиотеки MFC. Эти функции программисты могут использовать в своих программах для создания интерфейса.
В цикле лабораторных работ Вы познакомитесь с некоторыми клас- сами библиотеки MFC, которые позволят Вам создавать интерфейс поль- зователя в программах. Кроме того, в ходе изучения лабораторных работ
Вы постепенно освоите основные приемы, необходимые для создания приложений под Windows. Полученные знания позволят Вам самостоя- тельно совершенствоваться и изучать другие библиотеки классов.

1
1. ОСНОВЫ ПРОГРАММИРОВАНИЯ ПОД WINDOWS
1.1. Что такое MFC?
Функций API в операционной системе Microsoft Windows довольно много, и чтобы прикладному программисту было легче с ними работать, они были сгруппированы в классы, которые составляют библиотеку MFC.
MFC (Microsoft Foundation Classes) – это базовый набор классов
(библиотека), написанных на языке C++ и предназначенных для упрощения и ускорения процесса программирования под Windows.
В библиотеку входит более 200 классов. Они дают возможность со- здавать Windows-приложения на базе объектно-ориентированного подхо- да.
Одним из основных преимуществ работы с MFC является возможность многократного использования одного и того же кода. Так как библиотека со- держит много элементов, общих для всех Windows-приложе-ний, нет необ- ходимости каждый раз писать их заново. Вместо этого их можно просто наследовать. Кроме того, интерфейс, обеспечиваемый библиотекой, практи- чески независим от конкретных деталей, его реализующих.
Небольшое число классов, определенных в библиотеке, не связано непосредственно с программированием под Windows. Это, в частности, классы, предназначенные для создания строк управления файлами и об- работки особых ситуаций. Иногда называемые классами общего назначе-
ния, они могут использоваться как Windows-, так и нe Windows-прило- жениями.
В операционной системе Windows реализован интерфейс вызова
функций. Благодаря данному интерфейсу, доступ к системным ресурсам операционной системы осуществляется через целый ряд системных функций. Совокупность функций называется прикладным программным интерфейсом, или API (Application Programming Interface). Этот меха- низм достаточно удобен: так, программисту не надо каждый раз заново писать программный код для прорисовки меню, кнопок, панелей инстру- ментов, окон и т. п. Он может воспользоваться уже готовыми и встроен- ными в операционную систему Windows элементами интерфейса и функ- циями обработки действий пользователя.
Поскольку API состоит из большого числа функций, может сложить- ся впечатление, что при компиляции каждой программы, написанной для
Windows, к ней подключается код довольно значительного объема. В действительности это не так. Функции API содержатся в библиотеках
динамической загрузки (Dynamic Link Libraries, или DLL), которые за- гружаются в память только в тот момент, когда к ним происходит обра- щение, т. е. при выполнении программы. Хотя возможно скомпилировать

2
программу и с использованием статических библиотек, но тогда ее объем значительно возрастет.
1.2. Многозадачность в Windows
Как известно, все версии операционной системы Windows поддер- живают многозадачность. Начиная с версии Windows 95/NT, поддержи- ваются два типа многозадачности: основанный на процессах и основан- ный на потоках. Поскольку это очень важный момент, рассмотрим его подробнее.
Процесс
это программа, которая выполняется. При многозадачно- сти такого типа две или более программы могут выполняться параллель- но. Конечно, они по очереди используют ресурсы центрального процес- сора и, с технической точки зрения, выполняются не одновременно. Но благодаря высокой скорости работы компьютера это практически неза- метно. Если в компьютере имеются два центральных процессора или два ядра в одном процессоре, то выполнение программ вообще может проис- ходить независимо.
Поток
– это отдельная часть исполняемого кода. Название произо- шло от понятия «направление протекания процесса». В многозадачности данного типа отдельные потоки внутри одного процесса также могут вы- полняться одновременно. Все процессы имеют, по крайней мере, один поток, но их может быть несколько.
Отсюда можно сделать вывод, что в Windows допускается существо- вание процессов, состоящих из двух или нескольких частей, причем ча- сти и процессы могут выполняться одновременно. Оказывается, такое предположение верно. Следовательно, при работе возможно параллель- ное выполнение как программ, так и отдельных частей самих программ.
В Windows используется приоритетная многозадачность. Каждому активному потоку предоставляется определенный промежуток времени работы процессора. По истечении данного промежутка управление авто- матически передается следующему потоку. Это не дает возможность про- граммам полностью захватывать ресурсы процессора.
1.3. Взаимодействие программ и Windows
Windows и программы взаимодействуют следующим образом: про- грамма ожидает получения сообщения от Windows. Когда это происхо- дит, то выполняется некоторое действие. После его завершения програм- ма ожидает следующего сообщения. Важно понимать, что на действия пользователя или других программ прежде всего реагирует операционная система, а затем она может послать сообщение Вашей программе. Ваша программа может обработать это сообщение или проигнорировать.
Напрямую взаимодействия программы с пользователем или другими программами, минуя посредничество Windows, обычно не происходит.
Операционная система реагирует на все внешние воздействия и посылает

3
сообщения всем программам, а будет ли программа реагировать на эти сообщения, зависит от программиста.
Windows может посылать программе сообщения различных типов.
Например, каждый раз при щелчке мышью в окне активной программы по- сылается соответствующее сообщение. Другой тип сообщений посылается, когда необходимо обновить содержимое активного окна. Сообщения по- сылаются также при нажатии клавиши. Необходимо запомнить одно: по отношению к программе сообщения появляются случайным образом.
1.4. Основы программирования под Windows
Поскольку архитектура Windows-программ основана на принципе сообщений, все эти программы содержат некоторые общие компоненты.
Обычно их приходится в явном виде включать в исходный код. Но, к сча- стью, при использовании библиотеки MFC это происходит автоматиче- ски; нет необходимости тратить время и усилия на их написание. Тем не менее, чтобы до конца разобраться, как работает Windows-программа, написанная с использованием MFC, и почему она работает именно так, необходимо в общих чертах понять назначение этих компонентов. Кроме того, на них ссылаются практически во всех книгах, посвященных про- граммированию под Windows.
Все Windows-программы должны содержать специальную функцию, которая не используется в самой программе, но вызывается операцион- ной системой. Эту функцию обычно называют функцией окна или проце-
дурой окна. Она вызывается Windows, когда системе необходимо пере- дать сообщение в программу. Именно через нее осуществляется взаимо- действие между программой и системой. Функция окна передает сооб- щение в своих аргументах. Согласно терминологии Windows, функции, вызываемые системой, называются функциями обратного вызова. Таким образом, функция окна является функцией обратного вызова.
Как объяснялось выше, Windows взаимодействует с программой, по- сылая ей сообщения. Все приложения Windows должны организовывать так называемый цикл сообщений. В этом цикле каждое необработанное сообщение должно быть извлечено из очереди сообщений данного при- ложения и передано назад в Windows, которая затем вызывает функцию окна программы с данным сообщением в качестве аргумента.
Как будет показано дальше, каждое окно в Windows-приложении ха- рактеризуется определенными атрибутами, называемыми классом окна. В традиционной программе класс окна должен быть определен и зарегистри- рован прежде, чем будет создано окно. При регистрации необходимо со- общить Windows, какой вид должно иметь окно и какую функцию оно вы- полняет. В то же время регистрация класса окна еще не означает создания самого окна. Для этого требуется выполнить дополнительные действия.

4
1.5. Типы данных в Windows
Как Вы вскоре убедитесь, в Windows-программах вообще (и в исполь- зующих библиотеку MFC в частности) не слишком широко применяются стандартные типы данных из С или C++, такие как int или char*. Вместо них используются типы данных, определенные в различных библиотечных
(заголовочных) файлах. Наиболее часто используемыми типами являются
HANDLE, HWND, BYTE, WORD, DWORD, UINT, LONG BOOL, LPSTR и
LPCSTR. Тип HANDLE обозначает 32-разрядное целое число, используе- мое в качестве дескриптора. Есть несколько похожих типов данных, но все они имеют ту же длину, что и HANDLE, и начинаются с литеры Н.
Дескриптор
это число, определяющее некоторый ресурс (важнее не само число, а ресурс, который определяется дескриптором). Дескрип- тор является уникальным числом и однозначно указывает на ресурс.
Дескрипторы необходимы, чтобы Windows могла обратиться к лю- бому ресурсу, элементу интерфейса. Понятно, что эти числа не должны повторяться. Например, тип HWND обозначает 32-разрядное целое – де- скриптор окна.
Тип BYTE обозначает 8-разрядное беззнаковое символьное значе- ние, тип WORD – 16-разрядное беззнаковое короткое целое, тип DWORD
– беззнаковое длинное целое, тип UINT – беззнаковое 32-разрядное це- лое. Тип LONG эквивалентен типу long. Тип BOOL обозначает целое и используется, когда значение может быть либо истинным, либо ложным
(значения True и False). Тип LPSTR определяет указатель на строку, а
LPCSTR – константный (const) указатель на строку.
1.6. Соглашение об использовании имен
Программный код библиотеки MFC написан с соблюдением согла- шения об использовании имен, принятом фирмой «Microsoft». Например, имя функции должно начинаться с глагола, за которым следует суще- ствительное. Первые символы глагола и существительного должны быть написаны с заглавной буквы. В большинстве случаев имена функций в лабораторных работах соответствуют данному правилу.
Для имен переменных «Microsoft» решила применять довольно сложную систему включения ссылки на используемый тип данных. С этой целью в начало имени переменной добавляется префикс, который соответствует определенному типу данных и записывается строчными буквами. Само имя начинается с заглавной буквы. Префиксы типов при- ведены в табл. 1. Откровенно говоря, использование этих префиксов счи- тается спорным и не всегда соблюдается. Многие программисты придер- живаются этого правила, а многие нет. В лабораторных работах префик-

5
сы используются только тогда, когда это кажется достаточно разумным.
Вы можете поступать так, как привыкли (до соответствующего материала и указаний преподавателя).
Таблица 1
Символы префиксов типов переменных
Префикс
Тип данных b булевый (один байт; Boolean) c символ (один байт; Char)
C класс (Class) dw длинное беззнаковое целое (Double Word) f
16-разрядное битовое поле (флаги; Flags) fn функция (Function) h дескриптор (Handle) l длинное целое (Long) lp длинный указатель (Long Pointer) n короткое целое (Short Int) p указатель (Pointer) pt длинное целое, хранящее экранные координаты (Point) w короткое беззнаковое целое (Word) sz указатель на строку, завершающуюся символом «\0» (String by Zero) lpsz длинный указатель на строку, завершающуюся символом «\0» (Long
Pointer String by Zero) rgb длинное целое, хранящее значение цвета в формате RGB (Red, Green, Blue)
1.7. Иерархия классов MFC
Структура иерархии классов MFC довольно большая. В ее вершине находится класс CObject. Он содержит различные функции, используе- мые во время выполнения программы и предназначенные, в частности, для предоставления информации о текущем типе данных. Класс CObject является предком большинства других классов MFC, его свойства насле- дуются во всех порожденных классах.
Некоторые классы порождаются непосредственно от CObject. Наибо- лее широко используемыми среди них являются CCmdTarget, CFile, CDC,
CGdiObject, CException и CMenu. Класс CCmdTarget предназначен для об- работки сообщений. Если помните, в первой главе говорилось о том, что
Windows взаимодействует с программой через механизм сообщений, кото- рый и реализован в CCmdTarget. Класс CFile предназначен для работы с файлами, в частности с файлами на диске. Класс CDC обеспечивает под- держку контекстной связи с устройством (под устройством здесь понима- ется преимущественно экран). Класс CException предназначен для обра- ботки особых ситуаций, а CMenu – для создания меню. Помимо вышепе- речисленных, есть еще несколько классов, порождаемых непосредственно от CObject и предназначенных для синхронизации потоков, а также для ра- боты с базами данных, массивами, списками и преобразователями типов.

6
От класса CCmdTarget порождается очень важный класс: CWnd. Он является базовым для создания всех типов окон, а также различных эле- ментов управления окна. Наиболее широко используемым классом, по- рождаемым от CWnd, является CFrameWnd. Он обеспечивает поддержку так называемых SDI-окон (SDISingle Document Interface – одно- документный интерфейс). В классах, порождаемых от CFrameWnd, будет инициализироваться очередь сообщений программы.
Другим классом, порождаемым от CCmdTarget, является CWinThread.
С его помощью создается поток выполнения приложения и поддерживает- ся механизм потоковой многозадачности.
От CWinThread порождается, наверное, единственный из наиболее важных классов, обращение к которому в MFC-программах происходит напрямую: CWinApp. Хотя он расположен лишь на четвертом уровне иерархии в MFC, тем не менее, он является одним из фундаментальных классов, поскольку предназначен для создания самого приложения. В частности, он позволяет управлять загрузкой, инициализацией, выполне- нием и завершением приложения. В каждой программе имеется один (и только один) объект класса CWinApp. Как только он будет создан, при- ложение начнет выполняться.
1.8. Глобальные функции и функции-члены в MFC
Большинство функций, вызываемых в MFC-программе, являются члена- ми одного из классов, определенных в библиотеке. Вот несколько примеров:

функция, позволяющая отобразить окно, называется ShowWindow и является членом класса CWnd;

для вывода текстовой строки в окно используется функция TextOut – член класса CDC.
Большинство функций API доступны через функции-члены MFC.
Именно по этой причине последние используются так часто. Всегда можно обратиться непосредственно к самим API-функциям.
В библиотеке есть и ряд глобальных функций, которые также можно свободно использовать. Все они начинаются с префикса afх. Например, одной из наиболее широко используемых функций является AfxMessage-
Box. Далее в лабораторных работах будет показано, как с ее помощью отобразить на экране окно сообщения. Поскольку этот тип окон является заранее определенным, такое окно можно отображать независимо от дру- гих окон приложения.
1.9. Файл AFXWIN.H
Все MFC-программы должны включать файл AFXWIN.H. В нем (а также в различных вспомогательных файлах) содержатся описания клас-

7
сов библиотеки MFC. Он автоматически подключает большинство дру- гих библиотечных файлов, относящихся к MFC, в том числе файл WIN-
DOWS.H. Включая файл AFXWIN.H в свою программу, Вы тем самым подготавливаете все необходимое для создания Windows-приложения.
1.10. Контрольные вопросы
1.
Что такое MFC?
2.
Какой файл обязательно необходимо подключать в MFC-программы?
3.
Что такое дескриптор?
4.
Как взаимодействует Windows и программа?
5.
Что такое очередь сообщений?
6.
Что такое сообщение?
7.
С помощью какого механизма взаимодействуют Windows и прило- жения?
8.
Что такое цикл сообщений?
9.
Какие виды многозадачности есть в Windows?
10.
Что такое процесс?
11.
Что такое поток?
12.
Перечислите наиболее важные классы в MFC?
13.
За что отвечает класс CWnd?
14.
Для чего предназначен класс CWinApp?
15.
Приведите пример глобальной функции и функции-члена в MFC?
16.
Какой класс стоит в вершине иерархии классов MFC?
17.
Какой заголовочный файл должны включать все программы на MFC?

8
2. ЛАБОРАТОРНАЯ РАБОТА № 1.
СОЗДАНИЕ ПРОСТЫХ ПРИЛОЖЕНИЙ WINDOWS
Время выполнения лабораторной работы – 4 часа.
Цель работы – изучить каркас простых приложений Windows.
Оборудование и программное обеспечение, необходимое для выпол- нения лабораторной работы: компьютер с процессором не хуже Penti- um II с тактовой частотой 266 МГц, оперативной памятью не менее 64
Мб, с операционной системой Microsoft Windows 98/NT/2000/XP, средой программирования Microsoft Visual C++ 6.0.
2.1. Каркас MFC-программы
В данной лабораторной работе мы напишем простую программу, ко- торая послужит основой для написания всех остальных программ в дру- гих лабораторных работах.
В простейшем случае программа, написанная с использованием
MFC, содержит два класса, порождаемые от классов иерархии библиоте- ки: класс, предназначенный для создания приложения, и класс, предна- значенный для создания окна. Другими словами, для создания мини- мальной программы необходимо породить один класс, определяющий непосредственно приложение, и второй класс, определяющий главное окно приложения. Первый порождается от CWinApp, второй от
CFrameWnd. Хотя в программе могут при необходимости наследоваться любые классы, но эти два обязательны для любой программы.
Кроме создания вышеупомянутых классов, в программе также должна быть организована обработка всех сообщений, поступающих от Windows.
Поскольку в данном примере не производится ничего, кроме отображения окна, нет и необходимости отвечать на какое-либо сообщение. Однако ме- ханизм обработки сообщений все же должен присутствовать.
Для создания MFC-программы необходимо выполнить следующие действия:
1.
От CWinApp породить класс, определяющий приложение.
2.
От CFrameWnd породить класс, определяющий окно.
3.
Создать очередь сообщений.
4.
Переопределить функцию InitInstance класса CWinApp.
5.
Создать экземпляр класса, определяющего приложение.
Прежде чем продолжить чтение, протестируйте пример программы, приведенной в листинге № 1. В нем создается стандартное окно, содер- жащее заголовок, системное меню, а также кнопки минимизации, макси- мизации и закрытия.
Результат выполнения программы показан на рис. 1.

9
Листинг № 1. Минимальная MFC-программа
//
Минимальная
MFC- программа
#include
//
Порождение основных классов
//
Это класс
, предназначенный для создания главного окна class CMainWin:public CFrameWnd
{ public:
CMainWin();
//
Конструктор класса
DECLARE_MESSAGE_MAP() //
Макрос
, определяющий очередь
// сообщений
};
//
Определение конструктора класса
CMainWin
CMainWin::CMainWin()
{
//
Создание окна
Create(NULL, "
Скелет
MFC- приложения ");
};
//
Это класс
, предназначенный для создания приложения class CApp:public CWinApp
{ public:
BOOL InitInstance(); //
Функция инициализации приложения
};
//
Инициализация приложения
BOOL CApp::InitInstance()
{
//
Объявление указателя и
создание экземпляра
CMainWin через указатель m_pMainWnd = new CMainWin;
//
Отображение окна m_pMainWnd -> ShowWindow(m_nCmdShow);
//
Обновление окна m_pMainWnd -> UpdateWindow();
//
Возврат успешного завершения инициализации приложения return TRUE;
};
//
Это пустая очередь сообщений приложения
//
Не обрабатывается ни одного сообщения
BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd)
END_MESSAGE_MAP()
CApp App; // создание экземпляра приложения
Конец листинга № 1

10
Рис. 1. Результат работы программы, приведенной в листинге № 1
Работает данная простейшая программа следующим образом:

создается экземпляр класса CApp (самая последняя строка в листин- ге № 1), для чего вызывается конструктор этого класса, но так как он не описан, то выполняется конструктор родительского класса
CWinApp;

в конструкторе родительского класса вызывается функция инициали- зации приложения InitInstance, которая переопределена в классе
CApp;

в функции инициализации приложения создается экземпляр класса
CMainWin, являющийся дочерним от класса CFrameWnd, для чего вызывается конструктор класса CMainWin;

в конструкторе класса CMainWin создается окно с помощью функ- ции Create;

далее в функции инициализации InitInstance приложения окно отоб- ражается на экране функцией ShowWindow и обновляется его содер- жимое функцией UpdateWindow;

функция инициализации возвращает значение TRUE в конструктор класса CWinApp.
Как видите, почти весь код в примере предназначен для порождения двух классов от базовых классов, определенных в MFC – CFrameWnd и
CWinApp. Первый класс предназначен для создания главного окна при- ложения, а второй – для создания самого приложения. Приложение начи- нает выполняться, когда создается экземпляр класса второго типа.
Для создания стандартного окна в приложении должен наследовать- ся класс от класса CFrameWnd. В примере порождаемый класс называет- ся CMainWin. Он содержит два члена: конструктор CMainWin и макрос
DECLARE_MESSAGE_MAP. В макросе объявляется очередь сообщений для класса CMainWin, что позволяет организовать обработку сообщений.
Для любого окна, в котором обрабатываются сообщения, необходимо применять этот макрос. Кроме того, он должен быть последним членом, объявляемым в классе (в противном случае следующий член должен быть объявлен с помощью оператора доступа – «



Поделитесь с Вашими друзьями:
  1   2   3   4   5   6   7


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал