본문으로 바로가기
반응형

 

[WinForm] C# 윈폼 2. 컨트롤, 대화상자, 텍스트박스, 메인 메뉴, 고급 폼

 

새 프로젝트를 만들때 주의해야할 점

- 새로 프로젝트를 만들때는 솔루션 탐색기에서 우클릭후에 추가->새 프로젝트를 해주면된다.

- 새로 프로젝트를 만들면 시작 프로젝트로 설정해줘야 해당 프로젝트를 실행할 수 있다.

 

 

 

각 버튼에 이벤트를 지정해보자(어제 버튼에 이어서 예제 작성)

각 버튼을 더블클릭하거나 이벤트(속성창의 번개 모양)의 '클릭' 부분을 더블클릭해준다
더블클릭하면 MainForm으로 옮겨지면서 클릭한 도구의 메서드가 생긴 것을 확인할 수 있다

 

 

버튼을 클릭했을때 레이블에 버튼의 텍스트가 출력되는 윈폼 작성)

각 메서드에 레이블버튼스타일 구문을 지정해주자

 

 참고로 모든 클래스 Tostring()을 가지고있다는 점을 참고하자.(거의 오류가 뜰때 쓰는 치트키이다)

 

실행화면을 하나씩 캡처해서 이어붙인 화면. 버튼을 클릭했을때 그 글자가 출력되는 것을 확인할 수 있다



TabIndex 설정

TabIndex로 번호를 지정해주면 실행했을때 Tab을 누르면 번호지정한 순서대로 버튼의 테두리가 이동된다

 

 

 

체크상자

주어진 항목들 중에서 선택할 수 있는 컨트롤이며 주어진 항목을 복수로 선택할 수 있다.

 

 

체크상자의 프로퍼티

- Control 클래스를 상속받은 컨트롤이기 때문에 버튼과 대부분 동일하다.

