Tárgyak ole, klub programozók
Konténerek és szerverek
A mechanizmus OLE, két alkalmazás van - tartalmazó alkalmazásokat tárgy, és az alkalmazások, amelyek felhívják szerkesztésére az objektumot. Alkalmazás tartalmazó nevű objektum egy konténer. Az alkalmazás szerkesztéséhez használt tárgy, úgynevezett szerver. Hangsúlyozzuk, hogy ugyanaz a szoftver egyszerre, és a tárolótér és a kiszolgáló rész.
Vezérlők és az automatizálás szerverek
Automation Server saját módszereit és tulajdonságait más alkalmazásokat. Olyan alkalmazás, amely képes kezelni a szerver, az úgynevezett automatizálási vezérlők. Megjegyezzük ezzel kapcsolatban, hogy az ActiveX vezérlők nem más, mint egy automatizálási szerver.
1. Hozza létre a MFC-nevű alkalmazás ole.
2. Alkalmazás típusa lapcsoport zászlók egységes dokumentum (SDI) és használat MFC statikus könyvtár.
3. vegyület irattámasz lapon állítsa be a zászló Container
4. A többi beállítás lehet hagyni a lelkiismerete.
5. generált Classes lapon megtekintheti az osztályok jegyzékét, ahonnan alkalmazás osztály lesz kialakítva. Ezek az osztályok ColeApp - class alkalmazás ColeView - véli osztály, ColeDoc - class dokumentum CmainFrame - class ablakkeret, ColeCntrItem - class OLE-objektumot.
Fordítsuk a projekt és futtatni. A Szerkesztés menü, akkor csak az aktív elemet Insert New Object. Ez teszi lehetővé számunkra, hogy a mi általunk választott dokumentum objektumot. Válassza ezt az opciót. A megjelenő ablakban kiválaszthatja, hogy milyen típusú objektum kerül a mi tartályban.
A lista elem egy Microsoft Word dokumentumot, és kattintson a Tovább gombra, hogy OK. Az ablakban a mi kérelem tárgya lesz - Word dokumentumot. Ügyeljen arra, hogy a Szerkesztés menü. Ez az Ige menü. Az egyetlen kivétel, válasszuk a Fájl, amely összhangban van az alkalmazás. Ezen túlmenően, és MS Word eszköztár jelenik meg az ablakban.
Az egér használata, módosítsa a méretek létesítmény és naberom szöveget.
Kattintson a Tovább gombra az Esc gombot - a tárgy eltűnik a mi ablakot, de a szöveget gépelt benne. Figyeljünk arra, hogy a létesítmény nem aktív vagy de aktiválható kattintással, mint amilyennek lennie kellene a szokásos OLE. E hátrány, és lesz az egyik pontot a mi további megfontolásra.
Ahhoz, hogy újra aktiválja a projekt (korábban deaktiválja az ESC gomb megnyomásával), meg kell fellebbezni a ponton a szerkesztés / Object / Edit menüben.
A vizsgálati terv modulok eljutottunk a furcsa, első pillantásra, a felfedezés. A projekt két funkciója van.
void ColeDoc :: Serialize (CArchive ar)
<
if (ar.IsStoring ())
<
// kiegészítő kód menteni egy dokumentumot, az archívumban
>
más
<
// további helyreállítási kódot az archívumban
>
// A funkciót szerializálni bázis osztály
// menteni az objektum, amely jelenleg a tartályban.
COleDocument :: Serialize (ar);
>
Különösen azt kell figyelni, hogy az utolsó hívás:
Ez egy nagyon fontos kihívás. A kis tanulmány, amely azt javasoljuk, hogy tartsa meg, kedves olvasó, azt mutatja, hogy ezt a funkciót nevezik szerializációja CntrItem.cpp modult. Itt a funkció:
érvényteleníti ColeCntrItem :: Serialize (CArchive ar)
<
ASSERT_VALID (e);
// menteni (helyreállítása) az objektum található
// Mivel ezen a ponton a tartályban
COleClientItem :: Serialize (ar);
if (ar.IsStoring ())
<
// tárolhat egyéb adatok osztályú támogatás
// kifogást a tartály
>
más
<
// visszaállítani az adatokat a másik osztály támogatása
// objektumot a tartályban
>
>
Ösztönösen, az egész pont ezt a funkciót. Vesszük az eredeti, hogy az adatok biztonsági mentést végez-e. Következésképpen a helyzet adat-helyreállítást. Mivel az adatok hasznosítása és ugyanazt a funkciót, akkor nyilvánvaló, hogy az adat helyreállítás is helyes végrehajtását. Így, az oka a megjelenését az objektum nem található osztályban ColeClientItem módszerek. Értelmében a legmegfelelőbb módszer DoVerb módszer.
virtuális BOOL DoVerb
(
HOSSZÚ nVerb,
CView * pView,
LPMSG lpMsg = NULL
)
Ezt a módszert alkalmazzák a termék a lépések által meghatározott az első paraméter. A második és a harmadik paraméter általában feltételezzük, hogy NULL, mégis, akkor tegye vissza a mutatót az objektum renderelés. Action [benyújtja szerkesztési objektum] határozza meg az első paraméter a -1 (vagy 0). Jelentése -2 meghatározza szerkesztési objektumot egy külön ablakban. Ennek eredményeként a sorba rendezést, akkor a gépet a tartályba, és hogy szerkesztésére a tárgy fog kinézni. Ehelyett DoVerb funkció, akkor a módszer
érvényteleníti ColeCntrItem :: Serialize (CArchive ar)
<
ASSERT_VALID (e);
COleClientItem :: Serialize (ar);
if (ar.IsStoring ())
<
>
más
<
this-> DoVerb (0, this-> GetActiveView ());
GetActiveView () -> m_pSelection = e;
GetDocument () -> UpdateAllViews (NULL);
>
>
Megmutattuk hozzávetőleges érvelés, amely gyakran kell követni munka közben, mint egy programozó, és nincs kéznél a teljes dokumentációt.
Így tudjuk menteni és visszaállítani a konténer objektum. Most tovább javítja a projekt.
Tűztük a következő probléma: a tárgy mozog, és változtatja a helyét. Új tag osztály ColeCntrItem m_rect típusú CRect. Ez a változó információt tárol a vizuális objektum helyének. Most vigyázni, hogy ez a változó maradt serialization. Ehhez ismét átírja a funkció serialize
érvényteleníti ColeCntrItem :: Serialize (CArchive ar)
<
ASSERT_VALID (e);
COleClientItem :: Serialize (ar);
if (ar.IsStoring ())
<
ar<
más
<
ar >> m_rect;
this-> DoVerb (0, this-> GetActiveView ());
GetActiveView () -> m_pSelection = e;
GetDocument () -> UpdateAllViews (NULL);
>
>
Átírása az osztály kivitelező ColeCntrItem így inicializálni a kezdeti érték az objektum pozícióját.
ColeCntrItem :: ColeCntrItem (ColeDoc * pContainer)
: COleClientItem (pContainer)
<
m_rect = CRect (20,20,300,300);
>
Találunk itt oleView.cpp modul funkciója
érvényteleníti ColeView :: OnDraw (CDC * PDC)
Ebben találjuk a hívás
és cserélje ki egy
Tag m_pSelection osztály ColeView kommunikál a képviselet és a tárgy van a tartályban. Térjünk a funkció
érvényteleníti ColeCntrItem :: OnGetItemPosition (CRect rPosition)
Ezt a funkciót akkor visszatér egy téglalap objektumot. Megváltoztatni ezt a funkciót, hogy tartalmaz egyetlen sort.
érvényteleníti ColeCntrItem :: OnGetItemPosition (CRect rPosition)
<
rPosition = m_rect;
>
A merev rögzítés a tárgyak nem jó. Ahhoz, hogy a rendszer sokkal rugalmasabb, térjünk a funkció ColeCntrItem :: OnChangeItemPosition. Ezt a funkciót nevezik minden alkalommal változik a helyét és méretét az objektum a tartályban. Itt a szöveg a funkciót.
BOOL ColeCntrItem :: OnChangeItemPosition (const CRect rectPos)
<
ASSERT_VALID (e);
if (! COleClientItem :: OnChangeItemPosition (rectPos))
return false;
A paraméter ennek a funkciónak éppen ez a helyzet az új helyét az objektum. Add hozzá a következő funkciókat funkciót.
// Emlékezz az új méretet
m_rect = rectPos;
// állítsa a kép frissítése zászló
GetDocument () -> SetModifiedFlag ();
// frissíti a kijelző
GetDocument () -> UpdateAllViews (NULL);
Ennek eredményeként, jöttünk, hogy egy alkalmazás, amely lehetővé teszi, hogy hozzanak egy konténer objektum, szerkesztheti, módosíthatja annak méretét és helyzetét, hogy megőrizzék a tárgy és annak állapotát a fájlt, és visszaállíthatja onnan.