Udostępnij za pośrednictwem


Zapewnianie aktywacji niepowiązanej z oknami

Okno kodu (to znaczy, że wszystko, co dzieje się podczas wywoływania właściwości CreateWindow) jest kosztowne, aby wykonać.Formant, który utrzymuje na ekranie okno ma zarządzania wiadomościami dla okna.Formanty bez okien są zatem szybciej niż formantów z systemem windows.

Kolejną zaletą formanty bez okien jest, że w przeciwieństwie do okna formantów formanty bez okien obsługują przezroczysty obraz oraz obszarów ekranu o nieregularnym kształcie.Typowym przykładem przezroczystego formantu jest formant tekstu z przezroczystym tłem.Formanty farby tekst, ale nie w tle, więc wszystko, co jest pod tekstem pokazuje za pośrednictwem.Nowsze formy często należy używać formantów o nieregularnym kształcie, takie jak strzałki i okrągłych przycisków.

Często formant nie jest konieczne okna własnych i, zamiast tego można korzystać z usług okno jego kontenera, pod warunkiem że kontener został napisany do obsługi obiektów bez okien.Bez okien formanty są zgodne z poprzednimi wersjami z kontenerami starszych.W pojemnikach starszych nie zapisane obsługuje formanty bez okien okien formantów utworzyć okna gdy aktywny.

Ponieważ formanty bez okna nie mają swoje własne okna, kontener (które okno) jest odpowiedzialny za zapewnienie usług, które byłyby były udzielane przez okno własnych kontroli.Na przykład jeśli formant musi zbadać fokusu klawiatury, przechwytywanie myszy lub uzyskać kontekstu urządzenia, operacje te są zarządzane przez kontener.Kontener kieruje użytkownika wprowadzania wiadomości wysłane do jego okna do właściwej kontroli bez okien, za pomocą IOleInPlaceObjectWindowless interfejsu. (Zobacz ActiveX SDK opis tego interfejsu.) COleControl tych usług z kontenera wywołać funkcji elementów członkowskich.

Aby formant jest używana aktywacja bez okien, zawierać windowlessActivate flagi w zestawie flagi zwrócony przez 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, aby uwzględnić ta flaga jest generowany automatycznie po wybraniu bez okna aktywacji opcji na Ustawienia sterowania strony Kreatora formantów ActiveX MFC.

Gdy Aktywacja bez okien jest włączona, pojemnik będzie delegować komunikaty wejściowe z formantem IOleInPlaceObjectWindowless interfejsu.COleControlw implementacji interfejsu wysyła wiadomości za pośrednictwem mapy wiadomość z formantu, po dostosowanie myszy odpowiednio koordynuje.Przez dodanie odpowiednich wpisów do mapy wiadomości można przetwarzać wiadomości jak zwykłe okno wiadomości.W swoje programy obsługi dla tych komunikatów, należy unikać m_hWnd zmienna członka (lub żadnych funkcji członka, która go używa) bez uprzedniego sprawdzenia, że jego wartość nie jest wartości NULL.

COleControlzapewnia funkcje składowe, które wywołują przechwytywanie myszy, klawiaturę, przewijanie i innych usług okno z kontenera, odpowiednio, w tym:

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 powiązanych funkcji Win32 API.

Możesz bez okna formantu, który ma być celem operacji przeciągania i upuszczania OLE.Normalnie wymagałoby to, że okno Kontrola być zarejestrowane jako miejsce docelowe upuszczania.Ponieważ formant bez okna własnych, kontener używa swoim własnym oknie, jako miejsce docelowe upuszczania.Formant stanowi implementację IDropTarget interfejsu, do którego pojemnika można delegować wywołań we właściwym czasie.Aby udostępnić 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 MFC ActiveX: optymalizacja