- ` 상자의 체크 상태를 나타내는 Checked 프로퍼티가 추가로 제공된다.

 

 

Checked 프로퍼티

- 참으로 설정하면 네모 부분에 표시가 'V'가 표시된다

- Checked 프로퍼티의 값이 변경될 때마다 CheckedChanged 이벤트가 발생한다

 

 

체크 상자 예제) 체크 박스를 체크했을때 레이블1에 체크 박스의 과일을 출력하는 예제를 작성해보자

교안에 있는 예제

 

내가 알아서 예제 작성

 

1. 그룹 박스를 생성하고 Name을 좋아하는 과일을 수정

2. 체크박스를 4개생성, 각 체크 박스의 이름을 사과, 딸기, 오렌지, 바나나로 수정

3. 레이블 1개 생성

 

 

이벤트를 지정해보자

체크박스는 디폴트 이벤트가 CheckedChanged이다. 더블클릭하면 메서드가 생성될 것이다.

사과 체크박스를 더블 클릭하거나 CheckedChanged를 더블 클릭하면 메서드가 생성된다

 

각 메서드 문을 작성해보자

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CheckBoxTestApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void UpdateLabel()
        {
            string strchk1 = "";
            string strchk4 = "";
            string strchk5 = "";
            string strchk6 = "";

            if (checkBox1.Checked) strchk1 = checkBox1.Text; // 체크박스의 텍스트를 체크하면 strchk1에 문자를 집어넣음
            else strchk1 = "";                            // 반대가 되면 "" (공백)을 준다
            if (checkBox4.Checked) strchk4 = checkBox4.Text;       
            else strchk4 = "";
            if (checkBox5.Checked) strchk5 = checkBox5.Text;
            else strchk5 = "";
            if (checkBox6.Checked) strchk6 = checkBox6.Text;
            else strchk6 = "";

            label1.Text = strchk1 + " " + strchk4 + " " + strchk5 + " " + strchk6;

        }
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            UpdateLabel();
        }
        private void checkBox4_CheckedChanged(object sender, EventArgs e)
        {
            UpdateLabel();
        }

        private void checkBox5_CheckedChanged(object sender, EventArgs e)
        {
            UpdateLabel();
        }

        private void checkBox6_CheckedChanged(object sender, EventArgs e)
        {
            UpdateLabel();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = "좋아하는 과일을 선택하세요 ";    // 시작했을때 "label1" 으로 출력되던 레이블을 "좋아하는 과일"로 수정
        }
    }
}

 UpdateLabel으로 체크됬을때(True)랑 체크해제(False)가 됬을때의 메서드를 지정해줬고, 각 버튼 메서드에는 업데이트가 되도록하고, FormLoad에는 label의 이름을 지정해주었다.

 

위의 코드 실행 후 하나씩 체크, 체크해제했을때 출력화면

 

 

 

 

라디오 버튼

주어진 항목들 중에서 오직 한 개만을 선택할 수 있는 컨트롤 라디오 버튼의 프로퍼티는 체크박스와 동일하다.

라디오 버튼의 기본적인 형태

 

1. 그룹 박스 좋아하는 음료 생성

2. 라디오 버튼 4개 생성 후 이름 수정

3. 레이블 1개 생성

 

 

 라디오 버튼은 체크 박스와 동일하게 각 라디오 버튼마다 더블클릭해서 메서드를 생성해주고 label1이 출력되도록 구문을 작성하자,

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RadioButtonTestApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            label1.Text = radioButton1.Text; // 라디오 버튼1을 체크하면 라벨에 라디오버튼1출력
        }
        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            label1.Text = radioButton2.Text;
        }
        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            label1.Text = radioButton4.Text;
        }
        private void radioButton4_CheckedChanged(object sender, EventArgs e)
        {
            label1.Text = radioButton4.Text;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = string.Empty;   // 시작화면일때 라벨에 공백을 출력
        }
    }
}

 

라디오 버튼 예제 실행 화면

 

 

 

레이블

각종 정보를 폼에 표시할때 사용하는 컨트롤이다.

 

 

레이블의 용도

1. 폼에 있는 컨트롤을 식별하는 정보를 표시한다.

2. 애플리케이션의 실행에 대한 응답 정보를 표시한다.

3. 특정 컨트롤을 클릭했을 때 실행되는 작업을 설명하는 메시지를 표시한다.

 

 

레이블의 기본적인 형태

label3이 FixedSingle, label4가 Fixed3D를 적용한 것이다.

레이블의 프로퍼티

Font, BorderStyle, TextAlign(글자 정렬)

 

 

BorderStyle

레이블의 테두리를 설정할때 사용하는 프로퍼티이다.

TextAlign

레이블과 같은 컨트롤에서 표시되는 문자열에 대한 정렬을 위한 프로퍼티이다. 

 

로그인 화면을 레이블로 작성해본 예시 화면

 

 

 

링크 레이블

1. 하이퍼링크(hyper link)를 설정할 수 있는 레이블 컨트롤이다.

2. 레이블 컨트롤을 상속받았기 때문에 레이블의 기본적인 기능을 모두 가지고있다.

3. 링크 레이블은 링크를 클릭했을때 발생하는 linkClicked 이벤트에 대한 이벤트 처리기를 작성한다.

4. 이벤트 처리를 위해서는 Process 클래스의 정적 메소드인 Start() 메서드를 사용한다.

 

더블클릭해서 링크를 클릭했을때의 이벤트 메서드를 작성

private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Process.Start(linkLabel1.Text);   // 링크를 클릭하면 링크사이트로 이동된다
        }

위의 네이버 링크를 클릭하면 네이버가 새로운 창으로 뜬다!!

 참고로, Process를 입력하면 오류가뜨는데 커서를 Process에 두고 Alt+엔터를 누르면  도움말이 뜨면서 필요없는 구문을 지우거나 필요한 구문을 써주는 기능이있다.

 

 

 

★텍스트 상자★

사용자가 직접 텍스트를 입력할 수 있는 기본적인 컨트롤로서 사용자로부터 입력 받거나 애플리케이션의 실행 결과를 출력하고자 할 때 유용하게 사용할 수 있다. 로그인같은거에 텍스트를 입력 받아야하는게 많기 때문에 중요한 개념이라고 볼 수 있다.

 

텍스트 상자의 프로퍼티

 

 

사용자의 이름과 패스워드를 입력받아 출력하는 예제를 만들어보자

 

 라벨의 속성에서 Multiline을 False -> True로 바꿔주면 위아래 크기가 조절할 수 있다.

 세번째 레이블 칸의 속성에서 ScrollBars를 Vertical으로 해준다

 ID, Password, OK 순으로 TabIndex를 지정

 세번째 레이블인 큰 칸에는 TabIndex를 4번, ReadOnly를 false->true로 바꿔준다

 ID, Password의 MaxLength를 각각 12, 20으로 지정

 

 

맨밑의 버튼의 메서드를 생성해주고 구문을 작성해준다

private void button1_Click(object sender, EventArgs e)
        {
            //textBox3.Text = "ID : " + textBox1.Text + "\n" + "PASSWORD : " + textBox2.Text;
            textBox3.Text = $"ID : {textBox1.Text} \r\nPASSWORD : {textBox2.Text}";
        }

아이디랑 비밀번호를 입력하면 출력하는 것을 확인할 수 있다

 

 

관리자 로그인을 설정해보자

 

private void button1_Click(object sender, EventArgs e)
        {
            //textBox3.Text = "ID : " + textBox1.Text + "\n" + "PASSWORD : " + textBox2.Text;
            textBox3.Text = $"ID : {textBox1.Text} \r\nPASSWORD : {textBox2.Text}";

            if(textBox1.Text.ToUpper() == "ADMIN" 
                && textBox2.Text.ToUpper() == "ADMINPASSWORD")
            {
                MessageBox.Show("관리자 로그인입니다");
            }
        }

관리자 로그인 사용예제

 

 

 

 

리스트

리스트 기반 컨트롤

ListControl 클래스를 상속받은 컨트롤을 가르킨다.

 

 

리스트 기반 컨트롤의 종류

- 리스트상자

- 콤보상자

- 체크리스트 상자

 

리스트 기반 컨트롤의 기본적인 형태

 

 

리스트 상자

사용자가 선택할 수 있는 항복들의 목록을 표시해 주는 컨트롤

 

 

리스트 상자의 프로퍼티

 

 

리스트 상자의 항목을 선택하는 방법

 - SelectionMode 프로퍼티 값에 따라 변경

 - SelectionMede 열거형

 

 

 

리스트 상자의 항목

Tiems 프로퍼티를 통하여 추가 및 삭제 가능하다.

- 문자열 컬렉션 편집기

- ObjectCollection 클래스 메서드

 

 

ObjectCollection 클래스의 메서드

 

 

리스트 예제)

리스트박스1개, 라벨1개, 테스트박스1개, 체크박스1개, 버튼2개를 생성 후 이름 수정

 

텍스트 박스의 MaxLegnth 을 50, listBox의 ScrollAlwaysVisible을 False -> True로 변경

콤보박스의 DropDownStyle을 DropDownList로 변경

 

 

 

추가버튼과 제거버튼을 더블클릭해서 메서드를 생성한 후 구문 작성

private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "")       // 추가 버튼
            {
                listBox1.Items.Add(textBox1.Text);
                comboBox1.Items.Add(textBox1.Text);
            }
            textBox1.Text = "";   // 추가버튼을 누르면 텍스트박스는 공백으로 만들어줌
            textBox1.Focus();   // 텍스트박스1에 커서가 가도록 하는 구문
        }

        private void button2_Click(object sender, EventArgs e)    // 제거 버튼
        {
            if(listBox1.SelectedIndex > -1)  // 0은 인덱스중 첫번째를 선택했다는 것
            {                                // 0도 선택을 했다는 뜻이기때문에 -1보다 커야함
                listBox1.Items.RemoveAt(listBox1.SelectedIndex);
            }
        }

리스트 박스에 데이터를 추가

 

 

리스트 박스에 데이터 제거

 

콤보상자

 사용자가 상자를 클릭하면 목록이 나타나는 드롭다운(drop-down)형식의 컨트롤이다.

 

DropDownStyle

 콤보 상자의 형태를 결정하며 ComboBoxStyle을 열거형으로 가진다.

ComboBoxSytle 열거형

 

콤보 박스의 항목

Items 프로퍼티를 통하여 추가 및 삭제가 가능하다.

- 문자열 컬렉션 편집기

- ObjectCollect 클래스 메서드

 

콤보 박스에서 이벤트 속성에서 SelectedIndexChanged를 선택해서 메서드 구문 작성(콤보 박스의 디폴트 이벤트이다.)

 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            label2.Text = comboBox1.SelectedItem.ToString();
        }

리스트 예제에서 콤보박스를 추가해서 '결과' 레이블에 클릭한 데이터를 출력하는 모습

 

 

 

체크 리스트 상자

리스트 상자의 항목에 체크 상자를 추가한 형태의 컨트롤이다.

체크 리스트 상자의 기본적인 형태

 

체크 리스트 상자의 프로퍼티

 리스트 상자와 대부분 동일하다.

 CheckOnClick 프로퍼티가 추가된다.(항목을 클릭했을때 체크 상자에 'V' 표시가 나타나도록 설정.

 

 취미에 관련된 다양한 항목을 제시해 준 후, 클릭하여 선택하면 CheckedItems 프로퍼티를 이용하여 선택된 항목을 출력하는 예제를 작성해보자

 

체크리스트 박스의 재생버튼을 클릭한 다음 항목 편집으로 박스 안의 내용을 작성할 수 있다

 

체크 박스의 칸에 모든 항목이 들어가지않으면 속성창에 MultiColumn을 True로해줘서 넘어가는 문제를 해결할 수 있다.

 private void button1_Click(object sender, EventArgs e)
        {
            var strTemp = "";
            foreach ( var item in checkedListBox1.CheckedItems)
            {
                strTemp += item.ToString() + " ";
            }
            MessageBox.Show($"당신의 취미는 {strTemp} 입니다.", "확인", 
                MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if(e.NewValue == CheckState.Checked && checkedListBox1.CheckedItems.Count >= 3)
            {
                e.NewValue = CheckState.Unchecked;
                MessageBox.Show("최대 선택 개수는 3개입니다.");
            }
        }

3개를 클릭하고 선택을 눌렀을때의 이벤트
3개 이상을 선택하려고할때 발생하는 이벤트

 

 

9장. 대화상자

대화상자의 용도

 - 사용자와 애플리케이션간의 교량 역할

 - 주로 소량의 데이터를 입출력하기 위한 수단

 - 대화상자가 종료되기 전에 대화상자를 띄운 애플리 케이션으로 돌아갈 수 없다.

 

 

대화상자의 생성 방법

 - 모달(modal) 대화상자

 - 모덜리스(modeless) 대화상자

 

 

대화상자의 종류

 - 메시지 대화상자 : 사용자에게 간단한 메시지 표현

 - 공통 대화상자 : 윈도우 운영체제에서 기본적으로 제공되며 열기, 저장, 글꼴, 색, 인쇄 페이지, 설정 등이있다.

 

 

모달(modal) 대화상자 만드는 방법

 - Form 클래스의 멤버인 ShowDialog() 메서드를 이용한다.

 

 

모달 대화상자의 형식)

Form2 form2 = new Form2();
form2.ShowDialog(); // form2를 모달 방식으로 띄운다

 

모달 대화상자 예시) 메모장에서 편집내용을 저장하지 않고 종료할 때.

저장하겠냐고 물어보는 창이 대표적인 모달 대화상자의 예시이다

 

 

버튼을 클릭하면 모달 대화상자가 새로 뜨는 예시를 작성해보자

Modal 솔루션에서 우클릭 -> 추가 -> 새 항목을 클릭
윈도우 폼's에서 양식으로 Form2라는 이름으로 새 항목을 추가해준다

새로운 폼을 생성해서 모달 대화상자창으로 쓸것이다.

// 폼2 구문(닫기 버튼 더블클릭해서 메서드 작성)
private void button1_Click(object sender, EventArgs e)
        {
            Close();    // 폼2의 창에서 닫기 버튼을 누르면 꺼짐
        }

Form2 윈폼 작성

 

 Form1에서 버튼을 클릭했을때 모달 대화상자가 떠야하니 버튼에 메서드문을 작성해준다

// 폼1 구문(Modal Popup 더블 클릭해서 메서드 구문 작성)
private void button2_Click(object sender, EventArgs e)
        {
            Form2 form = new Form2();
            form.ShowDialog();   // 모달 팝업
            //form.Show();     // 모달 리스
        }

 

Form1에 윈폼을 작성하고 실행하면 Form2가 실행된것을 확인할 수 있다

 

 

메시지 상자

- 사용자에게 간단한 메시지를 전달할 때 사용

- MessageBox 클래스의 멤버인 Show() 메서드 이용

- 12개의 중복된 Show() 메서드중 기본 형식

 

 

버튼의 종류

MessageBoxButtons 열거형의 멤버로서 5가지

 

 

아이콘의 종류

- MessageBoxIcon 열거형의 멤버로서 9개의 기호상수.

- 아이콘의 모양은 4가지이다.

Error, Question, Warning, Information 4가지만 기억하자

 

 

메시지 상자 - 기본 버튼 설정

기본 버튼

- 메시지 상자가 활성화 될 때 초기에 입력포커스를 갖는 버튼

- 기본 버튼을 명시하지 않으면 첫 번재 버튼이 기본 버튼

- 잘 안쓰임

 

 

공통 대화상자

윈도우 운영체제에서 기본적으로 제공.

정형화된 대화상자

 

CommonDialog 클래스의 파생 클래스

 

 

열기 대화상자

드라이브, 폴더, 파일 확장자를 설정하여 원하는 형식의 파일을 찾을 수 있는 기능 제공.

 

OpenFileDialog 컴포넌트의 주요 프로퍼티

 

 

버튼을 클릭하여 열기대화상자를 띄우고, 선택한 파일의 경로와 이름을 텍스트 상자에 출력하는 예제

 

우선 텍스트상자와 버튼, OpenFileDialog를 깔아준다

 

open버튼을 더블클릭해서 메서드문을 생성한 다음, 아래의 메서드를 작성하였다.

private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.FileName = "";
            openFileDialog1.InitialDirectory = "C:\\";  // 역슬래시를 문자열로 출력하려면 두번써야한다
            openFileDialog1.Filter = "텍스트 파일(*.*)|*.*";
            openFileDialog1.Multiselect = true;
            openFileDialog1.ShowDialog();

            foreach ( var item in openFileDialog1.FileNames)
            {
                textBox1.Text = textBox1.Text + item;
                textBox1.Text = textBox1.Text + Environment.NewLine;
            }
        }

.txt 파일을 열면 그대로 text 상자에 출력되는 것을 확인할 수 있다

 

글꼴 대화상자

글꼴, 글자의 크기, 글자의 색상, 형태 등을 설정할 수 있는 기능을 제공한다.

강사님께서 생략

 

 

 

색 대화상자

색상표에서 기본 색을 선택하거나 사용자 지정 색을 만들어 사용할 수 있는 기능 제공

위의 예제에서 open 버튼 밑에 두개의 버튼을 만들어주고 더블클릭해서 각각 메서드 구문을 작성

	    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;
            }
        }

색 대화상자 예제 실행화면

 

 

 

 

10장. 고급 폼

메뉴 다루기

마우스 다루기

키보드 다루기

 

메뉴 다루기

메뉴는 윈폼 앱에서 가장 일반적인 사용자 인터페이스이며, 윈폼 앱이 제공하는 기능을 사용자가 쉽게 이해하고 사용할 수 있도록 도와주는 기능이다.

 

 

메뉴의 종류

메인메뉴(main menu) : 폼의 상단에 배치되는 주요 메뉴

상황메뉴(context menu) : 마우스 오른쪽 버튼을 클릭했을 때 나타나는 팝업 메뉴

 

 

메인 메뉴

- 폼의 상단에 배치되는 메뉴로써 마우스 클릭뿐만 아니라 단축키를 통해서는 접근할 수 있는 가장 기본적인 사용자 인터페이스이다. 통합 개발 환경의 MenuStrip 컴포넌트를 통하여 작성한다.

- 도구상자에서 메뉴 및 도구 모음에서 모든 도구가 Strip인 것을 확인할 수 있다

 

 

메인 메뉴의 작성

메뉴 항목의 추가

메뉴에 단축 문자를 부여하는 방법

- 사용할 단축문자 앞에 &를 붙임

- <Alt>키와 단축문자를 눌러서 메뉴의 선택이 가능

 

 

메뉴 항목의 단축키 적용

- 단축키를 적용할 메뉴 항목을 선택

 

 

구분선

- 메뉴 항목을 그룹화하기 위하여 구분선을 사용

- 메뉴 항목에 '-' 를 입력

 

 

메뉴 항목의 프로퍼티 정보를 참고하여 MainMenu를 작성하는 예제)

메뉴 및 도구 모음에서 MenuStrip 실행 후 파일(&F), 편집(&E), 도움말(&H)을 입력해주자

 

 

메인 메뉴부터는 오늘 강의 시간이 부족하므로 내일 다시 포스팅하도록 하겠습니다

 

 

 

 

 

 

=========================================================================

P.S) 1. C#의 파일명에 대해

 자동이벤트를 만들때 대문자로 시작하기때문에 C#에서는 이름을 대문자로 통일하는 것(Pascal표기법)이 편하다

예시) BtnSystem, BtnFlat

 

C#의 모든 파일의 이름들이 첫 알파벳이 대문자이다

 

자바랑 차이점으로, 자바는 Camel 표기법으로 보통 단어가 이어지더라고 단어의 첫글자만 대문자로 이름을 짓는다.

예를들어, btnSystemJump처럼  중간에 대문자를 섞어준다

 

 

=========================================================================

 

P.S) 2. 변수 명을 선언한 구문에 글자 밑에 ' ... ' 이 생겼을때

 C#의 네이밍 룰은 보통 대문자로 시작하는 파스칼식으로 하는것이기 때문에 C#에서는 소문자 이름을 허용은 해주지만 권유해주지만 불만이 있는것처럼 ...을 그어놓는다.

이때 Alt + 엔터를 누르면 VS가 알아서 처리해주기 때문에 한번 이용해보자.

 

=========================================================================

 

P.S) 3. 단축키

Alt + 엔터 : VS에서 조커같은 존재

Shift + Delete : 한 줄 지우기

Ctrl + D : 드래그했던 문장을 한번 더 써준다(복사해준다랑 비슷한 개념), 참고로 엑셀에서 해당 셀 밑의 드래그한 셀을 전부 같은 값으로 복사해준다.

반응형