MDI 윈도우 를 아직 지원하지 않고 있는 WPF 덕에 몇일전 삽질을 좀 했다.
요점만 이야기 하면 자식창을 만들기 위해서 Win32 API 를 이용할 수 밖에 없었는데, 사용한 함수는 다음과 같다.
[DllImport("user32.dll", EntryPoint = "SetParent")] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); |
SetParent 함수는 특정 윈도우의 부모창을 설정하거나 바꿀수 있는 함수 이다. 자세한 설명은 MSDN 을 참고하면 되겠다. 이 녀석을 좀더 편하게 사용하기 위해 다른 함수를 하나 더 만들었다.
public void MakeDependentWindow(Window childWindow, Window parentWindow) { IntPtr parentHwnd = new WindowInteropHelper(parentWindow).Handle; IntPtr childHwnd = new WindowInteropHelper(childWindow).Handle; SetParent(childHwnd, parentHwnd); } |
자식창과 부모창을 각각 파라미터로 받고 이 윈도우에 대한 Handle을 알아낸 다음 SetParent 함수를 호출하는 것이다. 머 이 정도면 자식 창으로 만드는 것 해결되었는데 한가지 아쉬운 점이 있다. 자식 창으로 만든 윈도우를 독립된 새로운 창으로 띄우려면 어떻게 해야하는가 였다. 본인이 워낙 단순한지라…. 부모창을 없애면 되겠네 했다. 것도 현재 소스에서 사용하고 있는 SetParent 를 사용해서 말이다. 생각해보니 각각의 윈도우에 Handle 가 있는데 Desktop 에도 있지 않을까?~ 머 이런 고민(이라기 보다는 구글링이라는 말이 맞을려나…)을 하던중에 역시나 Win32 API 에 GetDesktopWindow 를 찾아내었다. 함수 이름에서도 알 수 있듯이 현재의 워크스테이션의 데스크탑의 handle 을 리턴한다. 해서 만든 함수가 아래와 같다.
public void MakeIndependentWindow(Window childWindow) { IntPtr childHwnd = new WindowInteropHelper(childWindow).Handle; SetParent(childHwnd, GetDesktopWindow()); } |
음… 일단 이래저래 구현은 해놨는데 실제로 만들고 싶은건 VSTS 2010 의 Tabbed MDI 형태! 과연 얼마나 갈수 있을랑가 몰겠다. 흠냐.
추신: 블로깅에 도움을 주신 DX 정모님께 감사말씀드립니다. (__)(^^)




덧글