프로그램을 MDI 자식 창으로 사용하는 방법이 있습니까? 멀티ipe 자식 창을 가질 수있는 하나의 메인 MDI 부모 창을 가질 생각 중입니다. 그 중 일부는 프로그램 자체 (.exe 파일)가 될 것입니다. 나는 몇 년 전 비슷한 일을 구현 한MDI 자식 창으로 프로그램
답변
팀은 (내가 올바르게 기억 .NET 프레임 워크 1.1 기반). 그 구현의 핵심 요소였다 :
- 우리는 같은 UI를 호출 할 사용자 명령을 추출하는 인터페이스로 일부 특정 기능을 노출 확장
Form
클래스를 만들었습니다. - 기본 응용 프로그램은 응용 프로그램 디렉토리에서 dll을 검사하고 특수 양식 클래스를 기반으로 모든 클래스를 찾은 다음 해당 정보를 추출하여 명령을 호출하는 메뉴 구조를 작성합니다 (Reflection 사용).
- 사용자가 표시되는 양식으로 연결되는 명령을 호출하면 해당 양식이 작성되고 (
Activator.CreateInstance
사용) 서식 경계에서 제거되고 컨테이너에 삽입됩니다 (이 경우TabPage
은TabControl
). 응용 프로그램의 "빈"MDI 하위 폼).
이 모든 것이 상당히 잘 풀렸다 고 생각합니다. 실제로 프레임 워크가 유지되고 있으며 회사에서 사용되었다고 생각합니다.
메모리 관리를 계속 지켜 볼 수 있습니다. 예를 들어 어셈블리를 언로드 할 수 없기 때문에 외부 어셈블리를 별도의 AppDomain에로드해야합니다. 또한 자식 윈도우 UI가로드 될 때 동적으로 첨부되는 이벤트 핸들러에주의를 기울여야합니다. 그러면 UI가 언로드 될 때 제대로 분리됩니다.
고마워, 이런 식으로해야 할 것 같아. 나는 연극을 할거야. –
실제로이 작업을 수행하는 아주 쉬운 방법이 있습니다.
먼저 양식에 패널을 추가해야합니다. 이 패널은 응용 프로그램을 "호스트"하는 데 사용됩니다.
다음, 당신은 "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);
이것은 작동하지 않습니다. 메모장 창이 생성되었지만 mdi 응용 프로그램에 연결되어 있지 않습니다. –
@Tim - 새 MDI 하위 창을 만들고 새 프로세스 창의 부모를 MDI 하위 창의 창 핸들로 설정하면 작동합니다. – SteveWilkinson
변경없이 작동합니다. – MeelStorm
// 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);
- 1. MDI 자식 표시 항상 다른 MDI 자식 맨 위에
- 2. MDI 자식 폼은 가시성
- 3. MDI 자식 폼로드
- 4. 은 MDI 응용 프로그램
- 5. 창 관리 MDI 응용 프로그램
- 6. 중복 MDI 자식 폼 방지
- 7. 다른 양식의 MDI 자식 폼
- 8. WPF의 MDI 응용 프로그램
- 9. MDI 폼의 MDI 컨테이너 크기로 설정된 자식 폼 크기
- 10. C# MDI 부모 MDI 자식 닫는 때 검색합니까?
- 11. MDI 응용 프로그램 최소화/복원 문제
- 12. 하나의 MDI 자식 폼이 다른 모든 mdi 자식 폼에서 포커스를 훔치는 것을 방지하는 방법
- 13. MDI 자식 폼간에 끌어서 놓기 작업
- 14. MDI 부모 자식 폼의 위치 문제
- 15. 자식 폼이 MDI 부모 컨테이너 뒤에 숨김
- 16. 병합 도구 모음 MDI 자식 - 부모
- 17. winform mdi catch 자식 양식 포커스 C#
- 18. MDI 자식 폼 호출, 생성하지 않음
- 19. ShowDialog()와 비슷한 MDI 자식 대기 닫기
- 20. MDI 자식 폼 Vista에서 최대화 문제
- 21. PropertyStore 및 MDI 자식 폼 정보
- 22. ControlBox가없는 MDI 자식 폼을 열고 닫는 방법
- 23. 방금 얻은 MDI 자식 찾기 Win32 API
- 24. 자식 창에서 상위 창으로 값 전달
- 25. 응용 프로그램 창으로 파일 끌기
- 26. 창으로 프로그램 시작 하시겠습니까? C#
- 27. 다중 GUI 스레드가있는 mdi 응용 프로그램
- 28. 새 프로세스를 시작하고 기본 창을 내 MDI 응용 프로그램의 하위 창으로 설정할 수 있습니까?
- 29. .Net에서 변경된 Mdi Children
- 30. MDI 모델 또는 Dock Windows?
내가 좋아하는 생각. –