Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 семестр, WinAPI, MFC.pdf
Скачиваний:
378
Добавлен:
15.06.2014
Размер:
6.17 Mб
Скачать

использует тот прочный фундамент, который заложила библиотека 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.