6 Классы окон библиотеки MFC (Лекции по курсу ПОУК-1)

2017-12-28СтудИзба

Описание файла

Файл "6 Классы окон библиотеки MFC" внутри архива находится в папке "Лекции по курсу ПОУК-1". Документ из архива "Лекции по курсу ПОУК-1", который расположен в категории "". Всё это находится в предмете "программное обеспечение управляющих комплексов (поук)" из 6 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "программное обеспечение управляющих комплексов (поук)" в общих файлах.

Онлайн просмотр документа "6 Классы окон библиотеки MFC"

Текст из документа "6 Классы окон библиотеки MFC"

19 стр. Лекция 6. Обзор классов окон библиотеки MFC

Обзор классов окон библиотеки MFC

Очень много объектов, рассматриваемых в предыдущих главах, связаны с Windows-окнами. К ним прежде всего относятся облики и диалоги - объекты классов CView и CDialog и их производные. Элементы управления (окна редактирования, списки, кнопки и др.) - тоже связаны с окнами, изображающими их на экране. Существующий практически в каждом приложении объект главное окно-рамка тоже представлен на экране Windows-окном - главным окном приложения. Классы всех этих объектов являются производными от класса CWnd. Он-то и обеспечивает отображение окна на экране и работу с ним.

Объекты класса CWnd и Windows-окна

Рассмотрим взаимоотношения объектов класса CWnd с Windows-окнами. Хотя объекты класса CWnd и производных от него классов (оконные объекты) не тождественны Windows-окнам, они связаны настолько тесно, что такое отождествление вполне оправдано. Windows-окно - объект операционной системы Windows - это внутренняя структура данных операционной системы, с которой связано изображение на экране в виде окна-прямоугольника со специальными элементами и областями. Эта структура обеспечивает управление окном на экране и реакцию на воздействие пользователя на окно. В смысле объектно-ориентированного программирования она во многом подобна классу и имеет метод - функцию окна. Однако эта структура не является, конечно же, структурой какого-либо языка программирования, поэтому Windows-окно не является объектом в смысле языка C++. Дескриптор (handle) Windows-окна просто идентифицирует его при вызове функций API, предназначенных для работы с Windows-окнами.

Оконный объект - это объект в смысле языка C++, который служит для работы с Windows-окном. Его переменная m_hWnd задает определитель (handle) Windows-окна, прикрепленного (attached) к данному оконному объекту. Создание оконного объекта состоит из двух этапов: создания самого объекта и создания и прикрепления Windows-окна к оконному объекту или прикрепление к оконному объекту уже существующего Windows-окна. Оконный объект может использоваться приложением для управления экранным образом (окном на экране) прикрепленного Windows-окна. При этом само Windows-окно становится "прозрачным", т.е. не фигурирует при вызове соответствующих методов.

Оконный объект использует большое количество функций API, предназначенных для работы с окнами. Например, метод MoveWindow передвигает и изменяет размер окна на экране:

wnd.MoveWindow(x, y, width, height, rep);

При вызове этого метода его реализация на самом деле использует API-функцию

BOOL MoveWindow(

HWND hWnd, // дескриптор Windows-окна

int X, // позиция по горизонтали

int Y, // позиция по вертикали

int nWidth, // ширина

int nHeight, // высота

BOOL bRepaint); // признак перерисовки

Функция API вызываетcя со значением первого параметра, равным дескриптору Windows-окна, прикрепленного к оконному объекту.

Таким образом, оконный объект как бы содержит в себе Windows-окно и предоставляет для работы с ним методы в смысле языка C++. О классе CWnd оконных объектов говорят, что он является классом-оболочкой для Windows-окон.

Ранее уже упоминалось об оконном объекте - облике (класс CView). Прикрепленное к облику Windows-окно служит для отображения документа на экране. Однако окно облика никогда не появляется на экране без окна другого объекта - окна-рамки. Окно-рамка (класс CFrameWnd) - объект производного от CWnd класса - координирует взаимодействие приложения с документом и его обликом. Прикрепленное к нему Windows-окно представлено в виде рамки, внутри которого находится окно облика. На экране они выглядят как одно целое, но на самом деле они прикреплены к разным объектам. Рамка имеет нестандартные элементы управления окна: полосу заголовка, меню, кнопки минимизации и максимизации, элементы управления размерами окна. Рамка также может иметь строку статуса и панель инструментов. Окно облика, наоборот, не имея элементов управления (они сосредоточены у рамки), является рабочей областью, в которой облик строит приложение.

