
- •Лабораторный практикум «Основы разработки приложений Windows» Книга 2
- •Часть 1. Теоретические сведения4
- •Часть 2. Лабораторный практикум73
- •Часть 1 Теоретические сведения
- •1. Основы архитектурЫ защищенного режима Регистры процессора
- •Адресация памяти
- •2. Логические шрифты Создание логических шрифтов
- •Вывод на экран текстовых строк
- •3. Таймеры Windows Организация и обслуживание таймеров
- •Мультимедийные таймеры
- •Измерение интервалов времени
- •Организация периодического процесса
- •Задание однократного интервала времени
- •4. Дочерние окна Создание и использование дочерних окон
- •Окна предопределенных классов в главном окне
- •5. Вывод растровых изображений
- •Процедура вывода растрового изображения
- •Компоновка составных изображений
- •6. Обслуживание файлов в 32-разрядных приложениях Windows
- •Базовые операции с файлами Открытие и создание файла
- •Запись и чтение файла
- •Файлы, проецируемые в память
- •7. Процессы и потоки
- •Создание дочернего процесса
- •Создание дочернего потока
- •Синхронизация потоков Общие характеристики объектов Windows
- •Синхронизация с помощью состояний потока
- •Синхронизация с помощью событий
- •Критические секции и защита данных
- •8. Библиотеки динамической компоновки
- •Часть 2 Лабораторный практикум Работы лабораторного практикума Работа 1. Создание логических шрифтов
- •Работа 2. Таймеры Windows(индивидуальное задание а)
- •Работа 3. Дочернее окно в главном окне приложения
- •Работа 4. Вывод растровых изображений с использованием совместимой памяти
- •Работа 5. Измерение временных характеристик программы с помощью мультимедийного таймера
- •Работа 6. Вывод движущихся изображений с синхронизацией от системного таймера (индивидуальное задание b)
- •Работа 7. Повышение качества движущихся изображений с помощью совместимой памяти
- •Работа 8. Движение изображения по фоновому рисунку
- •Работа 9. Работа с файлами (индивидуальное задание c)
- •Работа 10. Стандартные диалоги Windows для работы с файлами
- •Работа 11. Проецирование файла в память
- •Работа 12. Потоки (индивидуальное задание d)
- •Работа 13. Синхронизация потоков с помощью событий
- •Работа 14. Защита данных с помощью критической секции
- •Работа 15. Библиотеки динамической компоновки
- •Работа 16. Передача параметров в функции dll-библиотек
- •Индивидуальные задания лабораторного практикума
- •Задание c2.Массив записываемых в файл данных должен представлять собой последовательный ряд из 2000 целых четных чисел.
- •Лабораторный практикум «Основы разработки приложений Windows» Книга 2
Окна предопределенных классов в главном окне
До сих пор мы сталкивались с такими формами приложений Windows:
приложение с главным окном;
приложение без главного окна на основе модального диалога;
приложение с главным окном и вложенным диалоговым окном (модальным или немодальным);
приложение с главным окном и вложенными дочерними окнами.
В действительности в рамках главного окна приложения можно иметь не только вложенные дочерние или всплывающие окна, созданные в программе, но и любые окна предопределенных в Windows классов – кнопки, списки, статические элементы с текстом и др. Таким образом, рассмотренные нами ранее элементы управления необязательно должны быть элементами диалога; с таким же успехом их можно использовать в составе главного окна приложения или любых вложенных окон. На рис. 4.1 были показаны два окна такого рода – окно для ввода текста, в данном случае числа, задающего время экспозиции, и обычная кнопка “Пуск”.
Для создания окон предопределенных классов так же, как и любых других, используется функция CreateWindow(). Так, окна, показанные на рис. 4.1, созданы следующим образом:
HWND hwndEdit=CreateWindow("EDIT",NULL,
WS_CHILD|WS_VISIBLE|WS_BORDER|ES_NUMBER,
162,10,45,20, hwnd, NULL, hInst, NULL);
HWND hwndBtn= CreateWindow("BUTTON","Пуск",
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
162,40,45,35, (HMENU)ID_GO, NULL, hInst, NULL);
В качестве класса окна указывается один из предопределенных классов (“EDIT”, “BUTTON”, “LISTBOX” и т. д.). В составную константу, определяющую стиль окна, могут входить как константы общего назначения (WS_CHILD,WS_VISIBLE,WS_BORDER), так и характерные только для окон данного класса. Так, константаES_NUMBERразрешает ввод в окно редактирования только десятичных цифр, а константаBS_PUSHBUTTONопределяет внешний вид и функциональное назначение кнопки (“нажимаемая” кнопка).
Обычно элементам управления (кнопкам, спискам и проч.) присваивают идентификаторы – произвольные символические константы. Идентификаторы удобны тем, что при поступлении в окно приложения сообщения WM_COMMAND, возникшего в результате воздействия пользователя на тот или иной элемент управления, среди параметров этого сообщения передается и идентификатор активизированного элемента. Выполняя с помощью конструкцииswitch-caseанализ этого параметра, программа определяет, на какой конкретно элемент управления воздействовал пользователь. Если, например, в диалоговом окне имеются две кнопки с идентификаторамиBTN_1иBTN_2, то функцияOnCommand()будет выглядеть так:
void OnCommand(HWND hwnd,int id,HWND,UINT){
switch(id){
case BTN_1:
...//Действия при нажатии на кнопку с идентификатором BTN_1
break;
case BTN_2:
...//Действия при нажатии на кнопку с идентификатором BTN_2
break;
...//И т. д.
Если элементы управления входят в состав диалогового окна, то идентификаторы назначаются им в предложениях файла ресурсов:
CONTROL "Пуск", BTN_1, "BUTTON", BS_PUSHBUTTON, 27,32,43,12
Если, однако, элемент управления создается непосредственно в программе, как дочернее окно предопределенного класса, идентификатор должен быть назначен в процессе его создания. В этом случае идентификатор указывается в качестве восьмого по счету параметра функции CreateWindow()(см. приведенное выше предложение создания кнопки, которой назначается идентификаторID_GO). Однако согласно прототипу функцииCreateWindow()восьмой параметр должен иметь типаHMENU. Поэтому при подстановке в качестве этого параметра символического обозначения идентификатора его следует явным образом преобразовать в типHMENU, что и сделано в приведенном выше фрагменте.