![](/user_photo/1549_7W_y5.jpg)
- •История 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
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD36x1.jpg)
Окна
Окно в Windows можно определить как прямоугольную область на экране. Однако это определение в своей простоте скрывает множество функциональных возможностей под самой идеей окна как основной единицы взаимодействия пользователя и Windowsприложения.
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD36xi2.jpg)
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD36xi3.jpg)
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD36xi4.jpg)
Окна Windows
Окно – это не только область на экране, а еще и адресат событий и сообщений
всреде Windows.
•Окно идентифицируется по дескриптору окна. Этот дескриптор (переменная типа HWND) однозначно определяет каждое окно в системе. Список окон содержит окна приложений и диалоговых панелей, а также , такие, как рабочий стол, пиктограммы или кнопки.
•События пользовательского интерфейса объединяются с дескриптором соответствующего окна, образуя сообщение Windows, и посылаются в очередь приложения (т.е. в очередь потока), который владеет этим окном.
На базе одного класса окна приложение может создать несколько окон. Все эти окна могут быть сделаны в одном или нескольких стилях.
•Стиль окна определяет внешний вид окна и его поведение.
•Для класса окна также определяется понятие стиля - стиль класса определяет внешний вид и поведение всех окон, созданных на базе данного класса.
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD36xi8.jpg)
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD36xi9.jpg)
Иерархия окон
Windows организует свои окна в иерархическую структуру:
•Каждое окно имеет родителя, корнем дерева всех окон является окно рабочего стола, создаваемого Windows при загрузке.
•Для всех окон верхнего уровня (для главных окон приложений и других перекрывающихся и всплывающих окон приложений) родительским окном является рабочий стол.
•Родитель дочернего окна – окно верхнего уровня или другое дочернее окно,
более высокого уровня по иерархии.
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD37x1.jpg)
Между окнами верхнего уровня (перекрывающиеся и всплывающие окна) существует еще одна иерархическая связь. Владельцем окна верхнего уровня может быть другое окно того же уровня. Окно, имеющее владельца, всегда отображается поверх своего владельца и исчезает при минимизации окна-владельца.
•Типичным случаем владения одного окна верхнего уровня другим является приложение, отображающее диалоговое окно. Диалоговое окно не является дочерним окном (оно является всплывающим окном), но его владельцем остается окно приложения.
Рассмотрим несколько наиболее часто употребляемых функций, позволяющих приложению исследовать иерархию окон и находить определенные окна:
•GetDesktopWindow – позволяет приложению получить дескриптор окна рабочего стола.
•FindWindow – используется для поиска окна верхнего уровня по имени его класса окна или по заголовку окна.
•GetParent – идентифицирует родительское окно указанного окна.
•GetWindow – предоставляет наиболее гибкий способ с иерархией окон. В зависимости от значения второго параметра эту функцию можно использовать для получения идентификатора родительского окна, владельца, окон одного уровня или дочерних окон.
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD37xi4.jpg)
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD37xi5.jpg)
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD37xi6.jpg)
Оконная процедура, стандартные оконные процедуры
Каждое окно связано с классом окна. Класс окна – это класс, или предоставляемый Windows (заранее определенный класс), или определенный пользователем и зарегистрированный с помощью функции RegisterClass.
•Задача класса окна – определение характеристик и функциональных возможностей множества связанных с ним окон.
Наиболее примечательным, но, разумеется, не единственным свойством класса окна является оконная процедура. Именно через оконную процедуру реализуется поведение окна. Отвечая на различные сообщения, оконная процедура определяет реакцию окна на события мыши и клавиатуры и изменение его внешнего вида в соответствии с этими событиями.
Оконная процедура вызывается каждый раз, когда сообщение посылается окну с помощью функции SendMessage, и каждый раз, когда сообщение отправляется
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD38x1.jpg)
окну посредством функции DispatchMessage. Роль оконной процедуры заключается в обработке посланных и отправленных этому окну сообщений, при этом она может
пользоваться оконной процедурой по умолчанию для обработки не интересующих ее сообщений.
Windows поддерживает две оконные процедуры по умолчанию: DefWindowProc и DefDlgProc.
•Функция DefWindowProc реализует поведение по умолчанию типичного окна верхнего уровня.
•Функция DefDlgProc используется диалоговыми окнами, и кроме поведения по умолчанию окон верхнего уровня, она управляет переходом фокуса ввода
между элементами управления диалогового окна.
Кроме оконных процедур по умолчанию, Windows также поддерживает множество классов окон. Они реализуют такие элементы управления диалоговых окон,
как кнопки, поля ввода и другие. Такие классы называются системными
(предопределенными) классами.
Является ли класс поддерживаемым Windows или определенным приложением,
приложение может использовать любой существующий класс (системный или определенный приложением) для порождения нового класса и реализации его нового или измененного поведения. Для этого используются механизмы, называемые разбиением на субклассы (подклассы) или объединение в суперклассы.
Замечание. Следует только заметить, что
•Приложение не должно пытаться применить операцию разбиения на субклассы или объединения в суперклассы к окну, принадлежащему другому процессу.
•В Win32 изменения в системных классах влияют только на окна этого класса внутри одного приложения. Эти изменения никак не влияют на окна в других приложениях, потому что приложения Win32 запускаются в разных адресных пространствах; таким образом, они защищены друг от друга.
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD38xi6.jpg)
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD38xi7.jpg)
Стиль класса окна
Стиль класса окна определяется при регистрации класса окна с помощью функции RegisterClassEx, у которой имеется один параметр: указатель на структуру типа WNDCLASSEX. Структура WNDCLASSEX определяется в заголовочном файле Windows следующим образом:
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD39x1.jpg)
typedef struct tagWNDCLASSEX
{ |
|
UINT |
cbSize; //длина структуры |
UINT |
style; //стиль класса окна |
WNDPROC |
lpfnWndProc; //адрес оконной процедуры |
int |
cbClsExtra; //доп. пространство в структуре класса |
int |
cbWndExtra; // доп. пространство в структуре окна |
HINSTANCE hInstance; //описатель экземпляра программы |
|
HICON |
hIcon; // установка иконки |
HCURSOR |
hCursor; // загружает стандартный курсор |
HBRUSH |
hbrBackground; // цвет фона |
LPCSTR |
lpszMenuName; // меню класса окна |
LPCSTR |
lpszClassName; //имя класса окна |
HICON |
hIconSm; // установка иконки |
}
WNDCLASSEX;
Стиль класса окна задается в виде отдельных битов, для которых определены символические константы с префиксом CS_. Определенный в классе окна стиль класса
окна используется при создании всех окон на базе этого класса.
Чаще всего используются стиль
CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS. Как уже говорилось, если для класса заданы стили CS_HREDRAW и CS_VREDRAW, то при изменении размеров окна функция окна может получить сообщение WM_PAINT. В этом случае функция окна должна перерисовать часть окна или все окно.
Стиль CS_DBLCLKS используется при необходимости отслеживать двойные щелчки мышью. При этом в функцию окна посылаются сообщения
WM_LBUTTONDBLCLK и WM_RBUTTONDBLCLK. Если этот стиль не будет задан,
функция окна получит только идущие парами сообщения об одиночном нажатии клавиш мыши WM_LBUTTONDOWN и WM_RBUTTONDOWN.
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD39xi5.jpg)
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD39xi6.jpg)
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD39xi7.jpg)
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD39xi8.jpg)
Стили окон, окна основных стилей
Определенный в классе окна стиль класса окна используется при создании всех окон на базе этого класса. Для дальнейшего уточнения внешнего вида и поведения окна используется другая характеристика - стиль окна. Стиль окна указывается при создании окна функцией CreateWindow. Для определения стиля окна используются символические константы с префиксом WS_.
![](/html/1549/349/html_zF3yk3EBC5.yf3l/htmlconvd-KH3qLD40x1.jpg)
Создание окна
hwnd = CreateWindow (szAppName, //имя класса окна
"The Hello Program", |
//заголовок окна |
WS_OVERLAPPEDWINDOW, //стиль окна |
|
CW_USEDEFAULT, |
//начальное положение по x |
CW_USEDEFAULT, |
//начальное положение по y |
CW_USEDEFAULT, |
//начальный размер по x |
CW_USEDEFAULT, |
//начальный размер по y |
NULL, |
//описатель родительского окна |
NULL, |
//описатель меню окна |
hInstance, |
//описатель экземпляра программы |
NULL); |
//параметры создания |
Вызов CreateWindow возвращает описатель созданного окна. Этот описатель хранится в переменной hwnd, которая имеет тип HWND. У каждого окна в Windows имеется описатель.
К тому времени, когда функция CreateWindow возвращает управление программе, окно уже создано внутри Windows. Однако, на экране монитора оно еще не появилось. Необходимы еще два вызова. Первый из них: ShowWindow (hwnd, iCmdShow). Первым параметром является описатель только что созданного функцией CreateWindow окна. Вторым параметром является величина iCmdShow, передаваемая в качестве параметра функции WinMain. Он задает начальный вид окна на экране. Если iCmdShow имеет значение SW_SHOWNORMAL (т. е. 1), на экран выводится обычное окно. Если iCmdShow имеет значение SW_SHOWMINNOACTIVE (т. е. 7), то окно не выводится,
а на панели задач появляются его имя и иконка.
UpdateWindow (hwnd); вызывает перерисовку рабочей области.
Удаление окна. DestroyWindow(HWND hwnd);Функция посылает сообщение WM_DESTROY и удаляет фокус ввода.
Перемещение окна.
BOOL SetWindowPos ( HWND hWnd, // описатель окна HWND hWndInsertAfter, //описатель окна
int X, //новое положение по х int Y, // новое положение по у int cx, // новый размер по х int cy, // новый размер по у
UINT uFlags ); // флаг, отмечающий новые установки окна В случае успеха возвращает ненулевой результат. MoveWindow(HWND,int,int,int,int,bool);