Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
Microsoft Foundation Sınıfları (MFC) kitaplığı desteklenmeye devam ediyor. Ancak artık özellik eklemeyeceğiz veya belgeleri güncelleştirmeyeceğiz.
Pencere oluşturma kodu (yani, CreateWindow'yu çağırdığınızda gerç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ı boyamaz, bu nedenle metnin altındaki her şey görünür. Daha yeni formlar genellikle oklar ve yuvarlak düğmeler gibi dikdörtgen olmayan denetimleri kullanır.
Genellikle, bir denetimin kendi penceresine ihtiyacı yoktur; bunun yerine, kapsayıcı penceresiz nesneleri destekleyecek şekilde tasarlandıysa, 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, bir pencereye sahip olan kapsayıcı, aksi halde denetimin penceresi tarafından sağlanacak 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ı, IOleInPlaceObjectWindowless arabirimini kullanarak, penceresine gönderilen kullanıcı giriş iletilerini uygun penceresiz denetime yönlendirir. (Bu arabirimin açıklaması için bkz . 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. Örneğin:
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 aktarır.
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 onu 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, COleControl üye işlevleri veya ilgili Win32 API işlevleri yerine her zaman CWnd üye işlevlerini kullanmanız gerekir.
Penceresiz bir denetimin OLE sürükle ve bırak işleminin hedefi olmasını isteyebilirsiniz. Normalde bu, denetim penceresinin bir bırakma hedefi olarak kaydedilmesini gerektirir. Kendi penceresi olmadığı için, kapsayıcı kendi penceresini bırakma hedefi olarak kullanır. Denetim, kapsayıcının uygun zamanda çağrı yapabileceği IDropTarget arabirimine bir uygulama 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;
}