삽질의 현장/- .NET

#099_닷넷(.NET)_ WinForm - 모달리스(Modeless) Dialog 생성 및 제거

shovelman 2015. 11. 23. 16:51


안녕하세요 삽잡이입니다.


이번시간에는 모달리스 다이얼로그에 대해서 알아보려고합니다.



세세하게 다루지 않고, 

가볍게 읽으며 넘어가는 식으로 글을 쓰고자합니다.

기존에 Window Native 영역인 

API에 대한 이해가 없으시다면 이해가 잘 안가실 수 있으니, 

API 부분부터 다시 보시는 것 또한 추천드립니다!

   




기존에 모달 다이얼로그의 경우,

해당 다이얼로그가 실행된 상태에서 Focus가 집중되어있기 때문에,

다른곳으로 이동하지 못합니다.

또한, 모든 메시지는 모달이 띄워져있는 상태에서 처리하게 됩니다. 


모달리스 다이얼로그의 경우 

Focus가 해당 다이얼로그에 집중되어있지 않습니다.


WinForm에서는 모달리스 다이얼로그 역시,

Form을 하나 만들고 [속성]을 변경해주면 됩니다.


FormBorderStyle 속성을 FiexdDialog로 설정하고,

MiniMizeBox, MaximizeBox 속성을 False로 설정하고,

StartPosition 속성을 CenterParent로 설정하고,

ShowInTaskBar 속성을 False로 설정해주면 되겠지요.



이 모달리스 다이얼로그(편의상, 모달리스)의 참조는

사용자가 원하는 동안은 살아있어야하기때문에 

지역변수와 같이 생성해서는 안됩니다.


따라서, 부모 Form에 모달리스에 대한 변수로써 필드를 두는 것이 기본입니다.

혹은, 변수만 만들어놓고 함수가 호출됬을 때 객체를 생성시킵니다.


 

'modeless' 라는 이름으로 Form 하나를 만들었습니다.

이 Form을 MainForm에서 생성해주면 되지요.

그런데, 이 생성한 모달리스를 Dlg라는 속성을 만들어 참조 시킵니다.


모달과 차이가 있으니 모달리스라는 명칭을 만들었겠지요?

따라서, 모달리스는 외부에서도 접근이 가능할 수 있도록 구현해줘야합니다.


그래서, 필드가 아닌 자동 속성을 만들어줌으로써,
클레스 외부에서도 사용할 수있도록 속성을 만들었습니다.

또한, 부모 Form 이 실행되고 있는 동안에 

자식인 모달리스 또한 활성화가 되어야합니다.

그리고, 부모도 감춰진다면 역시 모달리스도 감춰져야겠지요.


따라서, 속성을 변경해줘야합니다.

즉, Owner를 지정해주는 것이지요.

Owner를 지정해준 윈도우는 모달리스의 소유자가 된다는 것입니다.



또한, 한번 실행된 모달리스가 종료되면 깔끔하게 종료가 되야겠지요.

모달리스가 또 띄워지면 안되기에

하나가 띄워지면 또 띄워지면 안됩니다.


따라서, 위의 예제와 같이 조건으로써 파악을 해주는 것입니다.


지금까지 예제를 보자면,

new modeless()를 통해 모달리스 다이얼로그를 생성시켜 

Owner로써 부모를 선택했습니다.

그리고 마지막으로 Show()를 통해 윈도우를 보여줬습니다.

객체와 UI는 엄연히 다르기 때문에

Show() 메서드를 통해 모달리스 윈도우를 보여준것입니다.


참고로 Main Form의 경우에는 

내부적으로 Show()를 때려줘서 창이 뜨는 것입니다.


아무튼...

모달리스 객체를 없앤다고 없어지는 것이 아닙니다.

단지 객체가 가지고 있는 윈도우만 파괴되는 것 뿐이지요.



따라서 Close 이벤트가 발생될 때 

부모 윈도우에 알려서 마무리 작업을 하던지,

참조하고 있는 dlg를 null로 만들던지 작업을 처리해주면 됩니다.


C#에서는 가비지 컬렉터에 의해

null인 값들은 모두 자동으로 제거되기 때문에 

이와 같은 마무리 작업을 해줘도 된다는 사실은 모두 아실 것이라 믿습니다.


API, MFC와 비교해봤자

닷넷의 WinForm이라는 스타일만 달라졌지

예전에 했던 방식과는 모두 비슷하지요?


이번 시간은 여기까지 하도록 하겠습니다.

이상 삽잡이였습니다!


<참고 : C# and the .NET4 Platform>