2011-04-11 2 views
5

이것은 모든 ActiveX 컨트롤에서 발생합니다. 내가 DeferWindowPos와 ActiveX 컨트롤의 위치를 ​​변경하는 경우DeferWindowPos 이상한 동작

HDWP hdwp = BeginDeferWindowPos(1); 
DeferWindowPos(hdwp, m_pActiveX->GetSafeHwnd(), NULL, left, top, width, height, SWP_NOZORDER); 
EndDeferWindowPos(hdwp); 

당신이 제어의 아무 곳이나 클릭하면 /가 된 사각형의 크기를 조정 이동 후 가 간다지만. MoveWindow를 대신 사용하면

m_pActiveX->MoveWindow(left, top, width, height); 

이 발생하지 않습니다.

다른 유형의 컨트롤에서는 ActiveX 컨트롤 만 사용하지만 모든 컨트롤에서 발생합니다. 나는 이것을 확인하기위한 테스트를하고 새 ActiveX 컨트롤 프로젝트를 만들었으며 변경하지 않았으며 문제는 여전히있었습니다.

답변

6

당신은 적절한 대답을 얻지 못했습니다. 나는 여기서 조금 도와 주려고 노력할 것이다.

MFC는 프레임 워크 내에서 ActiveX 컨트롤을 호스팅하는 데 많은 어려움을 감추고 있습니다. 특히 MoveWindow 호출을 사용하면 단순히 Win32 MoveWindow 함수를 감싸는 래퍼가 아닙니다. OLE 컨트롤 컨테이너 지원 클래스를 호출합니다. 이것은 기본적으로 제어 사이트 인터페이스가 있으면 COleControlSite :: MoveWindow를 호출하고 그렇지 않으면 표준 Win32 MoveWindow를 호출합니다. 같은 다른 여러 창 함수를 CWnd 등 처리합니다. 예를 들어, COleControlSite :: SetWindowPos 처리 숨기기/표시, 다음 이동하려면 COleControlSite :: MoveWindow 호출하고 마지막으로 호출합니다 :: SetWindowPos (이동/표시 플래그 사용하여 마스크 처리) 나머지를 처리합니다.

일단 COleControlSite :: MoveWindow 내에서 여러 가지 작업을 수행하면 SetExtent를 호출하고 내부 m_rect 멤버를 업데이트 한 다음 SetObjectRects를 호출합니다.

위의 ActiveX 컨트롤을 Win32 API를 사용하여 직접 (예 : DeferWindowPos를 통해) 바이 패스하면 이러한 중요한 단계 중 일부가 누락됩니다. 코드 배치 방법에 따라 대개 직접 처리 할 수 ​​있습니다.

1

무엇입니까 ActiveX 컨트롤은 무엇입니까?

DeferWindowPos은 여러 개의 창을 동시에 배치하는 것을 의미합니다. begin 문을 입력하고 새 레이아웃의 창 위치를 변경 한 다음 실제로 끝내고 새 위치와 크기를 적용하는 개념입니다.

여러 창을 업데이트하지 않는 경우 대신 SetWindowPos을 사용하십시오.

지연되는 동안 이동, 크기 조정 또는 창 위치를 변경하라는 메시지가 표시 될 수 있습니다. 이 문제가 발생하지 않도록하려면 DeferWindowPos을 호출 할 때마다 SWP_NOSENDCHANGING 플래그를 전달하여 메시지가 보내지거나 처리되지 않도록하고 원치 않는 변경을 방지하기 위해 WINDOWPOS 구조체의 모든 비트를 지우십시오.

이 호출이 실패 할 수도 있습니다. 반환 값을 확인하고 있습니까?

+0

안녕하세요. 답변 해 주셔서 감사합니다. 여러 창을 업데이트하는 중, 코드를 단순화하여 정확한 소스 코드가 아닌 문제를 설명하기위한 것입니다. ActiveX 컨트롤은 Amyuni에서 만든 PDF 미리보기 컨트롤입니다. DeferWindowPos는 실패하지 않고 창 위치를 변경하지만 클릭 한 후에 창은 이전 크기와 위치로 '이동합니다'.이상한 점이있어서 위치가 바뀌었지만, 일단 자신의 위치를 ​​바꾼 것처럼 보입니다. – sashoalm

+0

아, 그 경우에는 아마도 컨트롤 자체가 포커스를 얻을 때 위치를 재설정하는 것처럼 들립니다. 확실한 대답을 얻으려면 Amyuni에서 전자 메일을 보내야 할 수도 있습니다 ... – AJG85

+0

흠, 문제는 Amyuni와 같지 않습니다. VS에서 새 프로젝트 마법사로 새 ActiveX 컨트롤을 만들었을 때와 같은 문제가 발생했습니다. 그것은 똑같은 문제를 안고있었습니다. 이것은 모든 ActiveX 컨트롤에 문제가 될 수 있습니다. 내 DeferWindowPos 호출과 MoveWindow의 차이점이 무엇인지 궁금합니다. Spy ++에서 무슨 일이 일어나는지 확인해야합니다. – sashoalm