ActiveX/창 없는 활성화 제공

2 DAYS IN PARIS21세기 모노리스ACLActiveXActiveX/잔상처리 ActiveX/창 없는 활성화 제공

ms-help://MS.MSDNQTR.2003FEB.1042/vccore/html/_core_providing_windowless_activation.htm

ActiveX/창 없는 활성화 제공

창 작성 코드(CreateWindow 호출 시 발생되는 모든 코드)를 실행하는 데는 리소스가 많이 소모됩니다. 창을 화면에 계속 표시하는 컨트롤은 해당 창에 대한 메시지도 관리해야 합니다. 따라서 창이 있는 컨트롤보다는 창 없는 컨트롤의 속도가 더 빠릅니다.

창 없는 컨트롤의 장점은 창 있는 컨트롤과 달리 투명한 그림이나 사각형이 아닌 화면 영역도 지원한다는 점입니다. 투명 컨트롤의 일반적인 예로는 배경이 투명하게 처리되는 텍스트 컨트롤이 있습니다. 이러한 컨트롤은 텍스트만 그리고 배경은 그리지 않으므로 해당 텍스트 아래의 모든 내용이 비쳐 보입니다. 보다 새로운 컨트롤 형식에서는 흔히 화살표나 원형 단추와 같이 사각형이 아닌 컨트롤이 사용됩니다.

일부 컨트롤의 경우에는 자체의 창이 필요하지 않으며, 대신 해당 컨테이너가 창 없는 개체를 지원하도록 작성된 경우 여기에서 제공하는 창 서비스를 사용할 수 있습니다. 창 없는 컨트롤은 이전 버전과도 호환됩니다. 창 없는 컨트롤을 지원하도록 작성되지 않은 이전 버전의 컨테이너에서는 해당 컨트롤이 활성화되면 자동으로 창이 만들어집니다.

창 없는 컨트롤은 자체의 창이 없으므로, 컨트롤의 자체 창에서 제공할 서비스를 창이 있는 컨테이너에서 제공하게 됩니다. 예를 들어, 컨트롤이 키보드 포커스를 쿼리하거나 마우스를 캡처하거나 디바이스 컨텍스트를 가져와야 하는 경우, 이러한 작업은 해당 컨테이너에 의해 관리됩니다. 컨트롤 컨테이너는 컨테이너의 창에 보낸 사용자 입력 메시지를 IOleInPlaceObjectWindowless 인터페이스를 사용하여 적당한 창 없는 컨트롤에 라우팅합니다. 이 인터페이스에 대한 자세한 내용은 ActiveX SDK를 참조하십시오. COleControl 멤버 함수가 컨테이너에서 이러한 서비스를 호출합니다.

창 없는 컨트롤을 활성화하려면 COleControl::GetControlFlags에서 반환되는 플래그 집합에 windowlessActivate 플래그를 포함시킵니다. 예를 들면 다음과 같습니다.
DWORD CMyCtrl::GetControlFlags()
{
    return COleControl::GetControlFlags() | windowlessActivate;
}
이 플래그를 포함시키는 코드는 MFC ActiveX 컨트롤 마법사의 컨트롤 설정 페이지에서 창 없는 활성화를 선택하면 자동으로 생성됩니다.

창 없는 활성화를 사용할 수 있는 경우 컨트롤 컨테이너는 해당 컨트롤의 IOleInPlaceObjectWindowless 인터페이스에 입력 메시지를 위임합니다. COleControl의 이 인터페이스 구현은 마우스 좌표를 적당히 조정한 후 해당 컨트롤의 메시지 맵을 사용하여 해당 메시지를 디스패치합니다. 메시지 맵에 해당 엔트리를 추가하면 이 메시지를 보통의 창 메시지처럼 처리할 수 있습니다. 이러한 메시지 처리기에서 m_hWnd 멤버 변수 또는 이 변수를 사용하는 멤버 함수를 사용하려면 먼저 해당 값이 NULL이 아님을 확인해야 합니다.

COleControl은 해당 컨테이너에서 적당한 시점에 마우스 캡처, 키보드 포커스, 스크롤 및 다른 창 서비스를 호출하는 멤버 함수를 제공합니다. 이러한 멤버 함수는 다음과 같습니다.
  • GetFocus, SetFocus
  • GetCapture, SetCapture, ReleaseCapture
  • GetDC, ReleaseDC
  • InvalidateRgn
  • ScrollWindow
  • GetClientRect
창 없는 컨트롤에는 해당 CWnd 멤버 함수나 관련된 Win32 API 함수 대신 항상 COleControl 멤버 함수를 사용해야 합니다.

OLE 끌어서 놓기 작업의 대상으로 창 없는 컨트롤을 사용할 수도 있는데, 보통 이렇게 하려면 해당 컨트롤의 창이 끌어 놓기 대상으로 등록되어 있어야 합니다. 그러나 창 없는 컨트롤에는 자체의 창이 없으므로 컨테이너의 자체 창을 끌어 놓기 대상으로 사용합니다. 또한 창 없는 컨트롤은 해당 컨테이너가 적당한 시점에 호출을 위임하는 IDropTarget 인터페이스를 구현합니다. 이 인터페이스를 컨테이너에 노출하려면 COleControl::GetWindowlessDropTarget을 재정의합니다. 예를 들면 다음과 같습니다.
IDropTarget* CMyCtrl::GetWindowlessDropTarget()
{
    m_xDropTarget.AddRef();
    return &m_xDropTarget;
}




ID
Password
Join





- 전 이런 놈입니다.

격언> 눈이 밝으면 작은 물건까지 잘 볼 수 있고, 마음이 밝으면 보이지 않는 남의 마음 깊은 곳까지 잘 살필 수 있다. (수신강요)

Recent Changes

D  Echoes Of War(The... @ 2012-05-18 [03:44 pm] by windlesszone
D  Diablo3 @ 2012-05-15 [04:49 pm] by windlesszone
D  Diablo3/story/wizard @ 2012-05-15 [04:48 pm] by windlesszone 4 changes
D  Diablo3/story/wit... @ 2012-05-15 [04:16 pm] by windlesszone
D  Diablo3/story/monk @ 2012-05-15 [04:14 pm] by windlesszone





Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-04-06 11:54:09
Processing time 0.0945 sec