컴퓨터/오류 해결

[비쥬얼 스튜디오 C#] 메세지박스(MessageBox) TopMost 폼(Form)에 가려지는 현상 해결법

ahdelron 2020. 2. 10. 17:18

[비쥬얼 스튜디오 C#] 메세지박스(MessageBox) TopMost 폼(Form)에 가려지는 현상 해결법

우선, TopMost는 폼 속성으로 윈도우 최상단으로 올려주는 기능입니다.

true로 설정하면 어떤 짓을 하더라도 가장 위 쪽에서 실행됩니다. (눈으로 봤을 때)

 

TopMost를 true로 가지는 폼을 사용할 때는 주의해야 할 점이 있습니다.

TopMost를 false로 가지는 폼에서 메세지박스를 쓸 때 인데요.

 

어떤 느낌인지 그림으로 볼까요?

TopMostfalse인 폼에서 메세지박스를 호출하면, 그 메세지박스도 TopMost 가 false인 상태로 나타납니다.

그래서 TopMost가 true인 폼에 가려지는 것입니다.

 

만약 TopMost 폼이 가장자리 쪽에 있어서 메세지박스를 가리지 않다면 괜찮을 것입니다.

하지만, 불가피하게 정중앙에 있는 상황이면, 메세지박스를 볼 수 없고, 심하면 프로그램의 작동이 멈추는 경우까지 생길 수도 있습니다.

 

그러면 해결 방법은 없는건가요?

당연히 있죠. TopMost 속성이 true인 메세지박스는 TopMost 가 true인 폼 위에서도 나타날 수 있습니다.

즉, MessageBox를 TopMost 속성을 가진 상태로 호출하면 되는 것이죠.

 

어떻게 할까요?

MessageBox.Show의 기본 함수 프로토타입은 많습니다.

MessageBox.Show(string, string);

MessageBox.Show(string, string, MessageBoxButtons);

MessageBox.Show(string, string, MessageBoxButtons, MessageBoxIcon);

....

 

그 중에서 메세지박스의 부모를 정할 수 있는 함수 프로토타입을 사용하면 됩니다.

public static System.Windows.Forms.DialogResult Show (System.Windows.Forms.IWin32Window owner, string text, string caption);

출처 : https://docs.microsoft.com/ko-kr/dotnet/api/system.windows.forms.messagebox.show?view=netframework-4.8#System_Windows_Forms_MessageBox_Show_System_Windows_Forms_IWin32Window_System_String_System_String_

 

메세지박스의 owner(~=부모)를 설정할 수 있답니다.

즉, TopMost가 true인 owner에서 나온 MessageBox는 TopMost가 true가 됩니다.

MessageBox.Show(new Form() { TopMost = true}, "content", "title");

위 처럼 사용하시면 잘 됩니다!