안녕하세요~! 문쑹입니다 :) 날이 많이 덥네요ㅠ 모두들 더위 조심하세욥.
오늘은 조금 제대로 된 프로그램을 만들어 보도록 하겠습니다.
컨트롤
화면에 표시되어 사용자와 상호작용을 수행하는 컴포넌트를 의미.
종류 : 버튼, 레이블, 텍스트, 리스트
컨트롤 컨트롤의 종류
- 버튼 기반 컨트롤 : 버튼, 체크 상자, 라디오 버튼
- 레이블 컨트롤 : 레이블, 링크 레이블
- 텍스트 컨트롤 : 텍스트 상자
- 리스트 컨트롤 : 리스트 상자, 콤보 상자, 체크리스트 상자
버튼 기반 컨트롤
ButtonBase 추상 클래스를 상속받은 컨트롤을 의미.
버튼 기반 컨트롤의 종류
버튼, 체크 상자, 라디오 버튼
간단한 버튼 예제를 만들어 보겠습니다.
4개의 버튼에 각각 Flat, Popup, Standard, System이라고 Text를 변경해주었습니다. 각 버튼의 Name에 BtnFlat, BtnPopup, BtnStandard, BtnSystem이라고 주었습니다. 그리고 label1의 Name을 LblButtonStyle로 만들어서 실행되었을 때 문구가 변경되면서 결과값을 출력해주는 역할을 할거예요.
FlatStyle도 각각 버튼의 이름에 맞게 변경해주세요!
왼쪽 그림은 각 버튼의 Click 이벤트를 만들어 주었고 오른쪽 그림은 Form1을 클릭해서 FormLoad되었을 때 이벤트를 발생 시켰습니다.
private void BtnFlat_Click(object sender, EventArgs e)
{
LblButtonStyle.Text = FlatStyle.Flat.ToString();
}
private void BtnPopup_Click(object sender, EventArgs e)
{
LblButtonStyle.Text = FlatStyle.Popup.ToString();
}
private void BtnStandard_Click(object sender, EventArgs e)
{
LblButtonStyle.Text = FlatStyle.Standard.ToString();
}
private void BtnSystem_Click(object sender, EventArgs e)
{
LblButtonStyle.Text = FlatStyle.System.ToString();
}
private void MainForm_Load(object sender, EventArgs e)
{
LblButtonStyle.Text = "결과표시";
}
각각의 이벤트를 실행 시키기 위한 소스 코드입니다. 위와 같이 코드를 작성한 후 버튼을 실행 시켜보겠습니다.
실행시켰을 때 label1이 "결과표시"로 변경되었습니다.
그리고 Flat의 TabIndex를 0, Popup을 1, Standard를 2, System을 3으로 설정해주고 실행시킨 후 Tab을 눌려보시면 위치가 변경되는 것을 확인할 수 있습니다.
체크상자
- 주어진 항목들 중에서 선택할 수 있는 컨트롤
- 주어진 항목을 복수로 선택할 수 있음
체크 상자의 프로퍼티
- Control 클래스를 상속받은 컨트롤이기 때문에 버튼과 대부분 동일.
- 체크 상자의 체크 상태를 나타내는 Checked 프로퍼티가 추가로 제공.
Checked 프로퍼티
- 참으로 설정하면 네모부분에 'V'가 표시
- Checked 프로퍼티의 값이 변경될 때마다 CheckedChanged 이벤트 발생
아래의 그림과 같이 CheckBox 예제를 만들어 보겠습니다.
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
label1.Text = checkBox1.Text;
}
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
label1.Text = checkBox2.Text;
}
private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
label1.Text = checkBox3.Text;
}
private void checkBox4_CheckedChanged(object sender, EventArgs e)
{
label1.Text = checkBox4.Text;
}
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "좋아하는 과일 : ";
}
이렇게만 코드를 작성하면 label에 마지막 클릭했던 과일만 나오게 됩니다. 중복된 값을 표시하게 해줄려면 아래와 같은 코드를 작성해주시면 됩니다.
namespace CheckBoxTestApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private string strTemp = "";
private void UpdateLabel(string s, bool b)
{
if(b)
{
strTemp += s + ", ";
label1.Text = strTemp;
}
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
UpdateLabel(checkBox1.Text, checkBox1.Checked);
}
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
UpdateLabel(checkBox2.Text, checkBox2.Checked);
}
private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
UpdateLabel(checkBox3.Text, checkBox3.Checked);
}
private void checkBox4_CheckedChanged(object sender, EventArgs e)
{
UpdateLabel(checkBox4.Text, checkBox4.Checked);
}
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "좋아하는 과일 : ";
}
}
}
하지만 이렇게 또 하면 반대로 체크 해제했을때는 그대로 label에 남아있게 됩니다. 해제했을때 값도 지워지는 코드를 적어보겠습니다.
private void UpdateLabel()
{
string strchk1 = "", strchk2 = "", strchk3 = "", strchk4 = "";
if (checkBox1.Checked) strchk1 = checkBox1.Text; // 체크박스에 체크가 되있으면 글자를 출력
else strchk1 = ""; // 체크박스에 체크가 해제되면 글자 없애줌
if (checkBox2.Checked) strchk2 = checkBox2.Text;
else strchk2 = "";
if (checkBox3.Checked) strchk3 = checkBox3.Text;
else strchk3 = "";
if (checkBox4.Checked) strchk4 = checkBox4.Text;
else strchk4 = "";
label1.Text = strchk1+ " " + strchk2 + " " + strchk3 + " " + strchk4;
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
UpdateLabel();
}
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
UpdateLabel();
}
private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
UpdateLabel();
}
private void checkBox4_CheckedChanged(object sender, EventArgs e)
{
UpdateLabel();
}
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "좋아하는 과일 : ";
}
이제 실행을 시켜보시면 체크 및 해제가 잘 됩니다 :)
라디오 버튼
주어진 항목들 중에서 오직 한 개만을 선택할 수 있는 컨트롤
아래와 같은 간단한 예제를 만들어 보겠습니다.
namespace RadioButtonTestApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = string.Empty;
}
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
label1.Text = radioButton1.Text;
}
private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
label1.Text = radioButton2.Text;
}
private void radioButton3_CheckedChanged(object sender, EventArgs e)
{
label1.Text = radioButton3.Text;
}
private void radioButton4_CheckedChanged(object sender, EventArgs e)
{
label1.Text = radioButton4.Text;
}
}
}
라디오 버튼은 체크박스에 비해 되게 간단한것 같습니다.
레이블
각종 정보를 폼에 표시할 때 사용하는 컨트롤
레이블의 용도
- 폼에 있는 컨트롤을 식별하는 정보를 표시
- 애플리케이션의 실행에 대한 응답 정보를 표시
- 특정 컨트롤을 클릭했을 때 실행되는 작업을 설명하는 메세지를 표시.
텍스트 상자
사용자가 직접 텍스트를 입력할 수 있는 기본적인 컨트롤로서 사용자로부터 값을 입력 받거나 애플리케이션의 실행 결과를 출력하고자 할 때 유용하게 사용할 수 있음.
텍스트 상자 프로퍼티
프로퍼티 | 설명 |
MaxLength | 텍스트 상자에 입력할 수 있는 최대 문자 수를 설정 |
Multiline | 텍스트 상자의 영역을 여러 줄로 설정 |
PasswordChar | 텍스트 상자의 암호 입력에 사용할 문자를 설정 |
ReadOnly | 텍스트 상자의 텍스트를 변경하지 못하도록 설정 |
WordWrap | 텍스트 상자의 텍스트가 영역을 초과할 경우 자동으로 줄을 바꾸도록 설정 |
ScrollBars | Multiline 프로퍼티가 참인 경우 텍스트 상자에 스크롤 바를 설정 (None, Horizontal, Vertical, Both) |
아래와 같은 사용자 이름과 패스워드를 입력받아 출력하는 예제를 만들어 보겠습니다.
텍스트 상자를 가지고 로그인을 할 수 있는 프로그램을 만들어 보겠습니다.
private void button1_Click(object sender, EventArgs e)
{
textBox3.Text = $"ID : {textBox1.Text} \r\nPASSWORD : {textBox2.Text}";
}
패스워드의 ● 특수문자는 속성창에서 passwordChar부분에 특수문자를 입력해주시면 되겠습니다.
아이디와 패스워드 확인 창(textBox3)에서는 멀티라인을 활성화 시켜주고 읽기전용으로 바꾼후 스크롤바는 가상으로 설정해줍니다.
리스트
리스트 기반 컨트롤
ListControl 클래스를 상속받은 컨트롤을 가리킴
리스트 기반 컨트롤의 종류
- 리스트 상자 - 사용자가 선택할 수 있는 항목들의 목록을 표시해 주는 컨트롤
- 콤보 상자 - 사용자가 상자를 클릭하면 목록이 나타나는 드롭다운(drop-down) 형식의 컨트롤
- 체크리스트 상자 - 리스트 상자의 항목에 체크 상자를 추가한 형태의 컨트롤
대화상자
대화상자의 용도
- 사용자와 애플리케이션간의 교량 역할
- 주로 소량의 데이터를 입출력하기 위한 수단
대화상자의 생성방법
- 모달(modal) 대화상자
- 모덜리스(modeless) 대화상자
대화상자의 종류
- 메세지 대화상자 - 사용자에게 간단한 메세지 표현
- 공통 대화상자 - 윈도우 운영체제에서 기본적으로 제공
모달 대화상자
대화상자가 종료되기 전에 대화상자를 띄운 애플리케이션으로 돌아갈 수 없음
Form 클래스의 멤버인 ShowDialog() 메소드 이용
Form2 form2 = new Form2();
form2.ShowDialog(); // form2를 모달 방식으로 띄운다.
빈 양식으로 form2를 생성합니다.
form2를 라벨 1개와 버튼 1개로 위와 같은 그림과 같이 만들어 주세요
private void button1_Click(object sender, EventArgs e)
{
Close();
}
코딩은 버튼 클릭 이벤트로 닫기만 해주시면 됩니다.
버튼을 하나 추가해주세요
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
//form.ShowDialog();
form.Show();
}
메세지 상자에는 다양한 아이콘이 존재합니다. MessageBoxIcon 열거형의 멤버로서 9개의 기호 상수가 있습니다.
아이콘의 모양은 4가지입니다.
공통 대화상자
- 윈도우 운영체제에서 기본적으로 제공
- 정형화된 대화상자
CommonDialog 클래스의 파생 클래스
- OpenFileDialog (파일 열기)
- SaveFileDialog (파일 저장)
- FontDialog (글꼴)
- ColorDialog (색)
- PrintDialog (인쇄)
- PageSetupDialog (페이지 설정)
- FolderBrowserDialog (폴더 탐색/생성)
openFileDialog와 colorDialog를 가지고 간단한 예제를 만들어 보겠습니다.
Open을 눌렸을 때는 file을 읽어오는 창이 나타나고 Form Colordms은 뒷 배경색을, Btn Color은 해당 버튼의 색상을 변경하도록 하였습니다.
namespace OpenFileDlgApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.FileName = "";
openFileDialog1.InitialDirectory = "C:\\";
openFileDialog1.Filter = "텍스트파일(*.txt)|*.txt";
openFileDialog1.ShowDialog();
foreach (var item in openFileDialog1.FileNames)
{
textBox1.Text += item;
textBox1.Text += Environment.NewLine; // os 환경에서 한 줄 떨어트리는 속성
}
}
private void button2_Click(object sender, EventArgs e)
{
if(colorDialog1.ShowDialog() == DialogResult.OK)
{
BackColor = colorDialog1.Color;
}
}
private void button3_Click(object sender, EventArgs e)
{
if (colorDialog1.ShowDialog() == DialogResult.OK)
{
button3.BackColor = colorDialog1.Color;
}
}
}
}
이상 포스팅을 마치겠습니다 감사합니다 :)
Hasta Luego~!
'C# Winform' 카테고리의 다른 글
C# Winform 강의 6일차 (0) | 2020.06.22 |
---|---|
C# Winform 강의 5일차 (0) | 2020.06.19 |
C# Winform 강의 4일차 (0) | 2020.06.18 |
C# Winform 강의 3일차 (0) | 2020.06.17 |
C# Winform 강의 1일차 (0) | 2020.06.15 |