|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Основные сведенияЛабораторная работа №1 Часть 1 Тема: «Основы программирования приложений Windows» Основные сведения В настоящее время операционные системы фирмы Microsoft прочно завоевали господствующее положение на рынке операционных систем для персональных компьютеров на платформе Intel. Доминирующее положение Microsoft укрепил выпуск новых 32-разрядных систем: Windows 95 и Windows NT 4.0. Windows 95 в настоящее время рекомендуется разработчиками как ОС рабочей станции сети Microsoft для большинства персональных компьютеров среднего класса. Для более производительных рабочих станций в качестве альтернативы Windows 95 рассматривается более надежная Windows NT 4.0 Workstation. Для организации корпоративных сетей Microsoft предлагает ОС Windows NT 4.0 Server, поддерживающую функции файлового сервера, сервера приложений, сервера печати, сервера удаленного доступа и ряд других. Все 32-разрядные версии Windowsиспользуют единый интерфейс прикладных программ - API WIN32. API WIN32 представляет собой совокупность более 1000 системных функций. В отличие от MS DOS, где для вызова функций ОС используется механизм программных прерываний, вызов системных функций WIN32 производится по их именам. При этом независимо от языка программирования имена функций, а также входные и выходные параметры остаются неизменными. Прикладная программа, разработанная специально для Windows95 или Windows NT называется приложением WIN32 (WIN32 application). Архитектура приложения представляет собой архитектуру программы, управляемой событиями. Ключевую роль в организации работы всех подсистем и приложений Windows играет система сообщений. В Windows95 и Windows NT реализована вытесняющая мультизадачность на уровне потоков. Поток (thread) описывает последовательность исполнения кода внутри процесса. В соответствии с установленным приоритетом система выделяет каждому потоку кванты процессорного времени, задаваемые системным таймером. Любому потоку в приложении соответствует некоторая функция - функция потока. При запуске приложения создается процесс, а в его рамках – первичный поток, который и получает управление. Приложение должно состоять как минимум из одной функции – функции первичного потока, которая при программировании на языке С заменяет функцию main и должна быть определена следующим образом:
int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hPrevinstance, LPSTR lpszCmdLine, int nCmdShow) { // Тело функции } Все параметры, получаемые функцией WinMain, формируются операционной системой. Параметры hinstance и hPrevinstance представляют собой соответственно идентификаторы текущей и предыдущей копии приложения. Приложения WIN32 функционируют в изолированных виртуальных адресных пространствах и в силу этого не имеют возможности определить через параметр hPrevinstance, не запущено ли приложение вторично. Этот параметр использовался в предыдущих версиях Windows, для приложений WIN32 он всегда равен нулю. Параметр lpszCmdLine - дальний указатель на строку запуска приложения, параметр nCmdShow указывает рекомендуемый приложению способ представления главного окна при запуске. Приложение может игнорировать этот параметр, однако это не является хорошим стилем программирования. Для нормальной работы приложения функция потока (то есть в нашем случае – функция WinMain) должна обрабатывать сообщения. Сообщение представляет собой сформированную операционной системой в виде структуры типа MSG информацию о некотором событии во “внешнем” (по отношению к потоку) мире, о котором, по мнению ОС, должен “узнать” поток. Имеется три основных источника сообщений: аппаратура, потоки других процессов (или одного процесса – в случае мультипотоковых приложений) и сама ОС. Для обработки сообщений функция потока должна содержать цикл обработки сообщений (message loop). Основу этого цикла составляют две функции API WIN32, имеющие следующие прототипы: BOOL GetMessage (LPMSG lpmsg, HWND hwnd, UINT uMsgFilterMin, UINT uMsgFilterMax); LONG DispatchMessage (const MSG * lpmsg); Простейший циклобработкисообщений выглядит следующим образом: MSG msg; ... while (GetMessage(&msg, 0, 0, 0)) { DispatchMessage(&msg); } Функция GetMessage извлекает очередное сообщение из очереди сообщений вызвавшего ее потока. Параметр lpmsg - дальний указатель на структуру сообщения (типа MSG). Параметр hwnd (идентификатор окна) определяет конкретное окно из числа окон, созданных потоком, которому послано сообщение. Функция GetMessage возвращает значение FALSE в случае, если извлекается сообщение WM_QUIT, во всех остальных случаях возвращается значение TRUE. Выборка сообщения WM_QUIT приводит к выходу из цикла, после чего обычно поток завершается. Следует также отметить важную особенность функции GetMessage: если функция обнаруживает, что очередь сообщений потока пуста, то поток блокируется и ему не выделяется процессорное время до тех пор, пока новое сообщение не поступит в очередь. Функция DispatchMessage определяет окно, которому предназначено сообщение, и вызывает соответствующую функциюокна. Функция окна относится к так называемым косвенно вызываемым (callback) функциям, которые создаются разработчиком приложения, а вызываются Windows. Каждому окну, создаваемому потоком, должна соответствовать некоторая функция окна (допустимо, когда одна функция определяется как функция окна сразу для нескольких окон). В функции окна сосредоточены все действия потока по обработке сообщений, направленных окну. Так как абсолютное большинство приложений можно рассматривать как совокупность окон, можно считать, что основная работа приложения выполняется функцией (или функциями) окна. Функции окна соответствует следующий прототип (имя функции выбирается произвольно): LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); Параметры функции полностью аналогичны соответствующим полям структуры MSG. Фактически функция окна представляет собой один большой оператор выбора из обрабатываемых функцией окна сообщений и содержит обработчики этих сообщений. Как правило, программист планирует обработку далеко не всех сообщений, поступающих в функцию окна. Поэтому, перед возвратом из функции необработанные сообщения передаются на обработку по умолчанию функции DefWindowProc. Значение, возвращаемое функцией окна, в общем случае определяется тем, какое обрабатывалось сообщение. Приложение, использующее графический интерфейс с пользователем, должно иметь, как минимум, одно окно – главное окно приложения. Для того, чтобы создать окно, необходимо вначале зарегистрировать класс окна. Класс окна определяет набор свойств, характерных для всех окон, создаваемых на базе данного класса. В Windows определены стандартные классы окон, используемые для создания стандартных органов управления. Стандартные классы не регистрируются приложением и для них не определяется функция окна, так как эти операции выполняются автоматически при загрузке Windows. Для регистрации класса окна используется следующая функция API WIN32: ATOM WINAPI RegisterClassEx (const WNDCLASSEX FAR * lpwcx); В качестве параметра эта функция получает дальний указатель на структуру WNDCLASSEX, описывающую основные свойства всех окон, формируемых на базе создаваемого класса. Заметим, что среди прочих параметров, структура WNDCLASSEX содержит дальний указатель на функцию, которая будет использоваться как функция окна для всех окон, созданных на основе данного класса. Для создания окна используется функция CreateWindow: HWND WINAPI CreateWindow (LPCSTR lpszClassName, LPCSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hwndParent, HMENU hmenu, HINSTANCE hinst, LPVOID lpvParam); Функция CreateWindow не отображает окно на экране (для этого предназначена функция ShowWindow). Функция CreateWindow создает в оперативной памяти структуру типа WND, на которую фактически указывает идентификатор окна типа HWND, возвращаемый этой функцией. Если создать окно не удалось, функция возвращает значение NULL. Параметры функции служат для определения внешнего вида создаваемого окна. Загрузочный модуль приложения, кроме сегментов кода и данных, может также содержать дополнительные данные в специальном формате, называемые ресурсами приложения. К числу наиболее часто используемых типов ресурсов относятся пиктограмма (ICON), курсор (CURSOR), таблица текстовых строк (STRINGTABLE), графическое изображение (BITMAP), произвольные данные (RCDATA), меню (MENU и MENUEX), акселераторы меню (ACCELERATORS), шаблон диалога (DIALOG и DIALOGEX). Для включения ресурсов в загрузочный модуль приложения необходимо создать текстовый файл описания ресурсов (*.rc) и включить его в состав создаваемого программного проекта. В процессе сборки загрузочного модуля этот файл обрабатывается компилятором ресурсов, в результате чего ресурсы включаются в состав exe-файла приложения, там же формируется таблица ресурсов, которая используется для поиска и загрузки ресурсов в оперативную память. Промежуточным результатом данного процесса является скомпилированный двоичный файл описания ресурсов (*.res). Файл описания ресурсов состоит из специальных операторов, определяющих включаемые ресурсы. Обычно ресурсы загружаются автоматически перед их использованием, например при создании окна или диалоговой панели. Кроме того, имеются функции API, позволяющие загружать ресурсы динамически в процессе работы приложения. Стандартные органы управления представляют собой дочерние окна созданные на основе предопределенных в Windows классов окон. Для создания органа управления используется функция CreateWindow. В качестве имени класса окна для этой функции необходимо указать имя одного из предопределенных классов. Заголовок окна при этом рассматривается как строка, которая будет написана на поверхности органа управления. Для органа управления, на котором отсутствует надпись, соответсвующий параметр функции CreateWindow должен быть указан как NULL. Стиль окна задается как комбинация стилей WS_CHILD, WS_VISIBLE и стилей, определенных для соответствующих органов управления. Координаты, высота и ширина органа управления имеют тот же смысл, что и для произвольного окна. Параметр hwndParent должен содержать идентификатор окна, на поверхности которого создается орган управления. В качестве параметра hMenu следует указать определенную Вами через #define константу, которая будет служить идентификатором органа управления. Остальные параметры функции CreateWindow имеют обычный смысл. Как правило, органы управления создаются при обработке функцией окна сообщения WM_CREATE. Когда пользователь совершает какое-то действие над органом управления, в функцию родительского окна поступает сообщение WM_COMMAND. Параметр lParam этого сообщения содержит идентификатор окна органа управления типа HWND, который возвращается функцией CreateWindow при создании органа управления. Младшее слово параметра wParam содержит уже упоминавшийся идентификатор органа управления. Именно по этому идентификатору функция родительского окна определяет, от какого именно органа управления получено сообщение. Старшее слово wParam содержит код извещения, специфичный для каждого органа управления и определяющий, о чем собственно уведомляет родительское окно орган управления. Таким образом, для работы с органами управления родительскому окну достаточно обрабатывать сообщение WM_COMMAND. Обработчик этого сообщения должен вернуть нулевое значение. Из всего выше сказанного имеется одно исключение, касающееся полос просмотра. Во-первых, если необходимо иметь окно с полосами просмотра, то для этого достаточно при создании этого окна указать стили WS_VSCROLL и WS_HSCROLL для вертикальной и горизонтальной полос, соответственно. Во-вторых, вместо сообщения WM_COMMAND от вертикальной полосы просмотра поступает сообщение WM_VSCROLL, а от горизонтальной – WM_HSCROLL. Для того, чтобы влиять на состояние органов управления, необходимо посылать сообщения органу управления. Для каждого органа управления определен свой набор сообщений. Сообщения обычно посылаются при помощи функции SendMessage, имеющей тот же набор параметров, что и функция окна: LRESULT SendMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); Кроме того, довольно часто эта функция используется для посылки в собственную очередь сообщений WM_COMMAND, WM_VSCROLL, WM_HSCROLL для имитации событий от органов управления. Подобный прием часто используется, например, для синхронизации полосы просмотра с клавиатурой: при нажатии соответствующих клавиш обработчик сообщения WM_KEYDOWN посылает сообщения WM_VSCROLL или WM_HSCROLL. Следует напомнить также, что органы управления являются окнами, и поэтому к ним применимы те же функции, что и для любых других окон, в частности MoveWindow, EnableWindow, IsWindowEnabled, SetWindowText, ShowWindow, DestroyWindow. Кроме того, в дополнение к посылке сообщений органам управления, влиять на их состояние можно при помощи специальных функций API, определенных для некоторых органов управления. В файле windowsx.h системы программирования Borland C++ 5.02 для большинства стандартных органов управления определены также макросы, упрощающие передачу сообщений органам управления. В таблице 1 приведена общая информация о стандартных органах управления. Таблица 1 Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |