Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ta sekcja zawiera informacje na temat używania łączenia obiektów i osadzania (OLE) w kontrolkach edycji wzbogaconej.
Co musisz wiedzieć
Technologie
Warunki wstępne
- C/C++
- Programowanie interfejsu użytkownika systemu Windows
Instrukcje
Korzystanie z interfejsu edycji wzbogaconej
Zaawansowane kontrolki edycji uwidaczniają niektóre z ich funkcji za pośrednictwem interfejsów modelu obiektów składników (COM). Uzyskanie interfejsu z kontrolki umożliwia pracę z innymi obiektami w kontrolce. Ten interfejs można uzyskać, wysyłając komunikat EM_GETOLEINTERFACE. W interfejsie IRichEditOle można uzyskać interfejsy używane w Text Object Model.
Inny interfejs, IRichEditOleCallback, jest implementowany przez aplikacje w celu zdefiniowania zachowania kontrolki podczas interakcji z obiektami.
Wstawianie obiektu do kontrolki edycji wzbogaconej
Poniższy przykład kodu wstawia obiekt pliku do kontrolki edycji wzbogaconej. Jeśli program jest skojarzony z typem pliku na komputerze użytkownika (na przykład Microsoft Excel dla pliku .xls), zawartość pliku zostanie wyświetlona w kontrolce; w przeciwnym razie pojawi się ikona.
Pobierz interfejs IRichEditOle .
BOOL InsertObject(HWND hRichEdit, LPCTSTR pszFileName) { HRESULT hr; LPRICHEDITOLE pRichEditOle; SendMessage(hRichEdit, EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle); ...Tworzenie magazynu strukturalnego.
LPLOCKBYTES pLockBytes = NULL; hr = CreateILockBytesOnHGlobal(NULL, TRUE, &pLockBytes); LPSTORAGE pStorage; hr = StgCreateDocfileOnILockBytes(pLockBytes, STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage); ...Skonfiguruj format danych.
FORMATETC formatEtc; formatEtc.cfFormat = 0; formatEtc.ptd = NULL; formatEtc.dwAspect = DVASPECT_CONTENT; formatEtc.lindex = -1; formatEtc.tymed = TYMED_NULL; ...Pobierz wskaźnik do obszaru wyświetlania.
LPOLECLIENTSITE pClientSite; hr = pRichEditOle->GetClientSite(&pClientSite); ...Utwórz obiekt i pobierz jego interfejs IUnknown.
LPUNKNOWN pUnk; CLSID clsid = CLSID_NULL; hr = OleCreateFromFile(clsid, pszFileName, IID_IUnknown, OLERENDER_DRAW, &formatEtc, pClientSite, pStorage, (void**)&pUnk); pClientSite->Release(); ...Pobierz interfejs IOleObject do obiektu .
LPOLEOBJECT pObject; hr = pUnk->QueryInterface(IID_IOleObject, (void**)&pObject); pUnk->Release(); ...Aby upewnić się, że odwołania są poprawnie zliczane, powiadom obiekt, że jest on zawarty.
OleSetContainedObject(pObject, TRUE); ...Konfigurowanie informacji o obiekcie.
REOBJECT reobject = { sizeof(REOBJECT)}; hr = pObject->GetUserClassID(&clsid); reobject.clsid = clsid; reobject.cp = REO_CP_SELECTION; reobject.dvaspect = DVASPECT_CONTENT; reobject.dwFlags = REO_RESIZABLE | REO_BELOWBASELINE; reobject.dwUser = 0; reobject.poleobj = pObject; reobject.polesite = pClientSite; reobject.pstg = pStorage; SIZEL sizel = { 0 }; reobject.sizel = sizel; ...Przenieś karetkę na koniec tekstu i dodaj powrót karetki.
SendMessage(hRichEdit, EM_SETSEL, 0, -1); DWORD dwStart, dwEnd; SendMessage(hRichEdit, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); SendMessage(hRichEdit, EM_SETSEL, dwEnd+1, dwEnd+1); SendMessage(hRichEdit, EM_REPLACESEL, TRUE, (WPARAM)L"\n"); ...Wstaw obiekt.
hr = pRichEditOle->InsertObject(&reobject); ...Sprzątaj
pObject->Release(); pRichEditOle->Release(); return TRUE; }
Korzystanie z interfejsu IRichEditOleCallback
Aplikacje implementują interfejs IRichEditOleCallback w celu reagowania na zapytania lub akcje związane z OLE, które są wykonywane przez kontrolkę zaawansowanej edycji. Implementację interfejsu można skojarzyć z kontrolką, wysyłając komunikat EM_SETOLECALLBACK. Następnie kontrolka wywołuje metody implementacji interfejsu zgodnie z potrzebami.
Na przykład QueryAcceptData jest wywoływana, gdy użytkownik próbuje przeciągnąć lub wkleić obiekt do kontrolki. Jeśli aplikacja może zaakceptować dane, implementacja metody zwraca S_OK; w przeciwnym razie zwraca kod błędu. Metoda może również podjąć inną akcję, taką jak ostrzeżenie użytkownika, że nie można umieścić plików tego typu w kontrolce.
Ukończ przykładową funkcję InsertObject
Poniższy przykład kodu przedstawia poprzednie fragmenty kodu połączone w jedną kompletną funkcję, która obejmuje obsługę błędów.
BOOL InsertObject(HWND hRichEdit, LPCTSTR pszFileName)
{
HRESULT hr;
LPRICHEDITOLE pRichEditOle;
SendMessage(hRichEdit, EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle);
if (pRichEditOle == NULL)
{
return FALSE;
}
LPLOCKBYTES pLockBytes = NULL;
hr = CreateILockBytesOnHGlobal(NULL, TRUE, &pLockBytes);
if (FAILED(hr))
{
return FALSE;
}
LPSTORAGE pStorage;
hr = StgCreateDocfileOnILockBytes(pLockBytes,
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE,
0, &pStorage);
if (FAILED(hr))
{
return FALSE;
}
FORMATETC formatEtc;
formatEtc.cfFormat = 0;
formatEtc.ptd = NULL;
formatEtc.dwAspect = DVASPECT_CONTENT;
formatEtc.lindex = -1;
formatEtc.tymed = TYMED_NULL;
LPOLECLIENTSITE pClientSite;
hr = pRichEditOle->GetClientSite(&pClientSite);
if (FAILED(hr))
{
return FALSE;
}
LPUNKNOWN pUnk;
CLSID clsid = CLSID_NULL;
hr = OleCreateFromFile(clsid, pszFileName, IID_IUnknown, OLERENDER_DRAW,
&formatEtc, pClientSite, pStorage, (void**)&pUnk);
pClientSite->Release();
if (FAILED(hr))
{
return FALSE;
}
LPOLEOBJECT pObject;
hr = pUnk->QueryInterface(IID_IOleObject, (void**)&pObject);
pUnk->Release();
if (FAILED(hr))
{
return FALSE;
}
OleSetContainedObject(pObject, TRUE);
REOBJECT reobject = { sizeof(REOBJECT)};
hr = pObject->GetUserClassID(&clsid);
if (FAILED(hr))
{
pObject->Release();
return FALSE;
}
reobject.clsid = clsid;
reobject.cp = REO_CP_SELECTION;
reobject.dvaspect = DVASPECT_CONTENT;
reobject.dwFlags = REO_RESIZABLE | REO_BELOWBASELINE;
reobject.dwUser = 0;
reobject.poleobj = pObject;
reobject.polesite = pClientSite;
reobject.pstg = pStorage;
SIZEL sizel = { 0 };
reobject.sizel = sizel;
SendMessage(hRichEdit, EM_SETSEL, 0, -1);
DWORD dwStart, dwEnd;
SendMessage(hRichEdit, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd);
SendMessage(hRichEdit, EM_SETSEL, dwEnd+1, dwEnd+1);
SendMessage(hRichEdit, EM_REPLACESEL, TRUE, (WPARAM)L"\n");
hr = pRichEditOle->InsertObject(&reobject);
pObject->Release();
pRichEditOle->Release();
if (FAILED(hr))
{
return FALSE;
}
return TRUE;
}
Tematy pokrewne