- •История Windows
- •Windows 1.0
- •Windows 1.3
- •Windows 2.0
- •Windows 3.0
- •Windows 3.1
- •Windows for Workgroups версии 3.11
- •Windows NT
- •Windows 95
- •Windows NT Workstation 4.0 и Windows NT Server 4.0
- •Windows NT 4.0 Server Enterprise Edition
- •Windows 98
- •Windows 98 Second Edition (SE)
- •Windows 2000
- •Windows 98 Millenium Edition (ME)
- •Windows XP
- •Общая архитектура WINDOWS приложения.
- •Каркас приложения
- •Регистрация класса окна
- •Создание окна.
- •Отображение окна.
- •Цикл обработки очереди сообщений.
- •WndProc
- •Обработка сообщений типового приложения.
- •Контрольные вопросы
- •Сообщения
- •Типы сообщений
- •Обработка клавиатурных сообщений
- •Обработка сообщений от мыши
- •Сообщения таймера
- •Контрольные вопросы
- •Организация ввода
- •Разупорядоченный ввод
- •Разделение потоками виртуальных очередей ввода
- •Локальное состояние ввода
- •Ввод с клавиатуры и фокус
- •Управление курсором мыши
- •Контрольные вопросы
- •Окна
- •Окна Windows
- •Иерархия окон
- •Оконная процедура, стандартные оконные процедуры
- •Стиль класса окна
- •Стили окон, окна основных стилей
- •Перекрывающиеся окна
- •Временные окна
- •Дочерние окна
- •Сообщения управления окнами
- •Окна с полосами прокрутки
- •Системные метрики
- •Определение размера окна
- •Определение расположения окна
- •Контрольные вопросы
- •Графический интерфейс устройств(GDI).
- •Создание (получение) контекста устройств.
- •Сохранение контекста устройства.
- •Прямые (отрезки) и кривые
- •Закрашенные области
- •Битовые шаблоны (растровые шаблоны, растровые образы)
- •Текст и шрифты
- •Режимы масштабирования и преобразования
- •Метафайл
- •Регионы
- •Путь
- •Палитры
- •Контрольные вопросы
- •Объекты ядра
- •Что такое объект ядра
- •Учет пользователей объектов ядра
- •Защита
- •Таблица описателей объектов ядра
- •Создание объекта ядра
- •Закрытие объекта ядра
- •Синхронизация объектов
- •Именованные объекты
- •Дублирование описателей объектов
- •Изменение флагов описателя
- •Синхронизация потоков
- •Критическая секция
- •Мьютексы
- •Семафоры
- •События
- •Ожидаемые таймеры
- •Контрольные вопросы
- •Ресурсы Windows приложения
- •Файлы ресурсов приложения
- •Значки (пиктограммы)
- •Курсоры
- •Битовые образы
- •Символьные строки
- •Ресурсы, определяемые пользователем
- •Таблица акселераторов
- •Меню
- •Диалоговые окна
- •Контрольные вопросы
- •Элементы управления
- •Дочерние окна управления
- •Создание дочерних окон
- •Сообщения дочерних окон родительскому окну
- •Сообщения родительского окна дочерним окнам
- •Дочерние окна и фокус ввода
- •Дочерние окна управления и цвет
- •Кнопки различных стилей (класс BUTTON)
- •Нажимаемые кнопки
- •Флажки-переключатели
- •Переключатели
- •Окна групп
- •Кнопки, определяемые пользователем
- •Статические поля (класс static)
- •Текстовые редакторы (класс edit)
- •Списки разных стилей (класс listbox)
- •Комбинированные списки (класс combobox)
- •Полосы прокрутки (класс scrollbar)
- •Контрольные вопросы
- •Расширенные элементы управления
- •Основы общих элементов управления
- •Инициализация библиотеки элементов общего пользования
- •Создание элементов управления общего пользования
- •Посылка сообщений общим элементам управления
- •Уведомляющие сообщения от общих элементов управления
- •Контрольные вопросы
- •Стандартные диалоговые окна.
- •Окна сообщений
- •Диалоговые окна общего пользования
- •Контрольные вопросы
- •Динамически подключаемые библиотеки
- •Создание DLL
- •Проецирование DLL на адресное пространство процесса
- •Функция входа/выхода
- •Функция DllMain и стандартная библиотека С
- •Функция LibEntry
- •Функция LibMain
- •Функция WEP
- •Экспорт функций и переменных из DLL
- •Импорт функций и переменных из DLL
- •Заголовочный файл DLL
- •Разделы в ЕХЕ- и DLL-файлах
- •Контрольные вопросы
- •Файлы, проецируемые в память
- •Контрольные вопросы
- •Классы, определяющие архитектуру приложения
- •Классы приложения и поддержки потоков
- •Классы приложения и потоков
- •Классы фреймов окон
- •Получение информации о приложении
- •Соглашения об именах MFC
- •Включаемые файлы
- •Функция WinMain
- •Класс CWinApp
- •Класс CWnd
- •Класс CFrameWnd
- •Создание главного окна SDI-приложения
- •Примечание
- •Создание главного окна SDI-приложения
- •Создание дочерних окон
- •Ограничение размеров окна
- •Ограничение доступа к окну
- •Создание многодокументных приложений
- •Класс CMDIChildWnd
- •MDI — пример приложения
- •Категории сообщений
- •Карта сообщений
- •Компоненты карты сообщений
- •Класс CCmdTarget
- •Стандартный маршрут команды
- •Команды обновления и класс CCmdlll
- •Функции для работы с сообщениями
- •Основные положения
- •Класс CDocTemplate
- •Класс CSingleDocTemplate
- •Роль фреймов в архитектуре "документ/представление"
- •Документ и его представления
- •Документы
- •Класс CDocument
- •Класс CArchive
- •Представления
- •Класс CView
- •Панели элементов управления
- •Класс CStatusBar
- •Класс CStatusBarCtrl
- •Класс CDialogBar
- •ControlBars — пример приложения
- •НЕКОТОРЫЕ КЛАССЫ MFC
- •Класс CObject - основной класс MFC
- •Конструкторы класса
- •Оператор присваивания
- •Диагностика
- •Проверка целостности объектов класса
- •Получение дампа объекта класса
- •Сохранение и восстановление состояния объекта
- •Метод IsSerializable
- •Виртуальный метод Serialize
- •Информация о классе
- •Виртуальный метод GetRuntimeClass
- •Метод IsKindOf
- •Класс CPoint - точка на плоскости
- •Класс CSize - относительные координаты
- •Класс CString - текстовые строки
- •Конструктор класса
- •Коллекции
- •Массивы - шаблон CArray
- •Списки - шаблон CList
- •Словари - шаблон CMap
- •Класс CTime - дата и время
- •Файловая система - класс CFile
- •Открытие и создание файлов
- •Идентификатор открытого файла
- •Закрытие файлов
- •Чтение и запись файлов
- •Метод Flush
- •Операции с файлами
- •Блокировка
- •Позиционирование
- •Характеристики открытого файла
- •Файловая система - классы CMemFile и CStdioFile
- •Модификация класса CMemFile
- •Файловая система - класс CStdioFile
- •Запись и восстановление объектов
- •Запись в архивный файл
- •Чтение из архивного файла
- •Исключения - класс CException
- •Класс CException
- •Класс CMemoryException
- •Класс CFileException
- •Приложение Except
- •Класс CArchiveException
- •Класс CNotSupportedException
- •Класс CResourceException
- •Класс CUserException
Контрольные вопросы
1.Что такое объект ядра? Чему он принадлежит?
2.Чем можно защищать объект ядра?
3.Что создает система при инициализации процесса?
4.Какие функции создают объекты ядра? Что они возвращают?
5.Объясните принцип работы функции CloseHandle.
6.В каком случае применимо наследование описателей объектов? Какие операции при этом должен выполнять родительский процесс? Что нужно для создания наследуемого описателя?
7.Какой еще способ, позволяет нескольким процессам совместно использовать одни и те же объекты ядра? Для чего эти объекты применяются?
8.Расскажите про функцию DuplicateHandle? В чем заключается ее принцип?
9.Какой функцией модифицируется флаг наследования? Для чего это нужно?
10.Каким образом поток синхронизирует себя с другим?
11.Что такое критическая секция? Как она создается? Где применяется?
12.Что такое мьютекс? Чем он отличается от других объектов?
13.Что такое семафор? Назовите основные функции работы с ним?
14.Что такое событие? Основные функции работы с ним?
15.Что такое ожидаемый таймер? Основные функции работы с ним?
Ресурсы Windows приложения
Файлы ресурсов приложения
Файлы ресурсов представляют собой одну из самых характерных особенностей программирования в Windows.
Использование: С помощью файлов ресурсов большинство приложений определяют визуальные элементы своего пользовательского интерфейса: меню, диалоговые окна, надписи, растровые изображения и другие типы ресурсов
Создание: Файлы ресурсов (rc-файлы) создаются в виде текстового файла (этот файл можно создать как текстовым редактором, так и специальным редактором ресурсов) и компилируются компилятором ресурсов.
Полученный в результате двоичный файл (res-файл):
•компонуется с оставшимися частями приложения, образуя единый двоичный образ, содержащий выполняемый программный код и информацию о ресурсах.
•могут сводиться в отдельную библиотеку DLL. Преимущество этого подхода заключается в том, что при изменении файла ресурсов не требуется перекомпилировать все приложение, а нужно только заменить DLL.
На финальном этапе сборки загрузочного модуля компилятор ресурсов вызывается еще раз для записи ресурсов в загрузочный модуль. Также он формирует специальную таблицу ресурсов, расположенную в заголовке exe-файла. Таблица используется Windows для поиска и загрузки ресурсов в оперативную память. Ресурсы являются данными, и они
хранятся в exe-файле программы, но расположены они не в области данных, где обычно хранятся данные исполняемых программ.
Компоненты файла ресурсов
Оператор файла ресурсов состоит из идентификатора, который может быть или текстовой строкой, или числовым значением, за которым следует сам оператор.
Оператор может состоять
•из одной строки – однострочный, определяющий растровые изображения
(BITMAP), курсоры (CURSOR), шрифты (FONT), пиктограммы (ICON), язык ресурсов (LANGUGE).
состоит из следующих частей:
Идентификатор Тип_ресурса [Характеристика_загрузки] Имя_файла_ресурса
•из многих строк - многострочный, определяющие диалоговые окна (DIALOG), таблицы строк (STRINGTABLE), таблицы акселераторов (ACCELERATORS), меню (MENU), пользовательские данные (RCDATA) и ресурсы информации о версии.
состоит из следующих частей:
Идентификатор ОПЕРАТОР [Необязательные_параметры] [Необязательные_инструкции]
BEGIN [Инструкции] END
Рисунок 1
Значки (пиктограммы)
Значок (icon) - это графическое изображение небольшого размера, состоящее из отдельных пикселов (32x32).
Использование: для обозначения свернутого окна приложения, они отображаются в левом верхнем углу заголовка окна (размером 16х16, из “большого” изображения исключается каждый второй столбец и строка).
Создание: с помощью редактора изображений можно нарисовать значки и использовать их в приложениях. Хранятся в файлах с расширением имени *.ico
Включение в файл описания ресурсов: оператор ICON MyIcon ICON iconfile.ico
Получение дескриптора: используется функция LoadIcon.
Способы загрузки значков, определенных в ресурсах приложения:
•связь между именем пиктограммы в описании ресурсов и в вызове функции
LoadIcon:
Описание ресурсов: MyIcon ICON iconfile.ico
Текст программы: HICON hIcon=LoadIcon(hInst,”MyIcon”);
•вместо имени можно также использовать число– это идентификатор значка:
Описание ресурсов: 125 ICON iconfile.ico
Текст программы: HICON hIcon=LoadIcon(hInst,
MAKEINTRESOURCE(125));
•использование предопределённых значков:
Заголовочный файл: #define IDI_APPLICATION MAKEINTRESOURCE (32512)
Текст программы: HICON hIcon=LoadIcon(NULL, IDI_APPLICATION);
•комбинация метода, использующего текстовую строку, и метода, использующего число
Описание ресурсов: 125 ICON iconfile.ico
Текст программы: HICON hIcon=LoadIcon(hInst,”#125”);
•используется макроопределение, которое должно включаться и в файл описания ресурсов, и в исходный текст программы:
Заголовочный файл: #define MyIcon 125
Описание ресурсов: MyIcon ICON iconfile.ico Текст программы: HICON hIcon=LoadIcon(hInst,
MAKEINTRESOURCE(MyIcon));
!Использование идентификаторов вместо имен значков уменьшает размер exe-файла, и вероятно, немного ускоряет работу функции LoadIcon.
Дескриптор, выдаваемый функцией LoadIcon, можно присвоить полю значка структуры класса при регистрации класса окна hWnd, тогда окно hWnd будет иметь именно этот значок:
wndclass.hIcon=LoadIcon(hInst,”MyIcon”);
Замена действующего значка значком "myicon": SetClassLong(hWnd,GCL_HICON,LoadIcon(hInst,”AnotherIcon”));
После того, как вы приложение загрузило значок, его можно также нарисовать в любом месте экрана функцией DrawIcon.
DrawIcon (hdc, x, y, hIcon);
Удаление значка: функцию DestroyIcon.
Курсоры
Курсор мыши представляет собой не что иное, как упрощенный вариант битового изображения, аналогично значку.
Использование: выводит на экран собственный курсор, когда мышь оказывается в рабочей области окна программы.
Создание: с помощью редактора изображений можно нарисовать значки и использовать их в приложениях. Хранятся в файлах с расширением имени *.cur
Включение в файл описания ресурсов: оператор CURSOR MyCursor CURSOR cursfile.cur
Получение дескриптора: используется функция LoadCursor.
Способы загрузки курсоров, определенных в ресурсах приложения:
аналогично, как и для значков:
Описание ресурсов: MyCursor CURSOR cursfile.cur
Текст программы: HCURSOR hCursor=LoadCursor(hInst,”MyCursor”);
Другие способы, показанные для значков (использование идентификаторов и MAKEINTRESOURCE), также работают и для курсоров. В заголовочные файлы Windows включается определение typedef HCURSOR, которое используется для хранения описателя курсора.
Дескриптор курсора мыши, полученный при вызове функции LoadCursor, используется для задания поля курсора структуры класса при регистрации класса окна. Это заставляет курсор мыши, если он оказывается в рабочей области окна, превращаться в пользовательский курсор:
wndclass.hCursor= LoadCursor(hInst,"MyCursor”);
Заменена действующего курсора другим курсором: SetClassLong(hWnd,GCL_HCURSOR,LoadCursor(hInst,”AnotherCursor”));
!Для динамического изменения формы курсора следует использовать функцию SetCursor, используя в качестве параметра дескриптор нового курсора, подготовленный при помощи функции LoadCursor.
Выключение\включение изображение курсора - используются функция ShowCursor.
Операционная оболочка Windows содержит несколько встроенных курсоров. Их идентификаторы описаны в файле windows.h и начинаются с префикса IDC_.
•Для загрузки встроенных курсоров также используется функция LoadCursor, но в качестве первого параметра ей передается NULL:
LoadCursor(NULL,IDC_ARROW);
Удаление курсора: при помощи функции DestroyCursor.
