Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Системный Реестр в WINDOWS NT.

Поиск

Цель работы: изучить структуру системного Реестраи основные функции работы с системным Реестром.

Теоретические сведения

Системный Реестр в WINDOWS NT является иерархической структурой, состоящей из разделов(key) и пар параметров(name-value pair). Эта структура используется как база данных, централизованно хранящая информацию о пользователях, приложениях, операционной системе и о конфигурации компьютера.

Разделы HKEY - это средства доступа к разделам Реестра самого верхнего уровня. Они определяются в API Реестра и являются точкой входа для разработчиков к остальному дереву Реестра. Пара «параметр - значение» состоит из трех частей: имени параметра, значения параметра и типа данных, т.е. типа значения. Основные три типа данных: двойное слово (DWORD - тип REG_DWORD), строка (STRING - тип REG_SZ) и двоичное значение (BINARY - тип REG_BINARY).

Функции WIN32 API для работы с системным Реестром.

Функция RegOpenKeyEx - открытие раздела. При успешном открытии раздела функцией возвращается ERROR_SUCCESS, в противном случае - код ошибки:

LONG RegOpenKeyEx (

HKEY hKey, // дескриптор корневого раздела

LPCTSTR lpSubKey, // указатель на адрес подраздела корневого раздела, в котором создается подраздел.

DWORD ulOptions, //зарезервирован и равен 0.

REGSAM samDesired, //доступ к разделу.

PHKEY phkResult //адрес дескриптора открываемого ключа.

);.

Параметры:

HKey - идентифицирует корневой ключ или один из ниже перечисленных:

HKEY_CLASSES_ROOT,

HKEY_CURRENT_USER.

HKEY_LOCAL_MACHINE,

HKEY_USERS.

samDesired - определяет доступ к разделу.

PhkResult - обработчик раздела приложения, т. е. дескриптор открытого ключа.

Пример написания функции:

RegOpenKeyEx (HKEY_CURRENT_USER,"SOFTWARE",0,KEY_READ | KEY_WRITE,&hKey);.

Эта функция открывает в корневом разделе HKEY_CURRENT_ USER подраздел SOFTWARE с разрешениями на создание подразделов, на запись данных подраздела, на получение данных подраздела, на перечисление подразделов, на извещение об изменении.

Функция RegCreateKeyEx создает новый подраздел внутри родительского.

При успешном создании раздела функцией возвращается ERROR_SUCCESS, в противном случае - код ошибки.

При создании нового подраздела необходимо сначала открыть его родительский раздел функцией RegOpenKeyEx.

Функция RegCreateKeyEx открывает раздел, если он существует, или создает его с новыми атрибутами:

