
- •История 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

использует тот прочный фундамент, который заложила библиотека MFC, не добавляя ничего своего:
Какие же возможности предоставляет нам библиотека MFC в плане создания и работы с окнами? Если обратимся к иерархии классов MFC (рис. ), то вспомним, что все классы, имеющие какое-либо отношение к окнам, являются производными (прямо или косвенно) от единственного класса CWnd.
|
|
|
О |
|
|
|
|
|
|
|
к |
|
|
|
|
|
— |
|
|
|
— |
|
|
|
Фреймы |
|
|
Блокидиалога |
|
||
|
|
|
|
|
|
|
|
|
|
Панели |
|
|
|
|
|
|
|
элементов |
|
|
|
Представления |
|
|
|
управления |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Свойства и мастера |
|
|
|
Элементы |
|
|
|
|
|
|
|
управления |
|
|
|
|
|
Рис.. Иерархия оконных классов |
Этот класс, а также специальные производные от него классы, включая CFrameWnd, CMDIFrameWnd, CMDIChildWnd, CView и CDialog, имеющиеся в библиотеке, спроектированы
таким образом, чтобы сделать за нас большую часть обязательной, но рутинной работы с различными типами окон Windows. Но начать надо с рассмотрения возможностей базового класса.
Класс CWnd
Класс CWnd — это базовый класс для всех окон,созданных на базе библиотеки MFC. Помимо предоставления всем своим производным классам большогочисла функции для работы с окнами, этот классслужит для создания разнообразных дочерних окон. Начнем со знакомства с теми возможностями, которые заложены в него разработчиками.Из имеющихся членов этого класса для нас, на данном этапе знакомства, интерес представляет один:
HWND CWnd::m_hWnd -
дескриптор окна Windows, присоединенного к объекту класса CWnd. Это достаточно важный параметр, особенно для главного окна приложения, т. к. он позволяет библиотеке взять на себя всю работу для корректного завершения приложения, когда пользователь закрывает его главное окно.
Класс CWnd содержит практически все функции, необходимые для работы с окнами. Таких функций более двухсот1 и их можно разбить на несколько категорий, каждая из которых включает функции, направленные на решение определенного круга задач. Приведем список категорий с краткой характеристикой входящих в них функций:
G Конструктор. Создает объект класса без создания окна Windows.
3 Инициализация. В эту категорию входят функции: отвечающие за создание окна Windows (соответствующей ему внутренней структуры) и присоединение его к объекту класса, — Create и CreateEx; виртуальная функция PreCreateWindow, позволяющая зарегистрировать используемый по умолчанию класс окна "AfxWnd"; функции, позволяющие узнать текущий обычный или расширенный стиль окна — GetStyle и GetExStyle; функции, позволяющие присоединить или отсоединить окно Windows от объекта класса CWnd — Attach и Detach; функции для получения дескриптора окна Windows (GetSafeWnd), или указателя на объект по дескриптору (FromHandle и From Handle Permanent); функции для работы с подклассами окна —
PreSubclassWindow иSubclassWindow; а такженекоторыедругиефункции.
3Состояние окна. Сюда входят функции, позволяющие: определить (JsWindowEnable) или изменить (EnableWindow) доступ к окну; узнать или назначить активное окно (обычное —
GetActiveWnd и SetActiveWnd, окно переднего плана — GetForegroundWindow и SetForegroundWindow); получить или установить фокус ввода с клавиатуры (GetFocus и
SetFocus) или от мыши (GetCapture и SetCapture), а также дескриптор пиктограммы,
ассоциированной с окном (Get/con и Setlcon); модифицировать расширенный или обычный стили окна (ModifyStyle и ModifyStyleEx); получить указатель на объект "рабочего стола" Windows.
rj Изменение размеров и позиции окна. Включает две группы функций. Функции, служащие для определения или установки состояния окна: видимое/невидимое (Get Windov/Placement и Set Window Placement); свернуто (Islconic) или развернуто (IsZoomed). И, собственно, функции, позволяющие узнать или изменить размеры и/или позицию окна: MoveWindow — перемещение окна с изменением размеров; SetWindowPos — перемещение окна с изменением размеров и расположения относительно других окон; ArrangelconicWindows — упорядочить все свернутые дочерние окна; BringWindowToTop — делает окно старшим в Z-порядке; GetWindowRect
— определяет размеры всего окна; GetClientRect — определяет размеры рабочей области окна.
Q Доступ к окну. Из функций этой категории мы пока хотели бы отметить следующие: FindWindow
— позволяет определить существует ли в системе окно, заданное именем класса и именем окна (оба параметра являются необязательными), т. е. запущено ли приложение, имеющее искомое окно; CenterWindow — центрирует положение окна относительно его родителя. Кроме представленных, категория содержит еще большую группу функций, которые используются значительно реже и поэтому будут рассмотрены не все.
аОбновление-перерисовка. Из функций этой категории мы представим только наиболее часто используемые: UpdateWindov? — обновляет рабочую область, посылая сообщение WM_PAINT; Invalidate — задает область модификации для последующей перерисовки при обработке ближайшего сообщения WM_PAINT; ShowWindow — отображает окно на экране, режим отображения задается передаваемым параметром. Кроме вышеперечисленных, сюда же можно отнести группу функций для работы с контекстами устройств: BeginPaint, EndPaint, Print, PrintClient, GetDC, ReleaseDC и GetWindowDC, которые подробно будут описаны при обсуждении вывода в окна графической информации.
U Преобразование координат. Служат для взаимного преобразования рабочих и экранных координат текущего окна.
Q Работа с текстом. В эту категорию входят функции, которые позволяют установить или получить текст, ассоциированный с окном (SetWindowText и GetWindowText) и его длину
(GetWindowTextLenght), а также используемый шрифт (SetFont и GetFont).
Q Работа с сообщениями. Функции этой категории будут рассмотрены более подробно, т. к. они важны для понимания принципов работы всей системы Windows и ваших приложений в частности.
Оставшиеся категории функций имеют достаточно специфическую направленность и будут обсуждаться в соответствующих разделах книги. К нимотносятся следующие категории:
функции для работы с полосами прокрутки, каретками, элементами блока диалога, меню, таймерами, всплывающими подсказками, а также функции для работы с буфером обмена и обработчики сообщений.
Класс CWnd служит для выполнения двух основных целей: предоставление интерфейса всем другим оконным классам библиотеки MFC и создание дочерних окон Windows. В связи с этим мы ограничились здесь простым перечислением основных реализованных в классе функций. Многие из них мы рассмотрим при обсуждении конкретных примеров программ, а полный список функций этого класса приведен в приложении 2.
Класс CFrameWnd
В отличии от своего базового класса CFrameWnd cлужит Для создания перекрывающихся или всплы-Цииии^и^иииив! вающих окон и поддерживает однодокументный интерфейс Windows (SDI). С этим классом (и производными от него) тесно связано понятие фрейма (frame window). Под ним понимается окно, которое координирует взаимодействие приложения с документом и его представлением.1 Оно отражается на экране в виде рамки, ограничивающей представление, с необязательной строкой состояния и стандартными элементами управления окном. Это окно отвечает за управление размещением своих дочерних окон и других элементов рабочей области. Кроме того, фрейм переадресует команды своим представлениям и может отвечать на извещения от элементов управления окна.
Этот класс спроектирован таким образом, чтобы взять на себя задачу выполнения всех основных функций приложения Windows на базе интерфейса SDI:
О передает команды и многие общие извещения в активное текущее представление,
О! управляет размещением панелей элементов управления, представлений и других дочерних окон внутри своей рабочей области. Во время цикла ожидания обновляет панель инструментов и кнопки панелей элементов управления. Кроме того, имеется обработка команд по умолчанию для показа или скрытия панели инструментов и строки состояния,
G управляет полосой основного меню. Когда изображается раскрывающееся меню, фрейм использует механизм UPDATE_COMMAND_UI для установки элементов меню в состояние "доступен", "заблокирован" или "помечен", а также для добавления и удаления элементов.
Когда пользователь выбирает элемент меню, фрейм обновляет строку состояния, выводя туда соответствующее заданное сообщение,
Оимеет возможность использовать специальную таблицу назначений клавиш (accelerator table), которая автоматически транслирует комбинации клавиш в команды.
Оимеет необязательный идентификатор справки, который используется для контекстнозависимой справочной системы. Управляет самим механизмом контекстно-зависимой справочной системы (вызов комбинацией клавиш <Shift>+<Fl>) и режимом предварительного просмотра перед печатью,
ГД поддерживает выполнение операций drag-and-drop для работы файлами. На перенос зарегистрированных и ассоциированных с приложением типов файлов он реагирует генерацией требования открыть канал динамического обмена данными (DDE),
_1 если фрейм является главным окном приложения (определяется значением C\ҐinThread::m_pMainWnd), то когда пользователь закрывает приложение, он предлагает ему сохранить модифицированные документы.
В классе определены два основных члена:
BOOL CFrameWnd::m_bAutoMenuEnable,
значение, которого равное FALSE приведет к автоматической блокировке тех элементов меню (и соответствующих кнопок панели инструментов), для которых не определены обработчики ON_UPDATE_COMMANDJJI или ON_COMMAND. По умолчанию устанавливается в TRUE.
static AFX_DATA const CRect CFrameWnd::rectDefault -
Определяет константный объект класса CRect,который предписывает Windows самостоятельно определить размеры и положение создаваемого окна и определен следующим образом:
const AFX_DATADEF CRect CFrameWnd::rectDefault( CW_USEDEFAULT, CW_USEDEFAULT, 0,0
Функции-члены этого класса сгруппированы по следующим категориям:
Q Конструктор. Как обычно, конструктор создает объект класса, но не создает окно.
Q Инициализация. Сюда входят: две функции, отвечающие за создание окна Windows и присоединение его к текущему объекту класса — Create и LoadFrame; функция, загружающая таблицу акселераторов — LoadAccel-ТаЫе; группа функций для управления инициализацией панелей элементов управления (LoadBarState — загружает сохраненные в INI-файле или реестре установки панели, SaveBarState — сохраняет текущие установки панели в INI-файле или в реестре, SetDockState — сохраняет размещение текущего окна относительно главного, GetDockState — восстанавливает размещение текущего окна относительно главного (для плавающих панелей) и Show Control Bar — управляет режимом отображения панели элементов управления).
Q Операции. В эту категорию входит большое число функций для работы с документами и их представлениями, с панелями элементов управления, строкой состояния и для управления модальностью фрейма окна.
Помимо своего основного назначения — поддержки SDI-приложений — этот класс служит базовым для классов CMDIFrameWnd и CMDIChildWnd, которые созданы специально для организации приложений на базе MDI.