본문 바로가기
2_ 바삭바삭 프로그래밍/C# and Visual C++

[C#] 메세지 박스(MessageBox)

by 준환이형님_ 2013. 8. 16.

출처 : Fehu, Gebo (http://blog.naver.com/PostView.nhn?blogId=kst7132&logNo=140165075952)


메시지 박스는 사용자에게 짧은 문자열 메시지를 출력하는 조그만 대화상자로서 안내문이나 에러, 간단한 질문 등을 할 수 있다. 메서드 호출문 하나로 사용자에게 정보를 출력할 수 있는 가장 간단한 장치이다. 또한 실행중에 변수나 프로그램의 현재 상태를 확인하고 제어의 흐름을 잠시 차단할 수 있어 디버깅용으로도 흔히 애용된다.

메시지 박스는 MessageBox 클래스로 표현한다. 이 클래스는 생성자가 없기 때문에 객체를 생성할 수 없고 프로퍼티나 이벤트도 가지지 않으며 오로지 Show 정적 메서드 하나만 가진다. 아주 간단한 클래스라고 할 수 있는데 대신 Show 메서드가 무려 21개나 오버로딩되어 있다. 이중 다음 형태가 가장 자주 사용된다.

 

public static DialogResult Show (string text [,string caption,MessageBoxButtons buttons])

 

첫 번째 인수 text는 메시지 박스의 중앙에 표시할 메시지 문자열이며 두 번째 인수 caption은 메시지 박스의 타이틀 바에 출력할 캡션 문자열이다. 세 번째 인수는 메시지 박스에 나타날 버튼의 종류를 지정하는데 생략시 확인 버튼만 나타난다. 첫 번째 인수는 반드시 전달해야 하며 나머지 인수는 필요없을 경우 생략할 수 있다. 다음이 호출 예이다.

 

MessageBox.Show("사용자에게 전달할 메시지입니다.");

MessageBox.Show("사용자에게 전달할 메시지입니다.", "알립니다");

 

메시지 내용은 동일하며 caption 인수 지정 여부만 다르다. 두 실행문에 의해 다음과 같은 메시지 박스가 각각 출력된다.

<v:f eqn="if lineDrawn pixelLineWidth 0 "></v:f><v:f eqn="sum @0 1 0 "></v:f><v:f eqn="sum 0 0 @1 "></v:f><v:f eqn="prod @2 1 2 "></v:f><v:f eqn="prod @3 21600 pixelWidth "></v:f><v:f eqn="prod @3 21600 pixelHeight "></v:f><v:f eqn="sum @0 0 1 "></v:f><v:f eqn="prod @6 1 2 "></v:f><v:f eqn="prod @7 21600 pixelWidth "></v:f><v:f eqn="sum @8 21600 0 "></v:f><v:f eqn="prod @7 21600 pixelHeight "></v:f><v:f eqn="sum @10 21600 0 "></v:f><o:lock v:ext="edit" aspectratio="t"></o:lock> 

메시지 문자열만 지정하면 타이틀 바에 아무 것도 출력되지 않지만 두 번째 인수에 캡션을 출력하면 타이틀 바에 이 문자열이 나타난다. 메시지 박스의 타이틀 바를 썰렁하게 비워두는 것보다는 보통 "에러", "경고", "알림" 등 메시지의 의미에 대한 짧은 문자열이나 또는 메시지를 출력하는 응용 프로그램의 이름을 쓰는 것이 좋다.

이런 메시지 박스는 확인 버튼만 나타나기 때문에 사용자에게 정보를 제공할 수만 있으며 질문을 할 수는 없다. 사용자는 단지 메시지 내용을 읽고 확인 버튼을 누르기만 할 수 있다. Show 메서드의 세 번째 인수 buttons를 지정하면 메시지 박스에 어떤 버튼들이 나타날 것인가를 지정할 수 있다. 버튼의 종류는 MessageBoxButtons 열거형으로 지정하며 다음과 같은 멤버들이 정의되어 있다.

 

열거 멤버

설명

OK

확인 버튼만 나타난다.

OKCancel

확인취소 버튼이 나타난다.

YesNo

아니오 버튼이 나타난다.

YesNoCancel

아니오취소 버튼이 나타난다.

RetryCancel

재시도취소 버튼이 나타난다.

AbortRetryIgnore

중단재시도무시 버튼이 나타난다.

 

이 인수에 따라 메시지 박스에 나타나는 버튼의 묶음이 달라지는데 질문의 종류에 맞게 버튼을 배치하면 된다. 예를 들어 질문을 통해 긍정 또는 부정의 응답을 받고 싶다면 YesNo 버튼을 배치하면 되고 여기에 취소 응답도 가능하다면 YesNoCancel 버튼을 배치하면 된다. Show 메서드는 사용자가 어떤 버튼을 눌렀는가를 나타내는 DialogResult 열거형 값중 하나를 리턴한다.

 

열거 멤버

설명

OK

확인 버튼을 눌렀다.

Cancel

취소 버튼을 눌렀다.

Yes

 버튼을 눌렀다.

No

아니오 버튼을 눌렀다.

Abort

중지 버튼을 눌렀다.

Ignore

무시 버튼을 눌렀다.

Retry

재시도 버튼을 눌렀다.

Nothing

아무 버튼도 누르지 않았다대화상자가 계속 실행중이다.

 

이 리턴값을 조사해 보면 사용자가 질문에 어떻게 응답했는지를 알 수 있다. 메시지 박스로 질문을 했다면 리턴값을 점검해야 하므로 Show 메서드는 보통 if문과 함께 사용된다. 다음 코드는 사용자에게 질문 후 그 응답 결과에 따라 처리를 달리한다.

 


  // using System.Windows.Forms;


       if (MessageBox.Show("안녕하세요?", "질문", MessageBoxButtons.YesNo)  == DialogResult.Yes)

            {

                // 네

            }

            else

            {

                // 아니요

            }

 

이 코드에 의해 다음과 같은 메시지 박스가 출력된다.

메시지 문자열이 중앙에 출력되어 있고 캡션에는 메시지의 의미를 짧게 설명하는 "질문"(사실 협박이라고 써도 될 것 같다) 문자열이 출력되어 있다. 그리고 메시지의 아래쪽에는 예, 아니오 두 개의 버튼을 배치하여 사용자가 두 버튼 중 하나를 눌러 질문에 답할 수 있도록 한다. Show 메서드 호출 결과 사용자가 누른 버튼이 Yes일 때와 그렇지 않을 때 응답에 따라 다르게 처리할 수 있다.

이 정도면 사용자에게 정보를 전달할 수 있고 질문도 할 수 있으므로 일반적인 용도로 메시지 박스를 활용하는 데는 충분하다. 좀 더 다양한 형태의 메시지 박스를 쓰고 싶다면 훨씬 더 복잡한 형태의 Show 메서드를 사용해야 한다. 가장 인수가 많고 완벽한 Show 메서드를 보자.

 

public static DialogResult Show (

     IWin32Window owner,

     string text,

     string caption,

     MessageBoxButtons buttons,

     MessageBoxIcon icon,

     MessageBoxDefaultButton defaultButton,

     MessageBoxOptions options,

     string helpFilePath,

     HelpNavigator navigator,

     Object param

)

 

무려 10개의 인수를 취하는데 부모 윈도우를 지정할 수 있고 메시지 박스에 아이콘을 표시할 수도 있다. 특정 버튼을 디폴트 버튼으로 지정하여 Enter키만 누르면 이 버튼을 누른 것처럼 만들 수도 있고 도움말 파일의 경로를 지정하여 사용자가 메시지 자체에 대해 도움말을 요청할 때 이 파일을 열도록 할 수도 있다. C#에 디폴트 인수 기능이 없기 때문에 Show 메서드가 과다하게 오버로딩되어 있는 편이다.