Devre Dışı İken Fare Etkileşimi Sağlama
Denetiminiz hemen etkinleştirilmemişse, denetimin kendi penceresi olmasa bile WM_SETCURSOR ve WM_MOUSEMOVE iletileri işlemesini isteyebilirsiniz. Bu, 'nin arabiriminin IPointerInactive
varsayılan olarak devre dışı bırakılan uygulamasını etkinleştirerek COleControl
gerçekleştirilebilir. (Bkz.Bu arabirimin açıklaması için ActiveX SDK'sı.) Etkinleştirmek için, COleControl::GetControlFlags tarafından döndürülen bayrak kümesine pointerInactive bayrağını ekleyin:
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;
return dwFlags;
}
Denetiminizi MFC ActiveX Denetim Sihirbazı ile oluştururken Denetim Ayarlar sayfasında Fare İşaretçisi Etkin Değilken Bildirimleri seçeneğini belirtirseniz, bu bayrağı içerecek kod otomatik olarak oluşturulur.
IPointerInactive
Arabirim etkinleştirildiğinde, kapsayıcı WM_SETCURSOR ve iletileri ona WM_MOUSEMOVE. COleControl
IPointerInactive
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 iletileri normal pencere iletileri gibi 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.
Etkin olmayan bir denetimin ole sürükle ve bırak işleminin hedefi olmasını da isteyebilirsiniz. Bunun için, kullanıcı nesnenin üzerine sürüklediği anda denetimin etkinleştirilmesi gerekir, böylece denetimin penceresi bırakma hedefi olarak kaydedilebilir. Sürükleme sırasında etkinleştirmenin gerçekleşmesine neden olmak için COleControl::GetActivationPolicy'yi geçersiz kılın ve POINTERINACTIVE_ACTIVATEONDRAG bayrağını döndürin:
DWORD CMyAxOptCtrl::GetActivationPolicy()
{
return POINTERINACTIVE_ACTIVATEONDRAG;
}
Arabirimi etkinleştirmek IPointerInactive
genellikle denetimin fare iletilerini her zaman işleyebilmesini istediğiniz anlamına gelir. Arabirimi desteklemeyen IPointerInactive
bir kapsayıcıda bu davranışı elde etmek için, denetiminizin görünür olduğunda her zaman etkinleştirilmiş olması gerekir; bu da denetimin çeşitli bayraklar arasında OLEMISC_ACTIVATEWHENVISIBLE bayrağı içermesi gerektiği anlamına gelir. Ancak, bu bayrağın destekleyen IPointerInactive
bir kapsayıcıda etkili olmasını önlemek için OLEMISC_IGNOREACTIVATEWHENVISIBLE bayrağını da belirtebilirsiniz:
static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;