Obiecte ole, club pentru programatori
Containere și servere
În mecanismul de OLE, există două aplicații - aplicații care conțin obiect și aplicații care necesită editarea obiectului. Cererea conține un obiect numit un container. Aplicația utilizată pentru a edita obiectul, numit un server. Subliniem că același software-ul poate simultan și partea recipientului și partea de server.
Controlorii și servere de automatizare
Automatizarea Server oferă propriile sale metode și proprietăți ale altor aplicații. O aplicație care utilizează capacitatea de a gestiona server, numit controler de automatizare. Menționăm în acest sens, că controalele ActiveX sunt nimic mai mult decât un server de automatizare.
1. Creați-aplicația MFC numit ole.
2. Aplicație steaguri set de file Tip singur document (SDI) și se folosește MFC într-o bibliotecă statică.
3. Compus fila Suport pentru documente, setați container de pavilion
4. Setările rămase pot fi lăsate pe conștiință.
5. fila Clase generate, puteți vizualiza o listă de clase, din care vor fi formate clase de aplicații. Aceste clase ColeApp - aplicații de clasă, ColeView - clasa de vedere, coledoc - Document de clasă, CMainFrame - rama ferestrei de clasă, ColeCntrItem - obiect server de clasă OLE.
Compilați proiectul nostru și rulați-l. Din meniul Edit, vom vedea numai activ Inserați elementul nou obiect. Acest articol ne permite să pună în documentul nostru am ales obiect. Selectați această opțiune. În fereastra care apare, puteți alege ce tip de obiect va fi plasat în containerul nostru.
În elementul din listă un document Microsoft Word și faceți clic pe lângă OK. În fereastra aplicației noastre va fi obiectul - documentul Word. Fiți atenți la meniul Edit. Acest meniu Word. Singura excepție este, selectați File, care este în conformitate cu cererea noastră. În plus, bara de instrumente și MS Word va apărea în fereastra.
Folosind mouse-ul, schimba dimensiunile noastre facilitatea și naberom un text.
Faceți clic pe lângă tasta Esc - obiectul va dispărea din fereastra noastră, dar textul va fi scris în ea. Acordați atenția asupra faptului că instalația noastră nu este activată sau deselectați activată prin clicuri de mouse, așa cum ar trebui să fie în OLE standardul. Pentru a depăși acest dezavantaj și va fi unul dintre punctele de examinare noastre în continuare.
Pentru a reactiva proiectul nostru (anterior dezactivat prin apăsarea Esc), trebuie să apeleze la punctul Edit Have / obiect / Editare meniu.
Modulele de proiectare studiu ne aduce la ciudat, la prima vedere, descoperirea. Proiectul are două funcții.
void coledoc :: Serialize (CArchive ar)
<
if (ar.IsStoring ())
<
// cod suplimentar pentru a salva un document în arhiva
>
altfel
<
// cod suplimentar de recuperare din arhiva
>
// apela funcția serializarea o clasă de bază este
// a salva obiectul care este în prezent în container.
COleDocument :: Serialize (ar);
>
Mai ales, este necesar să se acorde o atenție la ultimul apel:
Aceasta este o provocare foarte importantă. Micul studiu, pe care propun să vă țineți, dragă cititor, arată că această funcție este numit serializare a modulului CntrItem.cpp. Iată funcția:
anula ColeCntrItem :: Serialize (CArchive ar)
<
ASSERT_VALID (aceasta);
// salva (restaura) obiectul este localizat
// Deoarece în acest moment în container
COleClientItem :: Serialize (ar);
if (ar.IsStoring ())
<
// Puteți stoca alte date din clasa de sprijin
Obiect // la container
>
altfel
<
// restaura datele din celălalt suport de clasă
// obiect în container
>
>
Intuitiv, întregul punct al acestei funcții. Noi luăm pentru original, care de backup de date este efectuat corect. În consecință, în cazul de recuperare de date. Având în vedere că datele sunt recuperate și aceeași funcție, este evident că recuperarea de date este, de asemenea, efectuat corect. Astfel, motivul pentru apariția obiectului este de a nu fi găsit în metodele de clasa ColeClientItem. În sensul metoda cea mai potrivită este metoda DoVerb.
DoVerb BOOL virtuale
(
LONG nVerb,
CView * pView,
LPMSG lpMsg = NULL
)
Această metodă este utilizată pentru produsul etapelor care este determinat de primul parametru. Al doilea și al treilea parametru sunt în general, presupune a fi NULL, deși, puteți pune înapoi un pointer la redarea obiectului. Acțiunea [submit editare obiect] este determinată de primul parametru la -1 (sau 0). Semnificație -2 determină editare obiect într-o fereastră separată. Ca urmare a funcției de serializare, puteți porni în container și pentru a asigura editarea obiectului va arata. În schimb funcția DoVerb, puteți utiliza metoda
anula ColeCntrItem :: Serialize (CArchive ar)
<
ASSERT_VALID (aceasta);
COleClientItem :: Serialize (ar);
if (ar.IsStoring ())
<
>
altfel
<
this-> DoVerb (0, this-> GetActiveView ());
GetActiveView () -> m_pSelection = aceasta;
GetDocument () -> UpdateAllViews (NULL);
>
>
Noi ți-a arătat linia aproximativă de raționament, care de multe ori trebuie să urmeze în timp ce lucra ca programator și nu au la îndemână documentația completă.
Deci, putem salva și de a restabili obiectul container. Acum vom continua să îmbunătățim proiectul nostru.
Ne propunem următoarea problemă: obiectul se poate muta și schimba poziția. Adăugați o nouă clasă de membru ColeCntrItem tip m_rect CRect. Această variabilă va stoca informații despre poziția vizuală a obiectului. Acum avea grijă de faptul că, această variabilă a rămas la serializare. Pentru a face acest lucru, încă o dată rescrie serializare funcția
anula ColeCntrItem :: Serialize (CArchive ar)
<
ASSERT_VALID (aceasta);
COleClientItem :: Serialize (ar);
if (ar.IsStoring ())
<
Ar<
altfel
<
Ar >> m_rect;
this-> DoVerb (0, this-> GetActiveView ());
GetActiveView () -> m_pSelection = aceasta;
GetDocument () -> UpdateAllViews (NULL);
>
>
Rescrie constructorul ColeCntrItem clasa astfel încât să inițializa valoarea inițială a poziției obiectului.
ColeCntrItem :: ColeCntrItem (coledoc * pContainer)
: COleClientItem (pContainer)
<
m_rect = CRect (20,20,300,300);
>
Ne găsim în funcție de modul oleView.cpp
anula ColeView :: OnDraw (CDC * pDC)
În ea găsim apelul
și înlocuiți-l cu un
Membru m_pSelection clasa ColeView comunică între reprezentarea și obiectul conținut în recipient. Să ne întoarcem acum la funcția
anula ColeCntrItem :: OnGetItemPosition (CRect rPosition)
Această funcție trebuie să returneze un obiect dreptunghi. Schimbați această funcție, astfel încât acesta cuprinde un singur rând.
anula ColeCntrItem :: OnGetItemPosition (CRect rPosition)
<
rPosition = m_rect;
>
Fixarea rigidă a obiectelor nu este bun. Pentru a face sistemul mai flexibil, să ne întoarcem la ColeCntrItem funcția :: OnChangeItemPosition. Această funcție este numită de fiecare dată când schimbă poziția și mărimea obiectului în container. Aici este textul funcției.
BOOL ColeCntrItem :: OnChangeItemPosition (Const CRect rectPos)
<
ASSERT_VALID (aceasta);
if (! COleClientItem :: OnChangeItemPosition (rectPos))
return false;
Parametrul acestei funcții este tocmai poziția noua locație a obiectului. Adăugați următoarea funcție de caracteristici.
// Amintiți-vă de noua dimensiune
m_rect = rectPos;
// setați pavilion de actualizare a imaginii
GetDocument () -> SetModifiedFlag ();
// actualizeaza display-
GetDocument () -> UpdateAllViews (NULL);
Ca rezultat, am ajuns la o aplicație care vă permite de a pune într-un obiect container, editați-l, schimba dimensiunea și poziția sa, pentru a păstra obiectul și starea acestuia în fișierul și pentru al restaura de acolo.