Обекти оле, клуб за програмисти
Контейнери и сървъри
В механизма на OLE, има две приложения - приложения, съдържащи обекти и приложения, които призовават за редактиране на обекта. Приложение съдържащ обект нарича контейнер. Приложението използва за редактиране на обекта, наречен сървър. Ще подчертая, че един и същ софтуер може едновременно и от страна на контейнера и част сървър.
Контрольори и сървъри за автоматизация
Server автоматика осигурява на своите собствени методи и свойства на други приложения. Приложение, което използва възможността за управление на сървъра, наречен контролери за автоматизация. Трябва да отбележим, във връзка с това, че контролите на ActiveX са нищо повече от един сървър на автоматизация.
1. Създаване на MFC-приложение, наречено оле.
2. Приложение раздела Тип комплект знамена единния документ (SDI) и ползване MFC в статична библиотека.
3. Съединение раздела Документ за поддръжка, задаване контейнера за знаме
4. останалите настройки могат да бъдат оставени на вашата съвест.
5. Generated раздела класове, можете да видите списък на класовете, от което ще се формира класове приложения. Тези класове ColeApp - клас за кандидатстване, ColeView - изглед към класа, ColeDoc - клас на документи, CmainFrame - рамка клас прозорец, ColeCntrItem - клас OLE сървър обект.
Съставете нашия проект и да го стартирате. От менюто Edit, ще видим само активна позиция Поставете нов обект. Тази позиция ни позволява да се сложи в нашия документ сме избрали обект. Изберете тази опция. В прозореца, който се появява, можете да изберете какъв тип обект ще бъде поставен в нашия съд.
В елемента от списък документ на Microsoft Word и щракнете до OK. В прозореца на нашата кандидатура ще бъде обект - документ на Word. Обърнете внимание на менюто Edit. Това меню Word. Единственото изключение е, изберете файла, който е в съответствие с нашата молба. Освен това, в лентата с инструменти и MS Word ще се появи в прозореца.
С помощта на мишката, да промените размерите на нашето съоръжение и да го naberom някакъв текст.
Кликнете върху до ключ Esc - обектът ще изчезне от нашия прозорец, но текстът ще бъде въведен в нея. Обърнете внимание на факта, че нашето съоръжение не е активирана или де активира от кликвания на мишката, тъй като тя трябва да бъде в стандартната OLE. За да се преодолее този недостатък и ще бъде един от точките на нашето по-нататъшно разглеждане.
За да активирате отново нашия проект (по-рано дезактивира чрез натискане на Esc), трябва да се подаде жалба до точката Edit Have / Object / Edit менюто.
дизайн модули учебни ни води до странно, на пръв поглед, откритието. Проектът има две функции.
нищожен ColeDoc :: Сериализирането (CArchive ар)
<
ако (ar.IsStoring ())
<
// допълнителен код, за да запазите документ в архива
>
още
<
// допълнително възстановяване код от архива
>
// извикаме функцията Сериализирането базов клас е
// спаси обекта, който в момента е в контейнера.
COleDocument :: Сериализирането (AR);
>
Особено необходимо е да се обърне внимание на последното повикване:
Това е много важно предизвикателство. Малкият Проучването, което предлагам да се държите, скъпи читателю, показва, че тази функция се нарича сериализация на CntrItem.cpp модул. Ето на функцията:
анулира ColeCntrItem :: Сериализирането (CArchive ар)
<
ASSERT_VALID (това);
// спаси (възстановяване) на обекта е разположен
// Тъй като в този момент в контейнера
COleClientItem :: Сериализирането (AR);
ако (ar.IsStoring ())
<
// Можете да съхранявате други данни от подкрепа клас
// противопостави на контейнера
>
още
<
// възстановите данните от другата подкрепата клас
// обект в контейнера
>
>
Интуитивно, целият смисъл на тази функция. Ние приемаме за оригинала, че архивиране на данните се извършва правилно. Следователно случаят в възстановяване на данни. Тъй като данните да се възстановят и съща функция, е очевидно, че за възстановяване на данни също се извършва правилно. По този начин, причината за появата на обекта не е да се намерят в клас методи ColeClientItem. По смисъла на най-подходящия метод е метод DoVerb.
виртуален BOOL DoVerb
(
LONG nVerb,
CView * pView,
LPMSG lpMsg = NULL
)
Този метод се използва за продукта от стъпки, които се определят от първи параметър. На втория и третия параметър обикновено се предполага, че са NULL, обаче, можете да поставите обратно указател към оказване на обекта. Действие [представя редактиране обект] се определя от първия параметър -1 (или 0). Значение -2 определя редактиране обект в отделен прозорец. В резултат на функцията за сериализация, можете да стартирате в контейнера и да се предостави за редактиране на обекта ще изглежда така. Вместо DoVerb функция, можете да използвате метода
анулира ColeCntrItem :: Сериализирането (CArchive ар)
<
ASSERT_VALID (това);
COleClientItem :: Сериализирането (AR);
ако (ar.IsStoring ())
<
>
още
<
това-> DoVerb (0, това-> GetActiveView ());
GetActiveView () -> m_pSelection = това;
GetDocument () -> UpdateAllViews (NULL);
>
>
Показахме ви приблизителния ред на разсъждения, които често трябва да следват, докато работи като програмист и нямат под ръка на пълната документация.
Така че можем да спаси и възстановяване на обекта контейнер. Сега ние продължаваме да подобряваме нашия проект.
Поставяме си следния проблем: на обекта може да се движи и да промени позицията си. Добавяне на нов член на класа ColeCntrItem тип m_rect CRect. Тази променлива ще се съхранява информация за визуално позицията на обекта. Сега се погрижа за това, тази променлива остана на сериализация. За да направите това, за пореден път да пренапише функция Сериализирането
анулира ColeCntrItem :: Сериализирането (CArchive ар)
<
ASSERT_VALID (това);
COleClientItem :: Сериализирането (AR);
ако (ar.IsStoring ())
<
ар<
още
<
ар >> m_rect;
това-> DoVerb (0, това-> GetActiveView ());
GetActiveView () -> m_pSelection = това;
GetDocument () -> UpdateAllViews (NULL);
>
>
Препишете конструктор ColeCntrItem на класа, така да се инициализира на първоначалната стойност на позицията на обект.
ColeCntrItem :: ColeCntrItem (ColeDoc * pContainer)
: COleClientItem (pContainer)
<
m_rect = CRect (20,20,300,300);
>
Ние намираме в функция oleView.cpp модул
анулира ColeView :: OnDraw (CDC * PDC)
В него откриваме повикването
и го замени с
Държавите m_pSelection клас ColeView комуникира между изображението и обекта, съдържаща се в контейнера. Нека сега се обърнем към функцията
анулира ColeCntrItem :: OnGetItemPosition (CRect rPosition)
Тази функция трябва да се върне на правоъгълник обект. Променете тази функция, така че тя се състои от един-единствен ред.
анулира ColeCntrItem :: OnGetItemPosition (CRect rPosition)
<
rPosition = m_rect;
>
Твърдата фиксиране на обектите не е добро. За да направи системата по-гъвкава, нека се обърнем към ColeCntrItem функцията :: OnChangeItemPosition. Тази функция се нарича всеки път, когато се променя положението и големината на обекта в контейнера. Ето текста на функцията.
BOOL ColeCntrItem :: OnChangeItemPosition (Конст CRect rectPos)
<
ASSERT_VALID (това);
ако (! COleClientItem :: OnChangeItemPosition (rectPos))
върне FALSE;
Параметърът на тази функция е точно позицията на новото място на обекта. Добавете следния функции функция.
// Не забравяйте новия размер
m_rect = rectPos;
// зададете флага за обновяване на изображението
GetDocument () -> SetModifiedFlag ();
// актуализира на дисплея
GetDocument () -> UpdateAllViews (NULL);
В резултат на това стигнахме до приложение, което ви позволява да се постави в контейнер обект, да го редактирате, да промените неговия размер и позиция, за да се запази на обекта и неговото състояние в файл и да го възстановите от там.