Udostępnij za pośrednictwem


Dostarczanie aktywacji bez okien

Okno tworzenia kodu (oznacza to, że wszystko, co dzieje się podczas wywołania CreateWindow) jest kosztowne do wykonania.Formant, który utrzymuje na ekranie okno ma zarządzać wiadomościami dla okna.Formanty bez okien, dlatego są szybsze niż formantów z systemem windows.

Kolejną zaletą formanty bez okien jest, że w przeciwieństwie do formantów okna bez okien formanty obsługują malowania przejrzyste i regionów poza prostokątem ekranu.Typowy przykład przezroczyste formant jest formantem tekst przezroczyste tło.Formanty farby tekstu, ale nie w tle, które widoczne bez względu na to pod tekstem.Nowsze formy często należy używać formantów poza prostokątem, takie jak strzałki i zaokrąglić przyciski.

Często formant nie ma potrzeby własne okno, zamiast tego można użyć usług okna, jego pojemnika, pod warunkiem, że kontener zostało zapisanych do obsługi obiektów bez okien.Formanty bez okien są zgodne z kontenerów starsze.W starszych pojemniki nie są zapisywane do obsługi formantów bez okien formanty bez okien utworzyć okna, gdy jest aktywny.

Ponieważ formanty bez okien nie mają swoich własnych oknach, kontenera (które mają okno) jest odpowiedzialny za świadczenie usług, które mogłyby być inaczej udostępniane przez okno tego formantu.Na przykład jeśli formant musi kwerendy fokusu klawiatury, myszy przechwytywania lub uzyskanie kontekstu urządzenia, zarządzane tych operacji przez kontener.Kontener trasy komunikaty wejściowe użytkownika wysyłane do jego okno, aby odpowiedni formant, używając IOleInPlaceObjectWindowless interfejsu.(Zobacz ActiveX SDK opis tego interfejsu.) COleControl funkcji elementów członkowskich wywoływać te usługi z kontenera.

Aby użyć bez okien aktywacji formantu, obejmują windowlessActivate w zestaw flag zwrócony przez flagę COleControl::GetControlFlags.Na przykład:

DWORD CMyAxOptCtrl::GetControlFlags()
{
   DWORD dwFlags = COleControl::GetControlFlags();


...


// The control can activate without creating a window.
dwFlags |= windowlessActivate;


...


   return dwFlags;
}

Kod, który ma obejmować ta flaga jest generowany automatycznie po wybraniu bez okien aktywacji opcji na Ustawienia sterowania stronie kreatora formant ActiveX MFC.

Podczas aktywacji bez okien jest włączona, pojemnik będzie delegować komunikaty wejściowe do sterowania IOleInPlaceObjectWindowless interfejsu.COleControlw implementacji interfejsu wysyła wiadomości za pośrednictwem programu kontroli wiadomości mapy, po dostosowanie myszy odpowiednio koordynuje.Może przetwarzać wiadomości, takich jak zwykłe okno wiadomości, przez dodanie odpowiednich wpisów do mapy wiadomości.W sieci obsługi tych wiadomości, należy unikać używania m_hWnd zmienną (lub która go używa funkcji Członkowskich) bez sprawdzenia, że jego wartość nie jest NULL.

COleControlzapewnia funkcji elementów członkowskich, które wywołują przechwytywanie myszy, fokusu klawiatury, przewijanie i innych usług okno z kontenera, w stosownych przypadkach, włączając:

W formantach bez okien, należy zawsze używać COleControl funkcji elementów członkowskich zamiast odpowiadających im CWnd funkcji elementów członkowskich lub ich pokrewne funkcje Win32 API.

Możesz formant ma być celem operacji przeciągania i upuszczania OLE.Normalnie wymagałoby to, że okno formantu ma być zarejestrowany jako miejsce docelowe upuszczenia.Ponieważ formant ma nie okno własnej, kontener używa własnym oknie jako miejsce docelowe upuszczenia.Formant stanowi implementację IDropTarget interfejsu, do którego pojemnika można delegować wywołań w odpowiednim czasie.Aby ten interfejs do kontenera, należy zastąpić COleControl::GetWindowlessDropTarget.Na przykład:

IDropTarget* CMyAxOptCtrl::GetWindowlessDropTarget()
{
   m_DropTarget.m_xDropTarget.AddRef();
   return &m_DropTarget.m_xDropTarget;
}

Zobacz też

Koncepcje

Formanty ActiveX MFC: Optymalizacja