비활성 상태 중 마우스 상호 작용 제공
컨트롤이 즉시 활성화되지 않은 경우에도 컨트롤에 자체 창이 없더라도 WM_SETCURSOR 처리하고 메시지를 WM_MOUSEMOVE 수 있습니다. 이 작업은 기본적으로 사용하지 않도록 설정되는 인터페이스의 구현을 IPointerInactive
사용하도록 설정COleControl
하여 수행할 수 있습니다. (다음을 참조하세요.이 인터페이스에 대한 설명을 위한 ActiveX SDK입니다.) 이를 사용하도록 설정하려면 COleControl::GetControlFlags에서 반환된 플래그 집합에 pointerInactive 플래그를 포함합니다.
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;
return dwFlags;
}
MFC ActiveX 컨트롤 마법사를 사용하여 컨트롤을 만들 때 컨트롤 설정 페이지에서 마우스 포인터 알림 비활성 옵션을 선택하면 이 플래그를 포함하는 코드가 자동으로 생성됩니다.
인터페이스를 IPointerInactive
사용하도록 설정하면 컨테이너는 WM_SETCURSOR 위임하고 메시지를 WM_MOUSEMOVE. COleControl
'의 IPointerInactive
구현은 마우스 좌표를 적절하게 조정한 후 컨트롤의 메시지 맵을 통해 메시지를 디스패치합니다. 메시지 맵에 해당 항목을 추가하여 일반 창 메시지와 마찬가지로 메시지를 처리할 수 있습니다. 이러한 메시지에 대한 처리기에서 해당 값이 NULL이 아니라는 검사 먼저 m_hWnd 멤버 변수(또는 해당 변수를 사용하는 멤버 함수)를 사용하지 마세요.
비활성 컨트롤이 OLE 끌어서 놓기 작업의 대상이 되도록 할 수도 있습니다. 이렇게 하려면 사용자가 개체를 끌어 놓기 대상으로 등록할 수 있도록 컨트롤을 활성화해야 합니다. 끌기 중에 활성화가 발생하도록 하려면 COleControl::GetActivationPolicy를 재정의하고 POINTERINACTIVE_ACTIVATEONDRAG 플래그를 반환합니다.
DWORD CMyAxOptCtrl::GetActivationPolicy()
{
return POINTERINACTIVE_ACTIVATEONDRAG;
}
일반적으로 인터페이스를 IPointerInactive
사용하도록 설정하면 컨트롤이 항상 마우스 메시지를 처리할 수 있게 됩니다. 인터페이스를 지원하지 IPointerInactive
않는 컨테이너에서 이 동작을 얻으려면 컨트롤이 표시될 때 항상 활성화되어야 합니다. 즉, 컨트롤에 기타 플래그 사이에 OLEMISC_ACTIVATEWHENVISIBLE 플래그가 포함되어야 합니다. 그러나 지원되는 IPointerInactive
컨테이너에서 이 플래그가 적용되지 않도록 하려면 OLEMISC_IGNOREACTIVATEWHENVISIBLE 플래그를 지정할 수도 있습니다.
static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;