Системное программное обеспечение
СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
Лабораторный практикум дисциплины для специальностей
1 40 01 01 “Программное обеспечение информационных технологий”
(специализации 1 40 01 01 05 «Моделирование и компьютерное
проектирование программно-аппаратных комплексов”)
1 40 01 02 “Информационные системы и технологии”
(направление 1 40 01 02 04 «Компьютерные системы и технологии
(обработка и представление информации)”
на 2017-2018 учебный год
практикум составлен
преподавателем кафедры
на основе базовой программы дисциплины
“Системное программное обеспечение”, утвержденной “____”___________ г.
Белорусским государственным техническим университетом
Регистрационный № ____
Минск
СОДЕРЖАНИЕ
ЦЕЛЬ ИЗУЧЕНИЯ ДИСЦИПЛИНЫ... 3
Часть 1 4
Лабораторная работа № 1 Простейшее приложение на базе WIN32 API 4
Цель работы.. 4
Постановка задачи. 4
Теоретические сведения. 5
Лабораторная работа № 2 Программирование внешних устройств. 11
Цель работы.. 11
Постановка задачи. 11
Теоретические сведения. 11
Лабораторная работа № 3 Диалоги и элементы управления. 16
Цель работы.. 16
Постановка задачи. 16
Теоретические сведения. 17
Лабораторная работа № 4 Работа с файлами. 25
Цель работы: 25
Постановка задачи. 25
Теоретические сведения. 25
ЦЕЛЬ ИЗУЧЕНИЯ ДИСЦИПЛИНЫ
Целью изучения дисциплины является получение навыков создания системных программных средств поддержки, управления и реализации вычислительных процессов. Изучение дисциплины основано на концепциях построения операционных систем (ОС) (прерывания, модули, виртуальные устройства, управляющие блоки, очереди и т.п.), макрогенерации, средств автоматизации и программирования, широкого использования персональных ЭВМ в инженерной деятельности.
Часть 1
Лабораторная работа № 1 Простейшее приложение на базе WIN32 API
1.1 Цель работы: изучить основы разработки Windows-приложений на базе WIN32 API.
Изучаемые вопросы:
1. Структура оконного класса, поля, их назначение, инициализация.
2. Классы окон, регистрация оконного класса.
3. Создание экземпляра оконного класса.
4. Отображение окон на экране.
5. Управление положением и размерами окна.
6. Обновление оконной области на экране.
7. Установки фона.
8. Курсор приложения. Типы курсоров, их прикрепление к приложению.
9. Цикл обработки сообщений (GetMessage).
10. Оконная функция, назначение, параметры, обработка сообщений.
1.2 ПОСТАНОВКА ЗАДАЧИ:
Выбор варианта!
Для того чтобы выбрать свой вариант: смотрите номер зачетной книжки, если № зачетной книжки больше количества вариантов, то делите номер зачетной книжки на количество тем. Остаток и будет номер варианта. Если № зачетной книжки меньше количества вариантов, то № зачетки и есть номер вашего варианта. (этот метод действует на все задания с вариантами)
Вариант 1.
Разработать приложение на базе WIN32 API, выполняющее следующие действия:
1. Через ∆t1 окно изменяет стиль, через ∆t2 окно изменяет цвет.
2. Окно двигается по экрану с помощью клавиш <←>, <↑>, <→>, <↓> с интервалом 20 пикселей.
3. Двойной щелчок любой кнопкой мыши – появляется дочернее окно, щелчок левой кнопкой – это окно изменяет размер.
Вариант 2.
1. Через dt1 в главном окне программы создается дочернее окно.
2. В главном окне содержится информация о положении клавиши «NumLock», в дочернем – о «CapsLock».
3. По щелчку мыши окна обмениваются информацией: в главном окне о «CapsLock», в дочернем – «NumLock».
Вариант 3.
1. Через dt1 в центре окна создается регион, размеры которого равны 1/3 размеров окна.
2. Через dt2 размеры региона произвольно изменяются.
3. После нажатия клавиши <Enter> их значения выводятся на экран.
4. Щелчок левой кнопкой мыши – регион и надписи исчезают, правой – появляются снова.
Вариант 4.
1. Через Δt1 создаются окна в последовательности 2-1-3
2. Через Δt2 меняются заголовки окон 1-3
3. Нажатие клавиш <Alt> + <номер окна> закрывает окно данного номера
4. По щелчку мыши окна изменяют положение
Вариант 5.
1. Через dt1 в центре экрана создается окно, размеры которого равны 0,25 размера экрана.
2. Окно двигается по экрану с помощью клавиш “→”, “←”, “↑”, “↓”.
3. По левому клику мыши в экране появляется дочернее окно, по правому клику оно пропадает.
1.3 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ:
Установка фона.
В качестве кисти фона можно использовать чистые цвета или пиктограмму. Чаще используют значение системного цвета плюс 1. Цвета преобразуют в тип HB_BRUSH. Например, следующий оператор устанавливает системный цвет закрашивания фона wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1). Система сама удаляет кисть фона при освобождении класса. Если указать NULL, то система сама будет окрашивать фон. Можно использовать функцию CreateSolidBrush (rgbColor).
CreateSolidBrush(RGB(192,220,192)).
Solidозначает , что создается кисть, имеющая чистый цвет. Вы можете также создать штриховую кисть (hatch), состоящую из горизонтальных, вертикальных или диагональных линий.
Можно динамически изменить цвет фона:
SetClassLong(hWnd,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(0,0,0)));
Цикл обработки сообщений
Состоит из управляющей структуры while, которая при каждом проходе цикла получает очередное сообщение из очереди, посредством функции GetMessage(), затем переводит все сообщения от виртуальных клавиш в символьные сообщения с помощью функции TranslateMessage(), и после этого отсылает полученное сообщение на обработку оконной процедуре, используя функцию DispatchMessage
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}.
Оконнаяфункция
Оконная функция вызывается операционной системой Windows, когда программе нужно послать сообщение. В качестве параметров оконная функция получает сообщение, посылаемое Windows.
LRESULTCALLBACKWindowProc(HWNDhwnd, UINTuMsg, WPARAMwParam, LPARAMlParam);
У функции окна имеется четыре аргумента: hWnd - идентификатор окна, msg - код текущего сообщения, wParam и lParam - дополнительная информация о сообщении.
В Windows существует более тысячи стандартных сообщений. Для обработки стандартных сообщений существует функция DefWindowProc(), которая обрабатывает переданное ей сообщение по умолчанию. Таким образом, вы должны обрабатывать только те сообщения, обработка по умолчанию которых вас не устраивает.
LRESULT DefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
Виртуальные клавиши
Когда пользователь нажимает или отпускает клавишу, Windows посылает в программу сообщение ввода с клавиатуры
общение Событие
----------------------------------------------------------
WM_KEYDOWN Пользователь нажал клавишу;
WM_KEYUP Пользователь отпустил клавишу;
WM_SYSKEYDOWN Пользователь нажал системную клавишу;
WM_SYSKEYUP Пользователь отпустил системную клавишу.
Параметр wParam определяет виртуальный код данной клавиши. Виртуальный код клавиши - это независимое от устройства значение клавиши. Windows использует виртуальные коды клавиш для того, чтобы не завесить от используемой персональной ЭВМ.
Символьные сообщения
Прикладная программа, которая читает символы, вводимые с клавиатуры, должна использовать функцию TranslateMessage в своем цикле обработки сообщений. Эта функция преобразует сообщение ввода с клавиатуры в соответствующее сообщение ввода символа в коде ANSI - WM_CHAR или WM_SYSCHAR. Эти сообщения содержат ANSI-коды символа для данной клавиши в параметре wParam. Параметр lParam аналогичен таковому в сообщении ввода с клавиатуры.
Системные сообщения
Для системных клавиш Windows генерирует соответствующие сообщения WM_SYSKEYUP и WM_SYSKEYDOWN. Это специальные клавиши такие, например, как Alt и F10, которые принадлежат интерфейсу пользователя и не могут использоваться прикладной программой другим способом.
6. Преобразование кодов
Преобразование ANSI<->OEM
Чтобы корректно отображались тексты в кодировке DOS, вам, вероятно, потребуется преобразовывать строки из кодировки Windows (ANSI) в кодировку DOS (OEM) и обратно. Функция CharToOem преобразовывает строку из кодировки ANSI в кодировку OEM, а функция OemToChar выполняет обратное преобразование:
Фокус ввода
Клавиатура должна разделяться между всеми приложениями, работающими под Windows. Некоторые приложения могут иметь больше одного окна, и клавиатура должна разделяться между этими окнами в рамках одного и того же приложения. Когда на клавиатуре нажата клавиша, только одна оконная процедура может получить сообщение об этом. Окно, которое получает это сообщение клавиатуры, является окном, имеющем "фокус ввода" (inputfocus).
Концепция фокуса ввода тесно связана с концепцией "активного окна". Окно, имеющее фокус ввода — это либо активное окно, либо дочернее окно активного окна. Определить активное окно обычно достаточно просто. Если у активного окна имеется панель заголовка, то Windows выделяет ее. Если у активного окна вместо панели заголовка имеется рамка диалога (это наиболее часто встречается в окнах диалога), то Windows выделяет ее. Если активное окно минимизировано, то Windows выделяет текст заголовка в панели задач.
Если активное окно минимизировано, то окна с фокусом ввода нет. Windows продолжает слать программе сообщения клавиатуры, но эти сообщения выглядят иначе, чем сообщения, направленные активным и еще не минимизированным окнам.
Обрабатывая сообщения WM_SETFOCUS и WM_KILLFOCUS, оконная процедура может определить, когда окно имеет фокус ввода.WM_SETFOCUS показывает, что окно получило фокус ввода, а WM_KILLFOCUS, что окно потеряло его.
Мышь
Обработка сообщений от мыши
При вводе с помощью "мыши" Windows посылает прикладной программе сообщение от "мыши", когда пользователь перемещает курсор "мыши" (указатель) в/через окно или нажимает/освобождает кнопку "мыши", находясь в окне
Сообщение Описание
WM_MOUSEMOVE Пользователь перемещает курсор мыши в/через окно.
WM_LBUTTONDOWN Пользователь нажимает левую кнопку.
WM_LBUTTONUP Пользователь отпускает левую кнопку.
WM_LBUTTONDBLCLK Пользователь нажимает, отпускает и вновь нажимает левую кнопку (в рамках отпущенного системой времени).
WM_MBUTTONDOWN Пользователь нажимает среднюю кнопку.
WM_MBUTTONUP Пользователь отпускает среднюю кнопку.
WM_MBUTTONDBLCLK Пользователь нажимает, отпускает и вновь нажимает среднюю кнопку(в рамках отпущенного системой времени).
WM_RBUTTONDOWN Пользователь нажимает правую кнопку.
WM_RBUTTONUP Пользователь отпускает правую кнопку.
WM_RBUTTONDBLCLK Пользователь нажимает, отпускает вновь нажимает правую кнопку (в рамках отпущенного системой времени).
Координаты x,y
Параметр lParam содержит координаты x и y курсора мыши.
xPos = LOWORD(lParam);
yPos = HIWORD(lParam);
Таймер
Установка таймера
Информация от таймера поступает двумя способами:
- в виде сообщения WM_TIMER через очередь прикладной программы.
- от функции многократного вызова, которая определяется
при вызове функции SetTimer.
Ниже показано, как установить ввод от таймера, используя сообщение WM_TIMER, на пятисекундный интервал:
idTimer = SetTimer(hWnd, 1, 5000, (FARPROC) NULL);
В примере интервал таймера устанавливается равным 5000миллисекунд. Это означает, что таймер будет генерировать сообщение каждые 5 сек. Второй аргумент, если он не равен 0, используется вашей программой для идентификации таймера.
Последний аргумент равный NULL означает, что функция многократного вызова для обработки ввода от таймера отсутствует, так что Windows посылает сообщение ввода таймера через очередь прикладной программы.
Функция таймера
При установке таймера функцией SetTimer можно определить функцию, которая будет вызываться при каждом событии от таймера. Для этого последним параметром в SetTimer передается указатель на функцию обработчик. Если он есть, то просто происходит вызов функции, если нет, то общение происходит через очередь прикладной программы.
Снятие таймера
Снятие таймера осуществляется функцией:
KillTimer(hWnd, idTimer),
ГдеhWnd – handle окна
IdTimer – уникальный идентификатор удаляемого таймера.
После удаления перестают поступать события от таймера.
Модальное диалоговое окно
Большинство диалоговых окон имеет окно владельца (или чаще просто, владелец). При создании блока диалога, прикладная программа устанавливает владельца, при помощи определения дескриптора окна владельца. Windows использует владельца, чтобы регулировать позицию диалогового окна в Z-последовательности так, чтобы блок диалога всегда устанавливался выше своего владельца. Windows также может посылать сообщения оконной процедуре владельца, уведомляя его о событиях в диалоговом окне.
Windows автоматически скрывает или уничтожает диалоговое окно всякий раз, когда его владелец скрывается или разрушается. Это означает, что процедура диалогового окна не требует какой-либо специальной обработки, чтобы обнаружить изменения в состоянии окна владельца.
Модальное диалоговое окно должно быть выскакивающим окном, имеющим Системное меню, строку заголовка, и жирную рамку; то есть, шаблон блока диалога должен установить стили WS_POPUP, WS_SYSMENU, WS_CAPTION и DS_MODALFRAME. Хотя прикладная программа может определять и стиль WS_VISIBLE, Windows всегда показывает модальное диалоговое окно независимо от того, устанавливает ли шаблон диалогового окна стиль WS_VISIBLE. Приложение не должно создавать модальное диалоговое окно, имеющее стиль WS_CHILD. Модальный блок диалога с этим стилем отключает сам себя, не допуская какого-либо последующего ввода данных из связанной с ним прикладной программы.
Прикладная программа создает модальное диалоговое окно, используя или функцию DialogBox или DialogBoxIndirect. DialogBox требует названия или идентификатора ресурса, содержащего шаблон блока диалога; DialogBoxIndirect требует дескриптора объекта памяти, содержащего шаблон диалогового окна.
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
Немодальное диалоговое окно
Немодальные диалоговые окна должны быть выскакивающими окнами, у которых есть Системное меню, строка заголовка и тонкая рамка; то есть, шаблон блока диалога должен установить стили WS_POPUP, WS_CAPTION, WS_BORDER и WS_SYSMENU. Windows автоматически не показывает диалоговое окно, если в шаблоне не установлен стиль WS_VISIBLE.
Прикладная программа создает немодальное диалоговое окно, используя функции или CreateDialog, или CreateDialogIndirect. CreateDialog требует названия или идентификатора ресурса, содержащего шаблон блока диалога; CreateDialogIndirect требует дескриптора объекта памяти, содержащего шаблон диалогового окна. Две другие функции, CreateDialogParam и CreateDialogIndirectParam, тоже создают немодальное диалоговое окно; функции, когда окно создается, посылают заданный параметр в процедуру блока диалога.
CreateDialog(hInst,(LPCTSTR)IDD_NOMODAL,hWnd,(DLGPROC)NoModal);
Процедура диалогового окна
Процедура диалогового окна подобна оконной процедуре, в которую Windows посылает сообщения, чтобы процедура, когда она имеет информацию, задала или завершила задачи. В отличие от оконной процедуры, процедура диалогового окна никогда не вызывает функцию DefWindowProc. Вместо этого, она возвращает Булево значение ИСТИНА (TRUE), если она обрабатывает сообщение или ЛОЖЬ(FALSE), если она этого не делает.
Большинство процедур диалогового окна обрабатывает сообщение WM_INITDIALOG и сообщения WM_COMMAND, передаваемые элементом управления, но обрабатывает немногие, если имеются какие-либо другие сообщения. Если процедура диалогового окна не обрабатывает сообщение, она должна возвратить значение ЛОЖЬ(FALSE), чтобы заставить Windows обработать сообщения внутри себя. Единственное исключение из этого правила - сообщение WM_INITDIALOG. Процедура диалогового окна должна возвратить значение ИСТИНА (TRUE), чтобы направить в Windows сообщение WM_INITDIALOG для дальнейшей обработки. В любом случае, процедура не должна вызвать DefWindowProc.
Дампфайлов
Рис 1 – двоичный файл в шестнадцатеричном виде
Рис 2 – текстовый файл в текстовом режиме
Рис 3 – текстовый файл в шестнадцатеричном виде
Литература
1. Д.Рихтер Создание эффективных Win32 приложений.
2. П. В. Румянцев Азбука программирования в WIN 32 API.
3. Ч. Петзолд. Программирование для Windows 95. Том 1.
4. Архипова Е.Н. Электронный курс по WIN 32 API.
СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
Лабораторный практикум дисциплины для специальностей
1 40 01 01 “Программное обеспечение информационных технологий”
(специализации 1 40 01 01 05 «Моделирование и компьютерное
проектирование программно-аппаратных комплексов”)
1 40 01 02 “Информационные системы и технологии”
(направление 1 40 01 02 04 «Компьютерные системы и технологии
(обработка и представление информации)”
на 2017-2018 учебный год
практикум составлен
преподавателем кафедры
на основе базовой программы дисциплины
“Системное программное обеспечение”, утвержденной “____”___________ г.
Белорусским государственным техническим университетом
Регистрационный № ____
Минск
СОДЕРЖАНИЕ
ЦЕЛЬ ИЗУЧЕНИЯ ДИСЦИПЛИНЫ... 3
Часть 1 4
Лабораторная работа № 1 Простейшее приложение на базе WIN32 API 4
Цель работы.. 4
Постановка задачи. 4
Теоретические сведения. 5