Любое Windows-окно имеет две области: клиентскую область, изображение в которой задается приложением, и системную область, состоящую из управляющих элементов. Таким образом, окно-рамка задает Windows-окно, использующее только свою системную область, а облик задает Windows-окно, использующее только свою клиентскую область. Windows-окно, прикрепленное к облику, является дочерним (child) по отношению к Windows-окну, прикрепленному к соответствующему объекту окно-рамка. Это, в частности, означает, что дочернее окно нельзя передвинуть за пределы клиентской области родительского окна.

Число методов класса CWnd очень велико, с ними можно ознакомится при помощи справочной системы Visual C++. Остановимся подробнее только на некоторых из них.

Некоторые методы класса CWnd

Создание и уничтожение Windows-окон

CWnd();

Создает объект класса CWnd, обеспечивающий доступ к Windows-окну. При этом само Windows-окно не создается. Далее можно либо создать новое Windows-окно и закрепить его за данным оконным объектом, либо закрепить уже имеющееся Windows-окно. Первое достигается методами CreateEx и Create, второе - методом Attach.

virtual BOOL DestroyWindow();

Уничтожает Windows-окно, закрепленное за объектом класса CWnd. Если окно уничтожено успешно, возвращается ненулевое значение, в противном случае - 0. После выполнения этого метода оконный объект уже не имеет закрепленного за ним Windows-окна. Сам оконный объект при этом не уничтожается. Метод DestroyWindow посылает соответствующие сообщения, чтобы уничтожить окно и связанные с ним ресурсы. Оно также уничтожает дочерние окна и, если требуется, информирует родительское окно.

Методы инициализации

Методы создания Windows-окон обсуждаться не будут, так как при работе со многими классами окна (к которым относятся и элементы управления) создаются каркасом прилржения. Рассмотрим только методы для прикрепления и открепления Windows-окон.

BOOL Attach(HWND hWndNew);

Закрепляет Windows-окно, заданное определителем hWndNew за оконным объектом. При успешном выполнении возвращает ненулевое значение, в противном случае - 0.

HWND Detach();

Открепляет Windows-окно, закрепленное за данным оконным объектом, и возвращает определитель открепленного окна.

Методы управления состоянием окна

Сначала рассмотрим четыре типа состояний:

  • Активное/неактивное. Активным является окно, с которым пользователь работает в текущий момент. Оно находится поверх всех окон и выделено цветом заголовка. Окно активизируется после щелчка мыши в любой его точке.

  • В фокусе/не в фокусе клавиатуры. Окну в фокусе клавиатуры направляются сообщения, вызванные нажатием клавиш на клавиатуре. Как правило, активное окно как раз и находится в фокусе клавиатуры. Исключения составляют дочерние окна, которые сами по себе не могут быть активными или неактивными, но при этом могут быть в фокусе клавиатуры. В этом случае активным должно быть родительское окно.

  • Мышь захвачена/не захвачена. Все сообщения от мыши, захваченной окном, направляются этому окну независимо от позиции курсора на экране.Только одно окно может захватить мышь в текущий момент.

  • Включенное/выключенное (доступное/недоступное). Если окно во выключенном состоянии, пользователь не может сделать его активным или передать ему фокус. Операционная система игнорирует любые сообщения окну от клавиатуры и мыши.

Перечислим некоторые методы управления состоянием окна.

BOOL IsWindowEnabled() const;

Если окно в выключенном состоянии, возвращает нулевое значение, в противном случае - 1.

BOOL EnableWindow(BOOL bEnable=TRUE);

Если значение параметра TRUE, окно переводится в включенное состояние, FALSE - в выключенное. Метод возвращает ненулевое значение, если в момент вызова окно находилось в выключенном состоянии. Если окно было во включенном состоянии или произошла ошибка, возвращается 0.

CWnd* SetActiveWindow();

Переводит окно в активное состояние. Возвращает указатель на оконный объект, обеспечивающий доступ к окну, активному в момент вызова этого метода (указатель может быть временным и не должен запоминаться для дальнейшего использования).

static CWnd* PASCAL GetActiveWindow();

Возвращает указатель на оконный объект, обеспечивающий доступ к окну, активному в момент вызова этого метода. Если в момент вызова активных окон нет, возвращается NULL. Этот указатель может быть временным и не должен запоминаться для дальнейшего использования.

CWnd* SetCapture();

Переводит окно в состояние захвата мыши. Возвращает указатель на оконный объект, обеспечивающий доступ к окну, которым мышь была захвачена в момент вызова этого метода. Если в момент вызова мышь не захвачена, возвращает NULL. Этот указатель может быть временным и не должен запоминаться для дальнейшего использования. Чтобы освободить мышь, используется API-функция ReleaseCapture (параметров не имеет). При успешном ее выполнении возвращается TRUE, иначе - FALSE.

static CWnd* PASCAL GetCapture();