LONG RegCreateKeyEx (

HKEY hKey, // дескриптор открытого ключа.

LPCTSTR lpSubKey, // адрес открываемого ключа не может быть равен NULL.

DWORD Reserved, // зарезервирован.

LPTSTR lpClass, // адрес имя класса или типа объекта.

DWORD dwOptions, // специальный тип раздела

REGSAM samDesired, // определяет маску доступа к ключу

LPSECURITY_ATTRIBUTES lpSecurityAttributes, //указатель на структуру LPSECURITY_ATTRIBUTES

PHKEY phkResult, //адрес дескриптора созданного ключа

LPDWORD lpdwDisposition //указатель на буфер,

eсли ключ создан, то в поле определяемое LpdwDisposition, записывается значение REG_CREATED_NEW_KEY, а если ключ существовал и был открыт, - значение REG_OPENED_EXISTING_KEY.

Пример записи функции:

RegCreatKeyEx (hKey,"MyKey", 0, "", REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, NULL,&hMyKey, lpdwDisposition).

Функция RegSetValueEx устанавливает значение раздела в реестре. При использовании этой функции необходимо открыть раздел, значение которого необходимо установить. Эта функция позволяет создавать несколько пар параметр- значение в одном разделе.

При успешной установке функцией возвращается ERROR_SUCCESS, в противном случае - код ошибки:

LONG RegSetValueEx (

HKEY hKey, // дескриптор ключа, к которому добавляются данные.

LPCTSTR lpValueName,//-указатель на строку, содержащую имя добавляемых данных.

DWORD Reserved, // зарезервирован

DWORD dwType, // определяет тип информации, который будет сохранен в качестве данных.

CONST BYTE *lpData, // указатель непосредственно на данные, которые будут сохранены.

DWORD cbData // размер данных, на который указывает предыдущий аргумент.

);.

Пример записи функции:

RegSetValueEx ((hMyKey, "m_name", 0, REG_SZ, (const unsigned char*)(LPCTSTR) lpszKeyValue, lpszKeyValue.GetLength()).

Функция RegCloseKey закрывает раздел перед сохранением системных ресурсов:

LONG RegCloseKey (

HKEY hKey //дескриптор закрываемого раздела, возвращенный функцией RegOpenKeyEx.

);.

Пример записи функции: RegCloseKey(hMyKey) -закрывает подраздел My Key.

При успешном закрытии раздела функцией возвращается ERROR_SUCCESS, в противном случае - код ошибки.

Функция RegFlushKey записывает изменения, сделанные в Реестре на диск. Необходимость использования RegFlushKey возникает, когда нужна гарантия записи изменения в Реестре перед выполнением остального кода.

При успешном выполнении функцией возвращается ERROR_SUCCESS,

в противном случае - код ошибки.

LONG RegFlushKey (

HKEY hKey //дескриптор ключа для записи.

);.

Пример записи функции: RegFlushKey(hMyKey).

Функция RegDeleteKey удаляет раздел вместе с его значениями, если в разделе существуют подразделы, его удалить нельзя.

Нельзя удалить подраздел, если его родительский раздел был открыт функцией RegCreateKeyEx и не был закрыт функцией RegCloseKey:

LONG RegDeleteKey (

HKEY hKey, // дескриптор открытого ключа.

LPCTSTR lpSubKey // указатель на подстроку с именем удаляемого подраздела.

);.

Существует два способа удаления раздела:

1. В качестве первого параметра указать корневой раздел, во втором параметре - полный путь к удаляемому подразделу.

2. Открыть родительский раздел с помощью процедуры RegOpenKeyEx и затем передать его дескриптор в качестве первого параметра. В качестве второго параметра указывается имя дочернего раздела.

Пример написания функции:

RegDeleteKey (HKEY_CURRENT_USER,"SOFTWARE\\My Key").

7.2.Требования к программе:

В программе должно быть реализовано:

- создание подраздела в системном Реестре;

- задание параметров подраздела в системном Реестре;

- изменение значений параметров подраздела;

- удаление значений параметра подраздела;

- окончание работы программы с сохранением изменений в системном Реестре;

- окончание работы программы без сохранения изменений в системном Реестре.

Модификацию подразделов Реестра производить в разделе HKEY_CURRENT_USER ив подразделе SOFTWARE.

Для контроля работы программы необходимо вызвать программу Regedit, которая позволяет просматривать и редактировать Реестр.

Отчет должен содержать: постановку задачи, листинг кода всех модифицированных функций и их назначение, выводы.

Варианты заданий.

7.4.Контрольные вопросы

1. Системный Реестр.

2. Основные функции программы RegEdit.

3. API функции изменения, удаления, создания подраздела в системном Реестре.

4. Сохранение изменения в системном Реестре после окончания работы приложения.

 

 

Лабораторная работа № 8.

Модель составного COM- объекта.

Цель работы: Изучить COM- технологию, проектирование COM- клиента и COM- сервера.

Теоретические сведения

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

Контейнер ActiveX - это приложение, содержащее связанные или внедренные данные. Такое приложение отображает информацию и позволяет выбирать, перемещать, удалять и редактировать эти данные.

Связывание и внедрение объектов. После компиляции и запуска программы в ее текущий документ можно внедрить или связать какой-либо объект. Для этого в меню Edit нужно выбрать пункт Insert New Object (вставьте новый объект), в нем можно выбрать либо опцию создания нового объекта, либо тип объекта в поле Object Typ e (Тип объекта), либо файл, данные из которого будут внедрены в объект.

Например, щелкнув на строке Вitmap Imag e (растровое изображение) и выбрав соответствующий тип объекта, приложение создаст растровое изображение и внедрит его в документ. Одновременно к меню и панелям инструментов приложения будут добавлены меню и панели Microsoft Paint. Но программа-заготовка не поддерживает функций выделения объектов, так что в данном случае не удастся отменить выделение всего рисунка и вернуться в нормальный режим приложения. Однако можно сохранить текущий документ, а потом загрузить его. После повторной загрузки документа для отображения документов Paint следуетвыбрать в меню приложения Edit и найти там объект, представляющий растровое изображение.

 

8.2.Требования к программе:

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

1. Выделять объект с помощью «мыши».

2. Перемещать объект с помощью «мыши».

3. Изменять размеры объекта с помощью «мыши».

В качестве внедряемого объекта рекомендуется использовать объект, представляющий растровое изображение (Bitmap Image Object)

Отчет должен содержать: постановку задачи, листинг кода всех модифицированных функций и их назначение, выводы.

Варианты заданий.

Лабораторная работа № 9

Приложение-контейнер ActivеX

Цель работы: создать собственное приложение-контейнер ActiveX

Теоретические сведения

Создание проекта заготовки приложения-контейнера. Для создания проекта программы в Visual C++ необходимо выполнить следующие действия:

1. Вызвать мастер AppWizard и задать имя для проекта, например СontainerApp.

2. На шаге 2 выбрать однодокументный тип интерфейса SDI.

3. На шаге 3 выбрать опцию Container (Контейнер). Выбрав эту опцию, Вы даете указание генерировать программный код, необходимый для создания заготовки приложения-контейнера ActiveX. Это приложение может связывать или внедрять данные, созданные другими программами.

4. На четвертом шаге оставить только опцию 3D Controls.

5. На пятом шаге выбрать опцию As a Statically Linked Library.

6. На остальных шагах выбрать опции по умолчанию.

Управление размерами и изображением внедренного объекта. Для внедрения кода, обеспечивающего возможность изменять размеры и расположение внедренных объектов в класс CСontainerAppCntrItem, необходимо выполнить следующие действия.

1. В окне Project Workspace выбрать закладку ClassView, щелкнуть правой кнопкой на имени класса CСontainerAppCntrItem и в появившемся контекстном меню выбрать команду Add Member Variable (добавить переменную член).

2. В поле Variable Typ e (тип переменной) ввести Crect, в поле Variable Declaration ( объявление переменной) задать m_objectRect и выбрать тип доступа Public (общедоступная). Таким образом, в класс добавили переменную m_objectRect, которая будет представлять внедренные документы в объекте, в частности, хранить информацию о размерах и координатах объекта.

3. В окне Project Workspace дважды щелкнуть на строке с именем функции OnChangeItemPosition () класса CСontainerAppCntrItem.

4. После комментариев //TODO.. вставить приведенные ниже строки кода:

m_objectRect=rectPos;

класс CСontainerAppDoc* pDoc=GetDocument();

pDoc->SetModifiedFlag();

pDoc->UpdateAllViews(NULL).

MFC вызывает функцию OnChangeItemPosition() тогда, когда пользователь изменяет размеры или положение внедренного объекта. Строки этого кода позволяют сохранить информацию об измененных координатах и размерах объекта и, соответственно, отобразить документ на экране в новоой позиции.

5. Удалить в функции OnGetItemPosition() строку кода SetRect() и добавить строку rPosition=m|_objectRect. Функция OnGetItemPosition() связывается тогда, когда требуется выяснить расположение внедренного объекта. В добавленной строке кода для объекта задаются координаты, сохраненные ранее в объекте m_objectRect.

6. Добавить следующую строку кода в конструктор класса: CcontainerAppCntrItem: m_objectRect.SetRect(20,20,150,150).. В этой строке задается начальное положение объекта. При создании пользователем нового объекта размеры и положение этого объекта будут соответствовать указанным в m_objectRect. CcontainerAppCntrItem.

7. В функцию Serialize() класса CcontainerAppCntrItem после комментариев // TODO: add storing code here добавить строку ar<<m_objectRect. Это позволит сохранить координаты и размеры объекта при сохранении документа.

8. Вставить в текст функции Serialize() после строки комментариев // TO DO: add loading code here следующую строку: ar>m_objectRect. Этот код позволит загружать координаты и размеры внедренного объекта при загрузке. Работа над классом CcontainerAppCntrItem закончена.

Выделение объекта с помощью «мыши». Следующим шагом в создании приложения станет программирование средств, позволяющих выделять объекты и отменять их выделение. Для этого необходимо выполнить следующие действия:

1. В функции OnDraw() класса CcontainerAppView приложения удалить строки, идущие после комментариев TODO: remove this code when final draw is complete. Удаленные строки задают расположение внедренного объекта в указанной по умолчанию позиции окна приложения-контейнера. После удаления этих строк приложение сможет размещать объекты в соответствии со значениями координат, хранящихся в переменных m_objectRect.

2. Вместо удаленных строк кода добавить следующие строки:

POSITION pos=pDoc->GetStartPosition();

While(pos!=NULL)

{

CcontainerAppCntrItem* pObject=

(CcontainerAppCntrItem*) pDoc->GetNextItem(pos);

pObject->Draw(pDC, pObject->m_objectRect);

CrectTracker tracker;

SetupTracker(&trackeeeer, pObject);

Tracker.Draw(pDC);.

Этот фрагмент кода анализирует все внедренные в документ объекты и отображает их в соответствующих позициях экрана. Объект CrectTracker создает рамку вокруг внедренного объекта, внешний вид которой зависит от состояния этого объекта (CrectTracker отображает также соответствующий указатель «мыши»). Функция SetupTracker инициализирует этот объект.

3. Вызвать ClassWizard и добавить к классу CcontainerAppView функцию OnSetCursor(). Эта функция будет вызываться при помощи системного сообщения WM_SETCURSOR.

4. В функцию OnSetCursor вставить следующий код:

If((m_pSelection!=NULL) &&(pWnd==this))

{

CrectTracker tracker;

SetupTracker(&tracker,m_pSelection);

BOOL cursorSetByTracker=tracker.SetCursor(this,nHitTest);

If(cursorSetByTracker)

Return TRUE;

}.

Этот фрагмент кода проверяет, находится указатель «мыши» на объекте или нет. Если да, то программа создает объект CrectTracker, с помощью которого задается форма указателя «мыши». Переменная pWnd является указателем на окно, получившее сообщение WM_SETCURSOR, а переменная m_pSelection, принадлежащая классу просмотра, указывает на выделенный объект.

5. Вызвать класс ClassWizard и добавить к классу CContainerAppView функцию O nLButtonDown.

6. Добавить в функцию OnLButtonDown после комментария TODO следующие строки кода:

CСontainerAppCntrItem* pHitItem=GetHitItem(point);

SetObjectAsSelected(pHitItem);

If (pHitItem==NULL)

Return;

CrectTracker tracker;

SetupTracker(&tracker,pHitItem);

UpdateWindows();

If(!tracker.Track(this,point))

Return;

Invalidate();

PHitItem->m_objectRect=tracker.m_rect;

CСontainerAppDoc* pDoc=GetDocument();

PDoc->SetModifiedFlag();.

C помощью этого фрагмента кода программа определяет, что должно произойти в результате щелчка кнопкой мыши - выделение объекта или отмена выделения. Если щелчок обозначает выделение объекта, то объект CrectTracker отобразит рамку вокруг выделенного фрагмента. С помощью вызова функции-члена Track() предоставляется возможность управлять внедренным объектом, после чего окно объявляется, а документ помечается как измененный. Функция GetHitItem() определяет, находился ли указатель «мыши» во время щелчка на внедренном объекте.

7. Вызввть класс ClassWizard и добавить к классу CContainerAppView функцию OnLButtonDblClk().

8. Добавить в функцию OnLButtonDblClk() следующие строки кода:

OnLButtonDown(nFlags, point);

If (m_pSelection==NULL)

return;

SHORT keyState=GetKeyState(VK_CONTROL);

LONG oleVerb;

If (keyState<0)

OleVerb=OLEIVERB_OPEN;

Else

oleVerb=OLEIVERB_PRIMARY;

m_pSelection->DoVerb(oleVerb,this);.

В представленном коде сначала вызывается функция OnLButtonDown(), чтобы выполнить задачу выделения объекта. Если пользователь выделили объект программа определяет состояние клавиши Ctrl. Двойной щелчок при нажатой клавише Ctrl означает, что объект должен быть открыт. Если же во время двойного щелчка клавиша Ctrl не нажата, то выполняется основное действие - как правило, редактирование объекта.

9. Вызвать класс ClassWizard и добавить к классу CContainerAppView функцию SetupTracker(). При этом в поле Function Type нужно задать void, в поле Function Declaration (объявление функции) – SetupTracker(CrectTracker* p*Tracker, CconainerAppCntrItem* pObject), а для параметра A ccess выбрать значение Protected.

10. В функцию SetupTracker() включить следующие строки кода:

pTracker->m_rect = pObject->m_objectRect;

if (pOject==m_pSelection)

pTracker->m_nStyle|=CrectTracker::resizeInside;

OLE_OBJTYPE objType=pObject->GetType();

If (objType==OT_EMBEDDED)

pTracker->m_Style | =CrectTracker::solidLine;

Else

if (objType==OT_LINK)

pTracker->m_nStyle |= CrectTracker::dottedLine;

UINT objectState=pObject->GetItemState();

if ((objectState==ColeClientItem::activeUIState) ||

(objectState==ColeClientItem::openState))

pTracker->m_nStyle | =CRectTracker::haatchInside;.

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

11. Вызвать класс ClassWizard и добавить к классу CContainerAppView функцию GetHitItem(). При этом в поле Function Typ e нужно задать CСontainerAppCntrItem*, в поле Function Declaration (объявление функции) – GetHitItem (CPoint point), а для параметра Access выбрать значение Protected.

12. В функцию GetHitItem(). включить следующие строки:

CСontainerAppCntrItem* pObjectHit=NULL;

CСontainerAppDoc* pDoc=GetDocument();

BOOL objectHit;

POSITION pos=pDoc->GetStartPosition();

While (pos!=NULL)

{

CContainerAppCntrItem* pObject=

(CСontainerAppCntrItem*) pDoc->GetNextItem(pos);

objectHit=pObject->m_objectRect.PtInRect(point);

If(objectHit)

pObjectHit=pObject;

}

Return pObjectHit;.

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

13. Вызвать класс ClassWizard и добавить к классу CСontainerAppView функцию SetObjectAsSelected(). При этом в поле Function Type нужно задать void, в поле Function Declaration (объявление функции) – SetObjectAsSelected(CcontainerAppCnrtItem* pObject), а для параметра Access выбрать значение Protected.

14. В функцию SetObjectAsSelected() включить следующие строки кода:

CСontainerAppDoc* pDoc=GetDocument();

if ((m_Selection!= pObject) || (pObject==NULL))

{

ColeClientItem* pActiveObject=

PDoc->GetInPlaceActiveItem(this);

if ((pActiveObject!=pObject) && (pActiveObject!=NULL))

pActiveObject->Close();

m_Selection=pObject;

Invalidate();.

Этот код определяет, где именно пользователь щелкнул «мышью» – на объекте или в другой области окна. Если щелчок выполнен на объекте и при этом выделен некоторый другой объект, функция закрывает ранее выделенный объект. Указатель на выделенный объект сохраняется в переменной m_pMember, и происходит вызов функции Invalidate(), в результате чего окно обновляется.

Теперь приложение полностью готово.

 

9.2.Требования к программе:

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

4. Выделять объект с помощью «мыши».

5. Перемещать объект с помощью «мыши».

6. Изменять размеры объекта с помощью «мыши».

В качестве внедряемого объекта рекомендуется использовать объект, представляющий растровое изображение (Bitmap Image Object)

Отчет должен содержать: постановку задачи, листинг кода всех модифицированных функций и их назначение, выводы.

Варианты заданий.

9.4.Контрольные вопросы

1. Технология OLE.

2. Приложение-контейнер.

3. Приложение-сервер.

4. Технология COM.

5. Основные шаги создания проекта заготовки приложения-контейнера.

6. Класс представления внедренного объекта в MFC.

7. Функция перемещения внедренного объекта.

8. Функция, определяющая текущее расположение объекта.

9. Функция, хранящая информацию о размерах и координатах внедренных объектов.

10. Объект, отображающий вокруг внедренного объекта рамку и изменяющий внешний вид указателя «мыши».

11. Функция, переопределяющая изменения указателя мыши при позиционировании на внедренном объекте.

12. Событие, определяющее выполнение OLE–действия, определенного для этого объекта.

13. Функция удаления объекта.

 

Лабораторная работа № 10

Стили окон.

Цель работы. Изучение различных типов окон, которые может создать приложение Windows.

Теоретические сведения

Обычно ни одно приложение не ограничивается созданием главного окна приложения. Как правило, внутри главного окна создаются другие окна.

Для создания окна вам необходимо зарегистрировать класс окна. Есть классы окон, зарегистрированные при инициализации Windows. Ваше приложение может создавать окна либо на базе собственных классов (созданных и зарегистрированных приложением), либо на базе готовых классов, созданных и зарегистрированных самой операционной системой Windows.

Рассмотрим только об окнах, созданных приложениями на базе своих собственных классов окон. На базе одного класса окна приложение может создать несколько окон. Все эти окна могут быть сделаны в одном или нескольких стилях. Стиль окна определяет внешний вид окна и его поведение. Для класса окна также определяется понятие стиля - стиль класса определяет внешний вид и поведение всех окон, созданных на базе данного класса.

Стиль класса окна определяется при регистрации класса окна. Во всех предыдущих примерах приложений мы не задавали стиль окна, определяя содержимое соответствующего поля в структуре WNDCLASS следующим образом: wc.style = 0;

Стиль класса окна задается в виде отдельных битов, для которых в файле windows.h определены символические константы (табл.10.1.) с префиксом CS _: Табл.10.1.

Стиль Описание
CS_BYTEALIGNCLIENT Внутренняя область окна (client area) должна быть выровнена по границе байта видеопамяти. Иногда используется для ускорения процесса вывода изображения
CS_BYTEALIGNWINDOW Все окно (не только внутренняя область окна) должно быть выровнено по границе байта видеопамяти
CS_CLASSDC Необходимо создать единый контекст отображения, который будет использоваться всеми окнами, создаваемыми на базе данного класса
CS_DBLCLKS Функция окна будет получать сообщения при двойном щелчке клавишей мыши (double click)
CS_GLOBALCLASS Данный класс является глобальным и доступным другим приложениям. Другие приложения могут создавать окна на базе этого класса
CS_HREDRAW Внутренняя область окна должна быть перерисована при изменении ширины окна
CS_NOCLOSE В системном меню окна необходимо запретить выбор функции закрытия окна (строка Close будет отображаться серым цветом, и ее нельзя выбрать)
CS_OWNDC Для каждого окна, определяемого на базе данного класса, будет создаваться отдельный контекст отображения
CS_PARENTDC Окно будет пользоваться родительским контекстом отображения, а не своим собственным. Родительский контекст - это контекст окна, создавшего другое окно (см. дальше)
CS_SAVEBITS Для данного окна Windows должна сохранять изображение в виде битового образа (bitmap). Если такое окно будет перекрыто другим окном, то после уничтожения перекрывшего окна изображение первого окна будет восстановлено Windows на основании сохраненного ранее образа
CS_VREDRAW Внутренняя область окна должна быть перерисована при изменении высоты окна

Чаще всего используются стили CS_HREDRAW и CS_VREDRAW:

wc.style = CS_HREDRAW | CS_VREDRAW;

Если для класса заданы стили CS_HREDRAW и CS_VREDRAW, при изменении размеров окна функция окна может получить сообщение WM_PAINT. В этом случае функция окна должна перерисовать часть окна или все окно. Разумеется, если вы просто уменьшили размер окна, перерисовывать ничего не надо, и функция окна в этом случае не получит сообщения WM_PAINT.

Стиль CS_DBLCLKS используется при необходимости отслеживать двойные щелчки мышью. При этом в функцию окна посылаются сообщения WM_LBUTTONDBLCLK и WM_RBUTTONDBLCLK. Если этот стиль не будет задан, как бы быстро вы ни щелкали мышью, функция окна получит только идущие парами сообщения о том, что вы нажимаете и отпускаете левую или правую клавишу мыши.

Остальные приведенные выше классы окна используются реже. Мы будем рассказывать о них по мере необходимости.

Стиль окна. Определенный в классе окна стиль класса окна используется при создании на базе этого класса всех окон. Для дальнейшего уточнения внешнего вида и поведения окна используется другая характеристика - стиль окна. Стиль окна указывается при создании окна функцией CreateWindow. В наших примерах основное окно приложения не имело стиля класса окна, но для него был определен стиль окна WS_OVERLAPPEDWINDOW:

hwnd = CreateWindow(szClassName, // имя класса окна szWindowTitle, // заголовок окна WS_OVERLAPPEDWINDOW, // стиль окна CW_USEDEFAULT, // задаем размеры и расположение CW_USEDEFAULT, // окна, принятые по умолчанию CW_USEDEFAULT, CW_USEDEFAULT, 0, // идентификатор родительского окна 0, // идентификатор меню hInstance, // идентификатор приложения NULL); // указатель на дополнительные // параметры

Для определения стиля окна используются символические константы с префиксом WS_, определенные в файле windows.h. С помощью этих констант можно определить примерно два десятка стилей окна, однако чаще всего используются несколько основных стилей.

Мы рассмотрим три основных стиля окон - перекрывающиеся окна (overlapped window), временные окна (pop-up window) и дочерние окна (child window).

Перекрывающиеся (overlapped) окна обычно используются в качестве главного окна приложения. Такие окна имеют заголовок (title bar), рамку и, разумеется, внутреннюю часть окна (client region). Дополнительно перекрывающиеся окна могут иметь (а могут и не иметь) системное меню, кнопки для максимального увеличения размера окна и для сворачивания окна в пиктограмму, вертикальную и горизонтальную полосу просмотра (scroll bar) и меню.

В первых версиях операционной системы Windows (версии 1.х) окна располагались рядом и назывались tiled window (tile - черепица). Сейчас такие окна не используются, вместо них появились перекрывающиеся окна, способные перекрывать окна других приложений. Перекрывающиеся окна называются также окнами верхнего уровня (top-level window).

Файл windows.h содержит следующее определение стиля перекрывающегося окна:

#define WS_OVERLAPPED 0x00000000L

Для определения стиля перекрывающегося окна необходимо использовать символическую константу WS_OVERLAPPEDWINDOW, определенную как логическое ИЛИ нескольких констант:

#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | WS_CAPTION | \ WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | \ WS_MAXIMIZEBOX)

Константа WS_OVERLAPPED определяет базовый стиль окна - перекрывающееся окно. Стиль WS_OVERLAPPEDWINDOW в добавление к базовому указывает, что окно должно иметь заголовок (константа WS_CAPTION), системное меню (WS_SYSMENU), толстую рамку для изменения размера окна (WS_THICKFRAME), кнопку минимизации размера окна (WS_MINIMIZEBOX) и кнопку для максимального увеличения размера окна (WS_MAXIMIZEBOX). Если окно имеет заголовок, вы можете его перемещать по экрану.

Если в предыдущем примере изменить стиль окна, то создаётся свой собственный с использованием приведенных выше констант.

Приложение Windows может создавать несколько окон, связанных между собой "узами родства" и "отношениями собственности". В частности, при создании перекрывающегося окна при помощи функции CreateWindow в качестве восьмого параметра функции вы можете указать так называемый идентификатор окна-владельца. Окно-владелец уже должно существовать на момент создания второго окна, имеющего владельца.

Таким образом, если созданы несколько перекрывающихся окон, одни окна могут принадлежать другим.

Если окно-хозяин сворачивается в пиктограмму, все окна, которыми оно владеет, становятся невидимыми. Если вы сначала свернули в пиктограмму окно, которым владеет другое окно, а затем и окно-хозяин, пиктограмма первого (подчиненного) окна исчезает.

Если уничтожить окно, автоматически уничтожаются и все принадлежащие ему окна.

Обычное перекрывающееся окно, не имеющее окна-владельца, может располагаться в любом месте экрана и принимать любые размеры. Подчиненные окна располагаются всегда над поверхностью окна-владельца, загораживая его.

Координаты создаваемых функцией CreateWindow перекрывающихся окон указываются по отношению ко всему экрану. Таким образом, если создать перекрывающееся окно с координатами (0, 0), оно будет расположено в верхнем левом углу экрана.

Временные (pop-up) окна. Другим базовым стилем является стиль временных окон, которые обычно используются для вывода информационных сообщений и остаются на экране непродолжительное время. Временные окна имеют стиль WS_POPUP, определенный в файле windows.h следующим образом:

#define WS_POPUP 0x80000000L

Временные окна, в отличие от перекрывающихся, могут не иметь заголовок (title bar). Если для временного окна определен заголовок, оно может иметь и системное меню. Часто для создания временных окон, имеющих рамку, используется стиль WS_POPUPWINDOW, определенный в файле windows.h следующим образом:

#define WS_POPUPWINDOW (WS_POPUP | WS_BORDER | WS_SYSMENU)

Если надо добавить к временному окну системное меню и заголовок, стиль WS_POPUPWINDOW следует использовать в комбинации со стилем WS_CAPTION, добавляющим заголовок.

Временные окна могут иметь окно владельца и могут сами владеть другими окнами. Все замечания, сделанные нами относительно владения перекрывающимися окнами, справедливы и для временных окон.

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

При изменении размеров временного окна (так же, как и дочернего) функция окна получает сообщение WM_PAINT, в параметрах которого указаны новые размеры окна.

В общем случае вы можете рассматривать временные окна как специальный вид перекрывающихся окон.

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

Базовый стиль дочерних окон определяется при помощи константы WS_CHILD:

#define WS_CHILD 0x40000000L

По аналогии с другими базовыми стилями в файле windows.h определена константа WS_CHILDWINDOW, которая полностью эквивалентна константе WS_CHLD:

#define WS_CHILDWINDOW (WS_CHILD)

В отличие от перекрывающихся и временных окон дочерние окна, как правило, не имеют рамки, заголовка, кнопок минимизации и максимального увеличения размера окна, а также полос просмотра. Дочерние окна сами рисуют все, что в них должно быть изображено.

Особенности дочерних окон.

1. Само собой разумеется, что дочерние окна должны иметь окно-родителя (окон-сирот не бывает!). Только дочерние окна могут иметь родителей, перекрывающие и временные окна могут иметь окно-хозяина, но не родителя. У дочерних окон могут быть "братья" (или "сестры", кому, что больше нравится).

2. Дочерние окна всегда располагаются на поверхности окна-родителя. При создании дочернего окна начало системы координат расположено в левом верхнем углу внутренней поверхности окна-родителя (но не в верхнем углу экрана, как это было для перекрывающихся и временных окон).

3. Так как дочерние окна перекрывают окно-родителя, если вы сделаете щелчок мышью над поверхностью дочернего окна, сообщение от мыши попадет в функцию дочернего, но не родительского окна.

4. При создании дочернего окна в качестве девятого параметра (вместо идентификатора меню, которого не может быть у дочернего окна) функции CreateWindow необходимо указать созданный вами идентификатор дочернего окна. Таким образом, если для какого-либо окна приложения вы создаете несколько дочерних окон, необходимо для каждого окна указать свой идентификатор (типа int). Этот идентификатор будет использован дочерним окном при отправлении сообщений родительскому окну, поэтому вы должны при создании разных дочерних окон использовать разные идентификаторы, хотя это и не обязательно.

5. Дочернее окно как бы "прилипает" к поверхности родительского окна и перемещается вместе с ним. Оно никогда не может выйти за пределы родительского окна. Все дочерние окна скрываются при сворачивании окна-родителя в пиктограмму и появляются вновь при восстановлении родительского окна.

6. При изменении размеров родительского окна дочерние окна, на которых отразилось такое изменение (которые вышли за границу окна и появились вновь), получают сообщение WM_PAINT. При изменении размеров родительского окна дочерние окна не получают сообщение WM_SIZE. Это сообщение попадает только в родительское окно.

Список стилей окна. Полный список возможных стилей окна, определенных в виде символических констант в файле windows.h. Некоторые из стилей приведены в табл.10.2.

Табл. 10.2.

Имя константы Описание стиля
WS_BORDER Окно с рамкой
WS_CAPTION Окно с заголовком. Этот стиль несовместим со стилем WS_DLGFRAME. Пр


Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 481; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.123.194 (0.014 с.)