이제 대화 상자를 지원해보겠습니다. 프로그램은 메뉴 및 툴바에서 작성한 프로젝트(Paint)를 이용하겠습니다.
먼저 Paint프로젝트를 열고 대화 상자를 만들기위해 먼저 Form을 만듭니다.
프로젝트 명에서 우측버튼을 선택하여 생성된 메뉴에서 추가의 부메뉴 Windows Form을 선택하면 다음과 같은 대화 상자가 생성됩니다.
Form1.cs를 작성하고자 하는 대화 상자 이름을 입력(여기서는 DialogTestDlg.cs)한 후 추가를 선택하면 Form이 생성됩니다.
MainForm에서 TestDialog라는 메뉴을 하나 만들고 그 메뉴를 눌러 실행하는 함수에 다음과 같이 입력합니다.
private void dialogTestToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogTestDlg dlg = new DialogTestDlg();
if (dlg.ShowDialog() != DialogResult.OK)
return;
// 대화상자 설정 정보 이용 실행 루틴
}
dlg.ShowDialog()가 대화 상자 형태로 Form을 실행하는 함수입니다.
결과 값으로 DialogResult.OK가 넘어오면 실제 대화 상자 설정 정보 이용 실행 루틴을 아래에 입력하면 됩니다. 까끔 대화 상자내에 실행 루틴을 모두 넣어 구성하는 사람이 있는데, 어떤언어를 이용하여 개발을 하더라도 이런 습관은 버리기를 권장합니다.. 향후 대형 프로그램을 개발하게 되면 디자인(대화 상자는 디자인에 해당)과 소스가 뒤썩여 어려움을 격게 됩니다.
이제 확인 취소 버튼을 만들어 보겠습니다.
DialogTest.cs를 열어(디자이인 모드) 도구상자에서 Button을 마우스로 드래그 & 드롭을 합니다. 속성에서 Text를 확인으로 수정하고, (Name)을 buttonOK로 수정합니다. 같은 방식으로 버튼을 하나더 추가하여 Text를 취소로, (Name)을 buttonCancel로 수정합니다.
두버튼을 처리 방법을 생각해 보겠습니다. 대강 생각해보면 확인 버튼에서 이벤트 처리를 하여 DialogResult.OK로 리턴이 되도록 대화 상자를 종료하도록 구성하고, 취소 버튼에서 이벤트 처리를 하여 DialogResult.Cancel로 리턴이 되도록 대화 상자를 종료하면 될듯합니다. 그런데 생각해 보면 이것만이 아닙니다. 대화 상자에서 Enter키를 누르면 확인 버튼을 누른것과 같이 동작해야하고, Esc키를 누르면 취소 버튼을 누른것과 같은 동작을 해야합니다.
우선 DialogResult.OK를 리턴하고 종료하도록하는 것이 확인 버튼의 속성에서 DialogResult를 OK로 선택하고, DialogResult.Cancel을 리턴하고 종료하도록하는 것이 취소 버튼의 속성에서 DialogResult를 Cancel로 선택합니다.
대화 상자에서 Enter키를 누르면 확인 버튼을 누른것과 같이 동작하도록 하고, Esc키를 누르면 취소 버튼을 누른것과 같은 동작을 하도록하기 위해서 Form(대화 상자) 속성에 AcceptButton과 CancelButton이 존재합니다.
AcceptButton에 확인 버튼의 (Name)인 buttonOK를 입력(선택)하고, CancelButton에 취소 버튼의 (Name)인 buttonCancel을 입력합니다.
이제 실행을 해보겠습니다. 실행하여 작성한 DialogTest 메뉴를 선택하여 대화 상자를 실행하면 실행되는 위치가 조금 이상합니다.
속성의 약간 아래쪽을 보면 StartPosition이 있는데 부분을 CenterParent로 수정하면 원하는 대로 MainForm의 가운데 표시됩니다.
이제 Control에 대해 알아보겠습니다.
여기서는 기본 개념과 함께 많이 사용하는 Control에 대해 간단히 설명합니다.
사실 기본개념이라고 해서 별내용은 없습니다.
도구상자에서 원하는 Control을 삽입하고, 생성된 Control의 속성의 (Name)에 적당한 이름을 입력합니다.
이 이름에 의해 Control의 정보를 받아오거나, 설정하는 것이 모두입니다.
Control은 여기서 정확한 개념을 확립하고, 필요한 Control에 대해 책이나 인터넷을 보고 찾아 작성하여 구현하면 충분하리라 생각됩니다.
Label
Label은 단순히 화면에 표시하기 위해 사용하므로 따로 그 정보를 받거나 설정할 일은 없습니다. 간혹 프로그램에서 Label를 바꿀 경우는 있는데 이 경우 (Name)에 적은 라벨 변수.Text 에 문자열일 입력하면 됩니다.
labelFind.Text = "찾기";
TextBox
TextBox 또한 Label과 같이 Text 변수를 이용하여 정보를 받거나 설정합니다.
ComboBox
ComboBox는 일반적으로 여러개의 Item를 등록하여 그 Item을 선택하는데 많이 사용합니다.
Item을 등록하기 위해서 속성의 Items의 선택버튼(...)을 선택하면 다음과 같은 대화 상자가 생성됩니다.
여기에 필요한 항목을 세로로 하나씩 입력하고 확인을 선택하면 실행시 ComboBox에 항목이 올라오게 됩니다.
또한 실행해보면 ComboBox의 내용을 편집할 수 있는 형태로 실행이됩니다. 이 형태보다는 선택만 하는 형태를 더 많이 사용하므로 수정해 보겠습니다.
속성창을 아래로 내려보면 DropDownStyle이 있는데 이것을 DropDown을 DropDownList로 수정하면 됩니다.
이제 Source에서 (Name)에 입력한 이름.SelectedIndex를 이용하여 정보를 받거나 설정합니다.
comboBoxColor.SelectIndex = 0;
int nColor = comboBoxColor.SelectIndex;
CheckBox
CheckBox는 Checked변수를 이용하여 정보를 받거나 설정합니다.
RadioButton
RadioButton또한 Checked변수를 이용하여 정보를 받거나 설정합니다.
그러나 약간 성격이 다릅니다.
CheckBox가 하나하나 정보를 설정한다면 RadioButton의 경우 여러개의 RadioButton중 하나를 선택하여 그 정보를 얻도록 되어 있습니다.
따라서 RadioButton을 여러개 넣으면 자동으로 중 하나만 선택이 되도록 자동으로 들어가게 됩니다.
그러나 문제가 있습니다. 하나의 그룹으로 동작하는 RadioButton만 있을 경우 문제가 없으나 두 개의 그룹으로 동작하는 경우 모두 하나의 RadioButton만 선택되므로 사용이 힘들어 집니다.
이를 보완하기 위해 GroupBox가 존재합니다. 물론 그룹 박스가 RadioButton만을 위해 만들어진 것은 아니지만 RadioButton을 사용할 경우 필수로 사용해야 한다고 생각하면 될듯합니다.
GroupBox
C++에서 C#으로 발전하면서 가장 많은 변화가 있는 것이 GroupBox입니다. C++에서 GroupBox는 단순 디스플레이 기능만 가졌으나 C#에서는 객체를 GroupBox안에 넣으면 제대로 그룹기능이 됩니다.
위에서 이야기한 RadioButton이 그룹별로 구분이 되고, GroupBox를 숨기게되면 그 안에 포함된 모든 객체가 숨겨지게 됩니다.
이제 기본적으로 제공하는 대화 상자에 대해 알아보겠습니다.
기본적으로 제공하는 대화 상자는 PrintDialog, ColorDialog, FolderBrowserDialog, FontDialog, OpenFileDialog, SaveFileDialog등이 있습니다.
여기서도 모든 대화 상자를 설명하는 것이 아니라 OpenFileDialog를 이용하여 개념만을 설명하도록 하겠습니다.
대화 상자를 호출하고자하는 Form(여기서는 MainForm)에서 OpenFileDialog를 삽입하면 다음과 같이 아래쪽에 대화 상자 변수가 생성됩니다.
(Name)을 원하는 변수명(여기서는 openFileDialog)으로 변경하고, 호출하고자하는 곳에서 openFileDialog.ShowDialog();를 호출하면 대화 상자가 호출됩니다.
물론 속성에서 설정을 변경하여 표현되는 대화 상자 모양을 바꿀수 있습니다.
한 예로 Filter에 Image Files (*.bmp;*.gif;*.jpg)|*.bmp;*.gif;*.jpg 라고 입력하면 이미지 파일만 필터링되어 표시됩니다.
파일 열기
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "Image Files (*.bmp;*.gif;*.jpg;*.wmf)|*.bmp;*.gif;*.jpg;*.wmf";
dlg.FilterIndex = 1;
dlg.RestoreDirectory = true;
// dlg.InitialDirectory = "c:\\veye\\piclib";
if(dlg.ShowDialog()!=DialogResult.OK)
return;
this.strFileName = dlg.FileName;
예제 프로그램 다운로드
'C#' 카테고리의 다른 글
C#09. 파일 지원 (0) | 2022.03.08 |
---|---|
C#08. 메모리, 마우스 및 스크롤 (0) | 2022.03.08 |
C#06. GDI+ 및 깜박임 문제 해결 (0) | 2022.03.08 |
C#05. 메뉴 및 툴바 지원 (0) | 2022.03.08 |
C#04. 실제 프로그램 제작 (0) | 2022.03.08 |