Aracılığıyla paylaş


Penceresiz Etkinleştirme Sağlama

Pencere oluşturma kodu (yani, çağırdığınızda CreateWindowgerçekleşen her şeyin) yürütülmesi maliyetlidir. Ekran penceresini koruyan bir denetimin, pencere iletilerini yönetmesi gerekir. Bu nedenle penceresiz denetimler, pencereli denetimlerden daha hızlıdır.

Penceresiz denetimlerin bir diğer avantajı, pencereli denetimlerin aksine penceresiz denetimlerin saydam boyamayı ve üçgen olmayan ekran bölgelerini desteklemesidir. Saydam denetimin yaygın bir örneği, saydam arka planı olan bir metin denetimidir. Denetimler metni boyar ancak arka planı boyar, bu nedenle metnin altındaki her şey gösterilir. Daha yeni formlar genellikle oklar ve yuvarlak düğmeler gibi nonrectular denetimlerini kullanır.

Genellikle, bir denetimin kendi penceresine ihtiyacı yoktur ve kapsayıcı penceresiz nesneleri desteklemek için yazılmış olması koşuluyla kapsayıcısının pencere hizmetlerini kullanabilir. Penceresiz denetimler eski kapsayıcılarla geriye dönük olarak uyumludur. Penceresiz denetimleri desteklemek için yazılmayan eski kapsayıcılarda penceresiz denetimler etkin olduğunda bir pencere oluşturur.

Penceresiz denetimlerin kendi pencereleri olmadığından, kapsayıcı (penceresi olan) denetimin kendi penceresi tarafından sağlanmış olabilecek hizmetleri sağlamakla sorumludur. Örneğin, denetiminizin klavye odağını sorgulaması, fareyi yakalaması veya cihaz bağlamını alması gerekiyorsa, bu işlemler kapsayıcı tarafından yönetilir. Kapsayıcı, arabirimini kullanarak penceresine gönderilen kullanıcı giriş iletilerini uygun penceresiz denetime IOleInPlaceObjectWindowless yönlendirir. (Bkz. Bu arabirimin açıklaması için ActiveX SDK'sı .) COleControl üye işlevleri bu hizmetleri kapsayıcıdan çağırır.

Denetiminizin penceresiz etkinleştirme kullanmasını sağlamak için, COleControl::GetControlFlags tarafından döndürülen bayrak kümesine penceresizActivate bayrağını ekleyin. Örnek:

DWORD CMyAxOptCtrl::GetControlFlags()
{
   DWORD dwFlags = COleControl::GetControlFlags();
// The control can activate without creating a window.
dwFlags |= windowlessActivate;
return dwFlags;
}

MFC ActiveX Denetim Sihirbazı'nın Denetim Ayarlar sayfasında Penceresiz etkinleştirme seçeneğini belirlediğinizde, bu bayrağı içerecek kod otomatik olarak oluşturulur.

Penceresiz etkinleştirme etkinleştirildiğinde kapsayıcı, giriş iletilerini denetimin IOleInPlaceObjectWindowless arabirimine temsilci olarak verir. COleControl'nin bu arabirimi uygulaması, fare koordinatlarını uygun şekilde ayarladıktan sonra iletileri denetiminizin ileti haritası üzerinden dağıtıyor. İleti eşlemesine karşılık gelen girişleri ekleyerek normal pencere iletileri gibi iletileri işleyebilirsiniz. Bu iletilerin işleyicilerinde, önce değerinin NULL olmadığını denetlemeden m_hWnd üye değişkenini (veya bunu kullanan herhangi bir üye işlevini) kullanmaktan kaçının.

COleControl kapsayıcıdan fare yakalama, klavye odağı, kaydırma ve diğer pencere hizmetlerini uygun şekilde çağıran üye işlevleri sağlar, örneğin:

Penceresiz denetimlerde, her zaman ilgili CWnd üye işlevleri veya ilgili Win32 API işlevleri yerine üye işlevlerini kullanmanız COleControl gerekir.

Penceresiz bir denetimin OLE sürükle ve bırak işleminin hedefi olmasını isteyebilirsiniz. Normalde bu, denetimin penceresinin bırakma hedefi olarak kaydedilmesini gerektirir. Denetimin kendi penceresi olmadığından, kapsayıcı bırakma hedefi olarak kendi penceresini kullanır. Denetim, kapsayıcının IDropTarget uygun zamanda çağrıları temsilci olarak seçebileceği arabirimin bir uygulamasını sağlar. Bu arabirimi kapsayıcıya göstermek için COleControl::GetWindowlessDropTarget'i geçersiz kılın. Örneğin:

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

Ayrıca bkz.

MFC ActiveX Denetimleri: İyileştirme