Возвращает указатель, задающий окно, захватившее мышь. Если такого окна нет, возвращает NULL.

BOOL ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags=0);

Изменяет стиль окна. Параметр dwRemove задает набор элементов стиля, которые должны быть изъяты из стиля окна. Параметр dwAdd - набор элементов стиля, которые должны быть добавлены к стилю окна. Возвращает ненулевое значение, если стиль был успешно изменен, в противном случае - 0.

Если параметр nFlags не равен 0, то после изменения стиля вызывается API-функция SetWindowPos, которая перерисовывает окно, используя набор флагов, полученный комбинацией значения:

  • SWP_NOSIZE - сохранять текущий размер;

  • SWP_NOMOVE - сохранять текущую позицию;

  • SWP_NOZORDER - сохранять текущий Z-порядок;

  • SWP_NOACTIVE - не делать окно активным.

Методы управления размером и положением окна

void MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint=TRUE);

void MoveWindow(LPCRECT lpRect, BOOL bRepaint=TRUE);

Эти методы изменяют положение и размеры окна. Положение левого верхнего угла окна задантся координатами x,y, а размеры шириной nWidth и высотой nHeight. Параметр bRepaint определяет, будет ли инициироваться перерисовка. Если он равен TRUE, окну будет послано сообщение WM_PAINT, в противном случае сообщение не посылается, и перерисовка не производится. Эти действия применяются как к клиентской, так и неклиентской области окна, а также к частям родительского окна, открывшимся при перемещении.

Новое положение и размеры окна можно задать и с помощью структуры типа RECT или объекта класса CRect, передав в качестве параметра ссылку на структуру или объект класса.

Для окна, у которого нет родителя, координаты указываются относительно левого верхнего угла экрана, а для имеющего такового - относительно верхнего левого угла родительского окна.

BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFgags);

Изменяет положение, размеры и место окна в Z-упорядочении (порядке изображения окон в слоях изображения). Параметры x, y, cx, cy задают новое положение левой стороны, новое положение верхней стороны, новую длину и новую высоту соответственно.

Параметр pWndInsertAfter определяет окно, за которым нужно поместить исходное окно в Z-упорядочении. Этот параметр может быть либо указателем на объект класса CWnd, либо одним из следующих значений:

  • wndBottom поместить окно в конец Z-упорядочения, т.е. позади всех окон на экране;

  • wndTop поместить окно в начало Z-упорядочения, т.е. впереди всех окон на экране;

  • wndTopMost поместить окно на ближайшее место, делающее окно неперекрытым. Окно перемещается на неперекрытое место, даже если оно неактивно;

  • wndNoTopMost поместить окно на ближайшее место позади всех неперекрытых окон. Окно, перекрытое в момент вызова этого метода, не перемещается.

Параметр nFlags задает режим изменения размера и положения окна и может быть следующей комбинацией флагов:

  • SWP_DRAWFRAME изображать вокруг окна рамку (определенную при его создании);

  • SWP_HIDEWINDOW скрыть окно;

  • SWP_NOACTIVE не делать окно активным. Если этот флаг не установлен, окно делается активным и помещается впереди, либо на место в Z-упорядочении, определяемое параметром pWndInsertAfter;

  • SWP_NOMOVE сохранить текущее положение окна, проигнорировав параметры x и y;

  • SWP_NOREDRAW не перерисовывать измененное окно. Если этот флаг установлен, то после выполнения функции окно с новыми установками на экране не появится, а старое изображение окна не будет стерто с родительского окна;

  • SWP_NOSIZE сохранить текущий размер окна, проигнорировав параметры cx и cy;

  • SWP_NOZORDER сохранить текущее Z-упорядочение, проигнорировав параметр pWndInsertAfter;

  • SWP_SHOWWINDOW показать окно (сделать окно видимым и перерисовать).

Если окно не является дочерним, координаты указываются относительно левого верхнего угла экрана, иначе координаты указываются относительно верхнего левого угла клиентской области родительского окна. Приложение не может активизировать неактивное окно, не поместив его в начало Z-упорядочения. Приложение не может изменить место активного окна в Z-упорядочении произвольным образом. Перекрытые окна могут быть родительскими по отношению к неперекрытым, но не наоборот.

void GetWindowRect(LPRECT lpRect) const;

Копирует параметры прямоугольника, ограничивающего окно, в структуру типа RECT или объект класса CRect, заданные параметром lpRect. Этот прямоугольник включает все - и клиентскую и системную часть окна. Параметры даются относительно левого верхнего угла экрана. При вызове метода значением фактического параметра может быть либо ссылка на (не константную) структуру типа RECT либо объект класса CRect.

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5160
Авторов
на СтудИзбе
439
Средний доход
с одного платного файла
Обучение Подробнее