
- •Министерство образования и науки Российской Федерации
- •Лекция 1. Введение.
- •Лекция 2. Структура подсистемы обмена с ву
- •Лекция 3. Регистры ву
- •3.1. Виды регистров внешних устройств
- •3.2. Виды адресации регистров ву
- •Лекция 4. Алгоритм обмена без прерываний
- •37Bh – не используется
- •Лекция 5. Прерывания
- •5.1. Механизм прерываний
- •5.2. Таблица векторов прерываний
- •Лекция 6. Изменения установок обработки прерываний
- •6.1. Маскирование прерываний
- •6.2. Изменение таблицы векторов прерываний
- •6.3. Обработчики прерываний
- •Лекция 7. Аппаратные прерывания
- •Лекция 8. Дисковые системы (Часть 1) Организация магнитного диска
- •Лекция 9. Дисковые системы (Часть 2) Функции bios для работы с дисками
- •Инициализация контроллера нмд
- •Лекция 10. Файловые системы (Часть 1)
- •Организация логического диска
- •Лекция 11. Файловые системы (Часть 2)
- •Файловые системы Windows
- •Лекция 12. Файловая системаntfs Главная файловая таблица
- •Последовательность обновления
- •Атрибуты
- •Типы атрибутов
- •Лекция 13. Атрибуты ntfs
- •Списки отрезков
- •Лекция 14. Анализ и восстановление файловой системы
- •Лекция 15. Управление памятью
- •Типы адресов
- •Методы распределения памяти без использования дискового пространства
- •Лекция 16. Виртуальная память
- •Лекция 17. Виртуальная память (продолжение)
- •Лекция 18. Иерархия запоминающих устройств
- •Лекция 19. Управление вычислительными процессами
- •Вытесняющие и невытесняющие алгоритмы планирования
- •Лекция 20. Синхронизация и взаимодействие процессов
- •V(b); /* Выход из критической секции */
- •Лекция 21. Архитектура драйвера файловой системы
- •Локальные fsd
- •Удаленные fsd
- •Работа файловой системы
- •Явный файловый ввод-вывод
- •Подсистема отложенной записи
- •Поток, выполняющий опережающее чтение
- •Драйверы фильтров файловой системы
- •Лекция 22. Windows api
- •Windows api— набор функций операционной системы
- •Лекция 23. WindowsApi(продолжение)
- •Окно рабочего стола
- •Приложение Windows
- •Компоненты окна приложения
- •Создание окна
- •Атрибуты окна
- •Класс окна
- •Имя окна
- •Стиль окна
- •Родитель или владелец окна
- •Расположение, размер и позиция в z-порядке
- •Идентификатор дочернего окна или дескриптор меню
- •Дескриптор копии приложения
- •Дополнительные данные
- •Дескрипторы окна
- •Создание главного окна
- •Сообщения, посылаемые при создании окна
- •Многопоточные приложения
- •Общие стили окна
- •Позиционирование
- •Взаимоотношения с родительским окном
- •Рамка окна
- •Компоненты неклиентской области окна
- •Заблокированное окно
- •Окна переднего плана и фоновые окна
- •Активное окно
- •Видимость
- •Свернутые, развернутые и восстановленные окна
- •Размер и позиция окна
- •Размер окна
- •Позиция окна
- •Размер и позиция по умолчанию
- •Системные команды
- •Сообщения, связанные с размером и позицией окна
- •Уничтожение окна
- •Как создать главное окно
- •Работа с дочерними окнами
- •Как уничтожить окно
- •Лекция 24. Ловушки сообщений (Хуки)
- •Лекция 25. Трансляция с языков программирования Сущность трансляции. Компиляция и интерпретация
- •Фазы трансляции и выполнения программы
- •Препроцессор
- •Трансляция и ее фазы
- •Модульное программирование, компоновка
- •Структура транслятора
Работа с дочерними окнами
Вы можете разделить клиентскую область окна на различные функциональные области с помощью дочерних окон. Создание дочернего окна напоминает создание главного окна: Вы должны использовать функцию CreateWindowEx(). Чтобы создать окно определенного приложением класса окна (application-defined window class), Вы должны зарегистрировать класс окна и указать функцию окна перед созданием самого дочернего окна. Для дочернего окна Вы должны задать стиль WS_CHILD. Кроме того, при создании дочернего окна для него необходимо указать родительское окно.
В приведенном ниже примере клиентская область главного окна приложения делится на три функциональных области путем создания трех дочерних окон одинакового размера. Каждое дочернее окно имеет ту же высоту, что и клиентская область главного окна, но занимает только третью часть его ширины. Главное окно создает дочерние окна при получении сообщения WM_CREATE (которое оно получает в процессе своего собственного создания). Поскольку каждое дочернее окно имеет стиль WS_BORDER, его граница представляет собой тонкую линию. Кроме того, поскольку не определен стиль WS_VISIBLE, каждое дочернее окно изначально является скрытым. Также обратите внимание, что каждому дочернему окну назначается собственный идентификатор.
Главное окно изменяет размеры и расположение дочерних окон при получении сообщения WM_SIZE (главное окно получает это сообщение, когда изменяется его собственный размер). При этом главное окно получает размеры своей клиентской области, используя функцию GetWindowRect(), и затем передает их функции EnumChildWindows(). EnumChildWindows(), в свою очередь, передает дескриптор каждого дочернего окна определенной приложением функции обратного вызова EnumChildProc(). Эта функция изменяет размеры и расположение каждого дочернего окна, вызывая функцию MoveWindow(). Производимые изменения зависят от размеров клиентской области главного окна и идентификатора дочернего окна. В заключение EnumChildProc() вызывает функцию ShowWindow(), чтобы сделать окно видимым.
#define ID_FIRSTCHILD 100 #define ID_SECONDCHILD 101 #define ID_THIRDCHILD 102
LONG APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam) HWND hwnd; UINT uMsg; UINT wParam; LONG lParam; { RECT rcClient; int i; switch(uMsg) { case WM_CREATE: // creating main window // Create three invisible child windows. for (i = 0; i < 3; i++) CreateWindowEx(0, "ChildWClass", (LPCTSTR) NULL, WS_CHILD | WS_BORDER, 0,0,0,0, hwnd, (HMENU) (int) (ID_FIRSTCHILD + i), hinst, NULL); return 0;
case WM_SIZE: // main window changed size // Get the dimensions of the main window's client // area, and enumerate the child windows. Pass the // dimensions to the child windows during enumeration. GetClientRect(hwnd, &rcClient); EnumChildWindows(hwnd, EnumChildProc, (LPARAM) &rcClient); return 0; // Process other messages. // ... } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
BOOL CALLBACK EnumChildProc(hwndChild, lParam) HWND hwndChild; LPARAM lParam; { LPRECT rcParent; int i, idChild;
// Retrieve the child-window identifier. Use it to set the // position of the child window. idChild = GetWindowLong(hwndChild, GWL_ID); if (idChild == ID_FIRSTCHILD) i = 0; else if (idChild == ID_SECONDCHILD) i = 1; else i = 2;
// Size and position the child window. rcParent = (LPRECT) lParam; MoveWindow(hwndChild, (rcParent->right / 3) * i, 0, rcParent->right / 3, rcParent->bottom, TRUE);
// Make sure the child window is visible. ShowWindow(hwndChild, SW_SHOW); return TRUE; }