2009-10-03 10 views
1

프로그램을 MDI 자식 창으로 사용하는 방법이 있습니까? 멀티ipe 자식 창을 가질 수있는 하나의 메인 MDI 부모 창을 가질 생각 중입니다. 그 중 일부는 프로그램 자체 (.exe 파일)가 될 것입니다. 나는 몇 년 전 비슷한 일을 구현 한MDI 자식 창으로 프로그램

+0

내가 좋아하는 생각. –

답변

0

팀은 (내가 올바르게 기억 .NET 프레임 워크 1.1 기반). 그 구현의 핵심 요소였다 :

  • 우리는 같은 UI를 호출 할 사용자 명령을 추출하는 인터페이스로 일부 특정 기능을 노출 확장 Form 클래스를 만들었습니다.
  • 기본 응용 프로그램은 응용 프로그램 디렉토리에서 dll을 검사하고 특수 양식 클래스를 기반으로 모든 클래스를 찾은 다음 해당 정보를 추출하여 명령을 호출하는 메뉴 구조를 작성합니다 (Reflection 사용).
  • 사용자가 표시되는 양식으로 연결되는 명령을 호출하면 해당 양식이 작성되고 (Activator.CreateInstance 사용) 서식 경계에서 제거되고 컨테이너에 삽입됩니다 (이 경우 TabPageTabControl). 응용 프로그램의 "빈"MDI 하위 폼).

이 모든 것이 상당히 잘 풀렸다 고 생각합니다. 실제로 프레임 워크가 유지되고 있으며 회사에서 사용되었다고 생각합니다.

메모리 관리를 계속 지켜 볼 수 있습니다. 예를 들어 어셈블리를 언로드 할 수 없기 때문에 외부 어셈블리를 별도의 AppDomain에로드해야합니다. 또한 자식 윈도우 UI가로드 될 때 동적으로 첨부되는 이벤트 핸들러에주의를 기울여야합니다. 그러면 UI가 언로드 될 때 제대로 분리됩니다.

+0

고마워, 이런 식으로해야 할 것 같아. 나는 연극을 할거야. –

3

실제로이 작업을 수행하는 아주 쉬운 방법이 있습니다.

먼저 양식에 패널을 추가해야합니다. 이 패널은 응용 프로그램을 "호스트"하는 데 사용됩니다.

다음, 당신은 "System.Runtime.InteropServices"와 네임 스페이스에 "System.Diagnostics 네임"네임 스페이스가 필요합니다

: CSHARP 지금

using System.Diagnostics; 
using System.Runtime.InteropServices; 

, 우리는 우리의 WinAPI를 기능 설정 필요

[DllImport("user32.dll")] 
static extern IntPtr SetParent(IntPtr hwndChild, IntPtr hwndNewParent); 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, Int32 wParam, Int32 lParam); 

이제 버튼 클릭 이벤트 내에서 프로세스를 시작하고 패널에 부모를 설정합니다. 이 예제에서는 메모장 사용됩니다

// Create a new process 
Process proc; 

// Start the process 
proc = Process.Start("notepad.exe"); 
proc.WaitForInputIdle(); 

// Set the panel control as the application's parent 
SetParent(proc.MainWindowHandle, this.panel1.Handle); 

// Maximize application 
SendMessage(proc.MainWindowHandle, 274, 61488, 0); 
+0

이것은 작동하지 않습니다. 메모장 창이 생성되었지만 mdi 응용 프로그램에 연결되어 있지 않습니다. –

+0

@Tim - 새 MDI 하위 창을 만들고 새 프로세스 창의 부모를 MDI 하위 창의 창 핸들로 설정하면 작동합니다. – SteveWilkinson

+0

변경없이 작동합니다. – MeelStorm

0
// using 
using System.Runtime.InteropServices;<br> 
using System.Threading; 

// 밖으로 클래스 코드

[DllImport("user32.dll")]<br> 
    static extern IntPtr SetParent(IntPtr child,IntPtr parent); 

에서 // 만들기 새로운 프로세스를

Process proc; 

// Start the process 
proc = Process.Start("calc.exe"); 

proc.WaitForInputIdle(); 
Thread.Sleep(500); 

// Set the panel control as the application's parent 
SetParent(proc.MainWindowHandle, this.panel1.Handle); 
관련 문제