My Sharepoint

sharepoint.egloos.com

포토로그 마이가든



WPF MDI 형태의 자식창(Child Window) 만들기 WPF

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 정모님께 감사말씀드립니다. (__)(^^)


 


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://sharepoint.egloos.com/tb/2331657 [도움말]

덧글

덧글 입력 영역