2014-12-11 4 views
0

Delphi 프로젝트에서 COM 컨트롤로 사용하는 시각적 인 DotNet 컨트롤이 있습니다.
이제 DotNet에서이 DotNet 구성 요소를 호스팅하는 델파이 형식의 핸들을 얻고 싶습니다. 확실히 - 나는 setParentHandle (pHandle : hwnd)과 같은 것을 사용하여 Delphi에서 DotNet으로 Form의 핸들을 전달할 수있다. 메소드를 정의하지만, 여기서는 그렇게하고 싶지 않습니다.COM 컨트롤을 호스팅하는 폼의 핸들을 얻는 방법

DotNet에서 무언가를 그렸던 구성 요소의 핸들을 제공 할 수있는 Winapi 호출이 있습니까?

이 핸들을 사용하여 DotNetComponent에서 처리 할 수없는 메시지를 Delphi Form에 보내려합니다.

+0

.net 코드에 무엇이 있는지 정확하게 설명 할 수 있습니까? .net 구성 요소는 어떤 클래스에서 파생됩니까? 이것이 귀하의 델파이 앱에서 호스팅되는 구성 요소입니다. –

+0

dotnet 구성 요소는 기본적으로 UserControl에서 파생됩니다. 나는 이것을 차트 컴포넌트의 컨테이너로 사용한다. 그러나 나는 C# 코드에서 델파이 호스팅 폼 (실제로는 핸들이 필요함)에 액세스 할 수 없다. –

+0

'System.Windows.Forms.UserControl' 또는'System.Windows.Controls.UserControl'? –

답변

0

C#의 경우와 마찬가지로 WinApi의 GetParent 메서드를 사용하여이 문제를 해결했습니다.

[DllImport("user32.dll")] 
private static extern IntPtr GetParent(IntPtr hWnd); 

protected override void WndProc(ref Message m){ 

    // 0x20a is the Message constant for WM_MOUSEWHEEL (Scrolling on your control) 
    if(m.Msg == 0x20a){ 
     IntPtr hWnd= GetParent(this.Handle); 
     SendMessage(hWnd, m.Msg, m.WParam, m.LParam); 
    } 
    else 
     base.WndProc(ref m); 
} 

비고 : 모든 메시지를 상위 컨트롤로 전달하면 더 이상 자체 메시지를받지 않으므로 컨트롤을 손상시킬 수 있습니다.

+1

이 코드는 메시지를받지 않기 때문에 컨트롤이 작동하지 않습니다. –

+0

오, 고마워, 네 말이 맞아. 생산적인 코드에서 메시지를 부모 컨트롤에 보내기 전에 미리 필터링합니다. 'if (m.Msg = 0x20a)'를 사용하여. 그러나 내 컨트롤의 부모 창의 핸들을 얻으려면 GetParent 메서드가 필요합니다. –

0

일반적으로 호스트 창이 시각적 ActiveX 컨트롤을 포함하면 호스트는 IOleClientSite 인터페이스를 구현하고 IOleObject::SetClientSite() 구현을 통해 컨트롤에 전달합니다. 컨트롤은 IOleWindow 또는 IOleInPlaceSite에 대해 IOleClientSite을 쿼리하고 GetWindow() 메서드를 호출하여 호스트의 HWND를 가져올 수 있습니다.

IOleObject이 .NET 레이어에서 구현되는 방법을 모르겠지만 COM/ActiveX 레이어가 작동하는 방식입니다. 따라서 .NET 컨트롤이 자신의 SetClientSite() 메서드를 재정의하거나 다른 방법을 사용하여 호스트의 IOleClientSite 인터페이스에 액세스 할 수있는 방법이있을 수 있습니다.