HTML [44] |
Visual C++ и MFC [21] |
c++ [78] |
php [19] |
Javascript [15] |
C# [51] |
загрузки [0] |
XNA
[10]
создание игр с помощью xna
|
Главная » Статьи » Visual C++ и MFC |
Оконный класс CWndИтак, рассмотрим класс о котором можно сказать следующее: "Вам хочется окон, их есть у меня!". Трудно переоценить значимость данного класса. Как точно подмечено в MSDN "The CWnd class provides the base functionality of all window classes in the Microsoft Foundation Class Library". Наверное любой, кто знает латинский алфавит, может перевести это предложение. Счетаем необходимым отметить, что класс CWnd является базовым для многих классов в бибиотеке MFC. Кто является родителем данного класса? Ответ на это вопрос Вы можете получить из рисунка, который приведен выше. Прежде чем мы приступим к изучению методов и полей данного класса, давайте выясним какая взаимосвязь между объектами класс CWnd и окнами Windows. Несмотря на то, что объекты класса CWnd отличаются от окон Windows, тем не менее эти два понятия тесно взаимосвязаны между собой. Поскольку СWnd это прежде всего класс (хотя и "взрослый"), естественно он обладает конструктором и деструкторо,. с помощью которых объекты данного класса создаются и уничтожаются. Окно Windows - это некоторая структура данных операционной системы, которая создается и уничтожается с помощью функции WinAPI. Учитывая тот факт, что в конкретный момент времени, реально может существовать несколько окон, возникает вопрос: "Каким образом можно однозначно определить то или иное окно?". В Windows каждое окно однозначно идентифицируется своим дескриптором. Значение дескриптора окна сохраняется в переменной m_hWnd объекта CWnd. Таким образом, между окнами Windows и объектами класса CWnd четко прослеживается следующая взаимосвязь: окну Windows сопоставляется экземпляр класса CWnd. В Windows существует три основных типа окон: overlapped (перекрывающееся), popup (всплывающие) и child (дочерние). Отметим кратко особенности каждого типа. Окна со стилем overlapped, это основной, наиболее универсальный тип окно Windows. Окна со стилем child создаются тогда, когда у приложения уже есть главное окно. У дочерних окон всегда есть свой родитель, который как-бы владеет данными окнами. Другими словами, вы не можете дочернее окно вынести за пределы родительского окна. Ну и, наконец-то, окна со стилем popup, обычно, используются для отображения информации на короткий промежуток времени. Итак, только три основных типа окон. Неужели это все?.. Конечно нет! Вы можете создавать множество разнообразных объектов Windows комбинируя стили окон. Для Вас, программистов использующих библиотеку MFC, cтили окон - это предопределенные константы, объявленные в файле WINUSER.H. Рассмотрим подробнее эти стили, но, конечно, не все. Иначе, чем Вы будете заниматься дома тихими вечерами? Мы рассмотрим с Вами только те стили, которые Вы будете часто, на наш взгляд, использовать при программировании. WS_BORDER - Задает окно, имеющее рамку без заголовка. WS_CAPTION - Задает окно, имеющее заголовок и рамку. Как правило, этот стиль используется для перекрывающихся окон и не может использоваться совместно со стилем WS_DLGFRAME. WS_CHILD - Задает дочернее окно, и, что естетсвенно, не может использоваться совместно со стилем WS_POPUP. Cкорее всего, Вы уже догадались что это за непонятное сокращение WS - правильно, сокращение от WindowStyle. WS_DISABLED - Задает неактивное окно. WS_DLGFRAME - Задает окно, имеющее двойную рамку и не имеющее заголовка. WS_GROUP - Определяет первый элемент управления группы окон; все элементы управления, определенные с этим стилем, заканчивают текущую и начинают новую группу. WS_HSCROLL -Задает окно, имеющее горизонтальную полосу прокрутки. WS_VSCROLL -Задает окно, имеющее вертикальную полосу прокрутки. WS_MAXIMIZE -Задает окно развернутое на весь экран. WS_MAXIMIZEBOX -Задает окно, которое содержит кнопку "развернуть". Заметим, что если окно является дочерним окном элемента управления, то этот флаг стиля используется под именем WS_TABSTOP. WS_MINIMIZE -Задает окно в минимизированном состоянии. WS_MINIMIZEBOX -Задает окно, которое содержит кнопку "свернуть". Заметим, что если окно является дочерним окном элемента управления, то этот флаг стиля используется под именем WS_GROUP. WS_OVERLAPPED - Устанавливает перекрывающееся окно, которое обычно имеет заголовок и рамку. WS_POPUP -Задает всплывающее окно; не любит WS_CHILD. WS_SYSMENU - Задает окно, имеющее пиктограмму системного меню в полосе заголовка. WS_TABSTOP- Назначается одному или нескольким элементам управления, в результате чего между ними можно перемещаться с помощью клавиши Tab (Shift+Tab) WS_THICKFRAME - Окно будет иметь утолщенную рамку, с помощью которой возможно изменить размер окна. WS_VISIBLE - Благодяря этому стилю окно будет видимым на экране, сразу после его создания. Если Вам показалось что мы перечислили не достаточное количество стилей - у Вас есть уникальная возможность просмотреть все остальные константы в файле WINUSER.H. Итак, мы уже упаминали, что класс CWnd - это базовый класс для всех окон, созданных с помощью библиотеки MFC. Все методы данного класса, можно разбить на несколько категорий: конструктор, инициализация, состояние окна, изменение размеров и позиции окна, доступ к окну, обновление-перерисовка, преобразование координат, работа с текстом, ну и работа с сообщениями. Рассмотрим некоторые поля и методы данного класса: HWND CWnd::m_hWnd - дескриптор окна Windows. CWnd::CWnd() - конструктор, создает экземпляр класса, но не создает окно. Для создания окна, необходимо вызвать функцию Create или CreateEx void GetWindowRect( LPRECT lpRect ) const; - копирует экранные координаты окна в параметр lpRect. void GetClientRect( LPRECT lpRect ) const; - эта функция Вам знакома. Она копирует координаты окна в параметр lpRect. Так как координаты представляют клиентское окно, то координаты левого верхнего угла равняются (0,0). static CWnd* PASCAL GetFocus( ); - функция возвращает указатель на окно, которое в данный момент содержит фокус (напомним, что фокус определяет в какое окно будет осущекствляться ввод данных с клавиатуры) или NULL, если фокус не определен. CWnd* SetFocus( ); - функция требует передачи фокуса окну и возвращает указатель на окно, которое владело фокусом. CWnd* GetDlgItem( int nID ) const; - функция возвращает указатель на окно, которое задается идентификатором nID. Если с идентификатором не сопоставлен ни один оконный объект, функция возвращает NULL. и void CWnd::GetDlgItem( int nID, HWND* phWnd ) const; функция аналогична предыдущей, но позволяет получить указатель на элемент управления (дочернее окно в диалоговом окне) который задается идентификатором nID, в окне, задаваемом параметром phWnd. int GetDlgCtrlID( ) const; - если предыдущие две функции позволяют получить указатель на элемент управления по идентификатору, то данная функция наоборот, возвращает идентификатор дочернего окна. int SetDlgCtrlID( int nID ); - позволяет сопоставить с окном новый идентификатор. Возвращаемое значение равно 0, если функция не отработала корректно, иначе содержит значение предыдущего идентификатора. BOOL UpdateData( BOOL bSaveAndValidate = TRUE ); - функция позволяет проинициализировать данные, содержащиеся в элементах управления (значение параметра bSaveAndValidate равняется TRUE) или считать данные из элементов управления в переменные, которые сопоставленны с ними. Вы еще не раз встретитесь с этой функцией в нашем занятии. void SetWindowText( LPCTSTR lpszString ); - устанавливает заголовок окна. int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const; - cчитывает максимум nMaxCount символов в буфер lpszStringBuf. Функция возвращает размер считанной строки в байтах. void GetWindowText( CString& rString ) const; - записыает заголовок окна в объект rString. BOOL ModifyStyle( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 ); - функция позволяет изменить стиль окна. Параметр dwRemove - удаляет стили из окна, dwAdd - добавляет стили к окну. Параметр nFlags определяет флаги которые будут переданы функции SetWindowPos. Если Вы хотите изменить расширенные стили окна, воспользуйтесь функций ModifyStyleEx. Вернемся к жизни... Давайте посмотрим как Visual C++ помогает нам разобраться со стилями окон. Выберите закладку ResourceView, распахните группу Dialog и щелкните дважды левой кнопкой мыши на имени одной из диалоговых форм. После чего, выберите пункт меню View, а затем Properties. Перед Вами появится диалоговое окно свойств Конечно, рисунки на этом занятии завораживают!.. Пойдем дальше... Рассмотрим свойства, представленные на вкладке Styles диалогового окна Properties. Обратите внимание, что все стили окон, представленные на вкладке Styles, соответствуют стилям рассмотренным нами на этом занятии. Практически тоже самое можно сказать и про стили, расположенные на вкладке General. А вот о некоторых стилях, расположенных на вкладке Extended Styles поговорим отдельно: Client edge - придает "трехмерный эффект" границе окна. клиентская область при этом как бы вдавлена в окно. Соответствие стилю WS_EX_CLIENTEDGE. Static edge - придает окну "трехмерный стиль" границы. в окно. Соответствие стилю WS_EX_STATICEDGE. Modal Frame - задает окно, имеющее удвоенную границу. Соответствие стилю WS_EX_DLGMODALFRAME. Transparent - задает прозрачное окно, т. е. не закрывающее другие окна, расположенные под "ним". Соответствие стилю WS_EX_TRANSPARENT. Accept files - Определяет, что окно допускает перетаскивание файлов (drag-and-drop). Соответствие стилю WS_EX_ACCEPTFILES. | |
Просмотров: 4405 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |