파일명 : mie_up_20141012171420

Download Report

Transcript 파일명 : mie_up_20141012171420

비주얼 프로그래밍
(비주얼 C# 닷넷)
1장 C# 개요
1. 비주얼 C# 시작하기
(연습 1.) Console.WriteLine() 연습해보기
Console.WriteLine(“Test Program”);
string name = “HerYongDo";
int number = 8231033;
Console.WriteLine("이름: {0} 학번: {1}", name, number);
string name = “HerYongDo";
int number = 8231033;
Console.WriteLine("이름:" + name + "학번:" + number);
(연습 2.) Console.ReadLine() 연습해보기
(키보드로 부터 실수(double)형 읽어 들이기
string in_str;
in_str = Console.ReadLine();
double in_val = double.Parse(in_str);
(문제 1.)
반지름을 읽어 원의 면적과 원둘레를 구하는 프로
그램을 완성해보시오
static void Main(string[] args)
{
string in_str;
Console.Write("반지름 입력 : ");
in_str = Console.ReadLine();
}
double radius = double.Parse(in_str); // 원둘레 계산
double C, Area;
C = 2*3.141592*radius;
Area = 3.141592*radius*radius;
Console.WriteLine("반지름 : " + radius + " -> 원둘레 : " + C);
Console.WriteLine("반지름 : " + radius + " -> 원면적 : " + Area);
2장 C# 기초 문법
비주얼 C# 의 자료 형(CTS)
Class name
System.Byte
System.SByte
System.Int16
System.Int32
System.Int64
System.UInt16
System.UInt32
C# 형식
byte
sbyte
short
int
long
ushort
uint
C++ 형식
unsigned char
char
short
int 또는 long
__int64
unsigned short
unsigned int
또는
unsigned long
비주얼 베이직 형식
Byte
SByte
Short
Integer
Long
UShort
UInteger
System.UInt64
System.Single
System.Double
System.Boolean
System.Char
System.Decimal
System.IntPtr
System.UIntPtr
System.Object
System.String
ulong
float
double
bool
char
decimal
없음.
없음.
object
string
unsigned __int64
float
double
bool
wchar_t
Decimal
없음.
없음.
Object*
String*
ULong
Single
Double
Boolean
Char
Decimal
없음
없음
Object
String
변수와 상수
- 변수는 기본 자료형과 참조 자료형으로 구분
- 예)
기본 자료형 : 정수형, 실수형, 문자형, 논리형 등
참조 자료형 : 클래스, 배열, 인터페이스 등
- 상수는 선언과 동시에 반드시 초기값을 할당
- 프로그램 관례에 따라 보통 대문자로 선언
- 예)
const int VALUE = 1;
const int VALUE; // 초기화하지 않으면 에러 발생
리터럴
- 데이터의 형을 명확하게 사용하기 위해서 사용하는 기호
- 예)
bool a = true;
// true 또는 false
int a = 100
// 정수 100
long a = 100L // int형과 구분하기 위해서 L 붙임
float a = 100.0f // 실수형을 나타내기 위해 f 붙임
decimal a= 10.2m // 배정도실수형을 나타내기 위해 m 붙임
System.Object 클래스의 중요 메소드
-
C#에서 제공하는 내장 데이터 형식들은 모두 객체이다.
또한, System.Object 클래스로부터 상속받았다.
상속 받아서 항상 사용할 수 있는 메소드
예)
bool Equals()
// 같은 객체인지 비교
Type GetType() // 객체의 형 정보
string ToString() // 객체의 이름을 문자열로 변환
is 연산자와 as 연산자
- is 연산자는 두 객체가 동일한지 비교하는 데 사용
- 예)
char data = ‘a’;
if( data is char) Console.Writeline(“Same”);
else Console.Writeline(“Not Same”);
- as 연산자는 형변환을 위해 사용하고, 형변환을 할 수 없으면 null 을 할당
- 예)
string obj = data as string;
if(obj == NULL) ………………
문제
- 정수 10과 실수 5.3을 변수에 각각 저장한 후 각 변수의 형 정보를 출력하는
프로그램을 작성해보시오. 또한 저장된 두 개의 숫자를 문자열로 변환하여 출
력해보시오.
int data1 = 10;
float data2 = 5.3f;
Console.Writeline(“data1의
Console.Writeline(“data2의
Console.Writeline(“data1의
Console.Writeline(“data1의
Console.Writeline(“data1과
타입 : {0} “, data1.Gettype());
타입 : {0} “, data2.Gettype());
문자열 : {0} “, data1.ToString());
문자열 : {0} “, data2.ToString());
data2의 형은 {0} “, data1.Equals(data2));
Checked 및 unchecked 연사자
- c#에서 자료형이 표현할 수 있는 범위를 벗어나면 오버플로우 발생
- 따라서 사용자가 예상하지 못한 연산이 수행될 수 있음
- 이럴 때 Checked 연산자를 사용하면 정수 계열의 산술 연산 및 변환에 대한
오버플로우 검사를 실행하여 에러처리를 함
- 예)
int data1 = 99999;
short data2 = checked((short)data1);
Console.WriteLine(“data1 = “ + data1);
System.Convert 클래스
- 기본 자료형 간에 형변환을 쉽게 처리하는데 사용
- 사용할 수 있는 메소드
- 예)
ToInt32(), ToString(), ToChar(), ToBoolean(), ToByte(), ToDouble()
ToDecimal(), ToSingle() 등
- 사용 예)
string data1 = “1234567”;
float data2 = 10.5f;
int data3 = 0;
Console.WriteLine(“문자열 data1 = “ + data1);
data3 = System.Convert.ToIn32(data1)
+ System.Convert.ToIn32(data2)
Console.WriteLine(“ {0} + {1} = {2} “,data1,data2,data3);
( 알아두면 유용)
- C# 은 정수계열 형식, 부동 소수점 형식 모두에게 Parse() 메소드를 제공
- 예)
int a = int.Parse(“12345”);
float b = float.Parse(“123.45”);
- C# 은 또한 숫자를 문자열로 변환하기 위해 ToString() 메소드를 제공
- 예)
int c = 12345 ; string d= c.ToString();
float e = 123.45; string f = e.ToString();
열거형
- 같은 범부에 속하는 여러 개의 상수를 선언할 때 사용
- const 키워드 대신 enum 키워드를 이용
- 예)
enum 열거형식명 { 상수1, 상수2, 상수3, …… }
- 예)
enum DialogResult { YES, NO, OK, CANCEL};
DialogResult result = DialogResult.YES;
Console.WriteLine(result == Dialog.Result.Yes);
Console.WriteLine(result == Dialog.Result.NO);
Console.WriteLine(result == Dialog.Result.OK);
Console.WriteLine(result == Dialog.Result.CANCEL);
typeof (연산자)
- C#에서 객체의 형(System::Type)을 반환하는 연산자
- 예)
Type [] t = { typeof(int), typeof(float), typeof(char) } ;
for(int i=0; i<t.Length; i++)
Console.WriteLine(t[i].Name);
선택문
if(a>0)
a = b+c;
if(a>0)
a = b+c;
else
a= a – c;
if(grade>=90)
Console.WriteLine(“성적은
else if(grade>=80
Console.WriteLine(“성적은
else if(grade>=70)
Console.WriteLine(“성적은
else if(grade>=60)
Console.WriteLine(“성적은
Else
Console.WriteLine(“성적은
A”);
B”);
C”);
D”);
F”);
1. Switch 문으로 바꾸어 보시오?
2. 교과서 22p 예제 실행해보기
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
int a, b, c, d = 1; int sum = 0;
while (d == 10) {
Console.Write("첫번째 숫자를 입력하세요: ");
a =int.Parse(Console.ReadLine());
Console.Write("두번째 숫자를 입력하세요: ");
b = int.Parse(Console.ReadLine());
Console.Write("세번째 숫자를 입력하세요: ");
c = int.Parse(Console.ReadLine());
sum = a + b + c;
d++;
}
Console.WriteLine("총 합은" + sum + "입니다");
}
}
}
반복문
for(int i=1; i<10; i++)
for(int j=1; j<10; j++)
Console.WriteLine(“{0} * {1} = {2}”, i, j, i*j);
int sum =0;
int i = 1;
do {
While 문으로 바꾸어
sum = sum + i;
보시오 ?
i = i + 1;
} while(i <= 100) ;
Console.Writeline(“1부터 100까지의 합은” + sum);
int sum =0;
int [] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
foreach(int i in arr)
sum = sum + i;
Console.Writeline(“1부터 10까지의 합은” + sum);
배열
-
System.Array 클래스에서 파생
같은 종류의 데이터를 연속적으로 저장하는 자료구조
기본 자료형이 아닌 객체(참조 자료형)로 처리
new 연산자를 이용해 배열 객체를 선언하고 값을 할당
- 1차원 배열의 예)
int [ ] data = new int [5];
int [ ] data = new int [5] {1,2,3,4,5};
- 2차원 배열의 예)
int [ , ] data = new int [2,3];
int [ , ] data = new int [2,3] { {1,2,3}, {4[5[6} };
- 가변길이 배열의 예)
int [ ][ ] data = new
data[0] = new int[1]
data[1] = new int[2]
data[3] = new int[3]
int [3][ ];
{1};
{2,3,};
{4,5,6};
System.Array 클래스에서 제공하는 속성과 메소드 (교과서 28p 예제 실행해보기)
속성
의미
Length
배열에 포함되어 있는 모든 데이터의 총 개수
Rank
배열의 차원 수
메소드
의미
Sort
데이터를 오름차순으로 정렬
Reverse
데이터를 내림차순으로 정렬
Clear
지정한 데이타들을 0으로 초기화
Clone
동일한 내용을 갖는 배열을 복사
GetLength
지정한 배열 차원의 데이터의 개수
GetLowerBound
지정한 배열 차원의 시작 데이터의 첨자를 반환
GetUpperBound
지정한 배열 차원의 마지막 데이터의 첨자를 반환
GetValue
선택한 배열 인덱스의 데이터 값 불러오기
SetValue
선택한 배열 인덱스에 데이터 값 저장하기
( Array 클래스와 비슷한 ArrayList 클래스에도 대해서 조사해보세요 )
- 예)
int [ ] a = new int [100];
for(int i=0; i<100; i++)
a[i] = i;
Sytem.Console.WriteLine(“1차원 배열의 개수는 “ + a.Length;
3장 클래스와 구조체
클래스
- 클래스는 변수와 메소드의 집합
- 클래스를 사용하기 위해서는 new 연산자를 이용하여 인스턴스(객체) 생성
- 객체의 멤버를 이용하기 위해서는 점(.) 연산자를 이용
기능
클래스 멤버
의미
초기화
생성자
클래스 초기화와 관련된 기능/생성자 이름은 클래스 이름과 동일
소멸
소멸자
클래스가 소멸하는 시점에 호출/ ~클래스이름
데이터 저장 및 처리
상수
변하지 않는 숫자
멤버변수
접근제한자와 static, const 이용 가능
속성(프로퍼티)
클래스 외부에서 마치 변수처럼 이용 가능/get 또는 set을 이용
인덱서
접근자에 매개변수가 있는 것을 제외하면 속성과 동일
기능 구현
메소드
클래스가 가지고 있는 함수
기타
이벤트
이벤트 처리와 관련된 기능을 구현/delegate와 event를 이용
- 예)
class Temp {
int gdata = 10;
static sdata = 10;
public void Method() {
int idata = 100;
}
}
Temp sample = new Temp();
sample.Method();
멤버 변수 (접근 제한자를 사용하지 않으면 private)
멤버 함수
//
//
Temp sample;
sample = new Temp();
생성자와 멤버 변수
- 생성자는 클래스 이름과 동일한 메소드(리턴 값이 없음)
- 객체가 생성될 때 자동으로 호출되는 메소드
- 생성자는 중복선언이 가능(생성자 오버로딩)
- 예)
}
class Box {
public Box() {
top = 0; bottom = 0; left = 0; right = 0;
}
public Box(int t, int b, int l, int r) {
top = t; bottom = b; left = l; right = r;
}
public :
int top, bottom, left, right;
Box sample = new Box();
// 생성자 Box() 자동 호출
Box test = new Box(10,20,30,40); // 생성자 Box(int t, int b, int l, int r) 자동
// 호출
- 멤버 변수는
• 지역변수
• 전역변수
• 정적변수
(앞 예제 참조)
: 클래스 내의 메소드에서 선언된 변수 / 해당 메소드에서만 사용
: 클래스에서 선언된 변수 / 클래스의 모든 메소드에서 사용
: 모든 객체들이 공유하여 사용 / (클래스명.변수명)으로 사용
메소드(함수)
- 특정 기능을 실행하는 최소 실행 단위
- 예)
public void swap(int t, int s) {
int temp;
temp = t; t = s; s = temp;
}
- 정적(static) 메소드 // 클래스의 객체를 만들지 않고도 사용 가능
- 예)
using System;
class HelloWorld {
publci static void Main(string[ ] args) {
Console.WriteLine(“Hello World”);
}
}
프로퍼티
- 클래스의 private 멤버를 다른 클래스에서 접근할 수 있도록 해주는 방법
- 프로퍼티 이름은 private 멤버 변수의 첫문자를 대문자로 사용하는 것이 관례
- 예)
public [데이터 타입] [프로퍼티 이름] {
get { return 반환값; }
set { 멤버변수 = value; }
}
- 예)
namespace Property_test
{
class PropTest
{
private string name; // 멤버
public string Name
{
get { return name; }
set { name = value + " 님 반갑습니다."; }
}
}
}
class Program
{
public static void Main()
{
PropTest pt = new PropTest();
pt.Name = "C# "; // set 접근자 사용
string na = pt.Name; // get 접근자 사용
Console.WriteLine("이름 : {0}", na);
}
}
클래스 상속
- 클래스 상속은 파생 클래스 이름 뒤에 콜론(:)을 사용
- 예)
public class B : A {
………………….
}
- 파생 클래스는 부모 클래스의 public, protectd 접근 속성을 갖는 멤버 이용 가능
그러나 부모 클래스의 private 접근 속성을 갖는 멤버는 이용 불가
- 파생 클래스의
• 생성자는 최상위 클래스에서 하위 클래스 순서로 호출
• 소멸자는 최하위 클래스에서 상위 클래스 순서로 호출
- 예)
class A {
public A() { Console.WriteLine(“생성자 A()”); }
~A() {Console.WriteLine(“소멸자 ~A()”); }
}
class B : A {
public B() { Console.WriteLine(“생성자 B()”); }
~B() {Console.WriteLine(“소멸자 ~B()”); }
}
class C {
static void Main(string [ ] args) {
B sample = new B();
}
}
결과는 ?
교과서 41p 예제 실행해보기
Sealed 키워드
- 클래스 상속을 막을 때 사용
Base 키워드
- 파생 클래스에서 부모 클래스의 멤버를 접근할 때 사용
- 예)
public class NewFather {
public void Func() { Console.WriteLine("아버지의 함수"); }
}
public class NewSon : NewFather {
new public void Func() { Console.WriteLine("아들의 재정의 함수"); }
public void TestFunc() { base.Func(); } //NewFather의 메서드 호출
}
class Program {
static void Main(string[] args) {
NewSon ns = new NewSon();
ns.Func(); //NewSon의 Func 메서드 호출
ns.TestFunc();
}
}
- 파생 클래스 생성자에 있는 매개변수를 부모 클래스의 생성자의 매개변수에
전달시 사용
- 예)
교과서 p44 예제 실행해보기
메소드 중복 정의
- 동일한 메소드 이름을 가진 메소드를 여러 개 선언하여 이용
- 예)
class Program {
public int Add(int a, int b) {
return(a+b);
}
public float Add(float a, float b) { // 중복정의
return(a+b);
}
public double Add(double a, double b) { // 중복정의
return(a+b);
}
}
public static void Main() {
Program ex = new Program();
int i= ex.Add(3,5);
float j= ex.Add(0.1f,0.2f);
double k= ex.Add(0.5,0.7);
Console.WriteLine("정수합:{0}", i);
Console.WriteLine("실수합:{0}", j);
Console.WriteLine("배정도실수합:{0}", k);
}
메소드 재정의
- 부모 클래스로부터 상속받은 메소드를 파생 클래스에서 재정의하여 사용
- new 명령어 이용하는 방법 / virtual, override 명령어 이용하는 방법
(파생클래스 객체를 부모 객체로 형변환(업캐스팅) 할 경우 차이점이 있음)
- 예)
class Base {
public void NewFunc() { Console.WriteLine("Base.NewFunc"); }
public virtual void VirtualFunc(){ Console.WriteLine("Base.VirtualFunc");}
}
class Derived : Base {
new public void NewFunc() { Console.WriteLine("Derived.NewFunc"); }
public override void VirtualFunc(){ Console.WriteLine("Derived.VirtualFunc"); }
}
class Program {
public static void Main() {
Derived d = new Derived();
Base a = d; // 업캐스팅
d.NewFunc(); // Derived의 NewFunc
a.NewFunc(); // Base의 NewFunc
d.VirtualFunc(); // Derived의 VirtualFunc
a.VirtualFunc(); // Derived의 VirtualFunc
}
}
추상 클래스와 추상 메소드
- 구현없는 메소드를 하나 이상 포함하거나 abstract 키워드를 이용하여 클래스를
선언한 미완성 클래스
- 완전한 클래스가 아니기 때문에 객체를 생성할 수 없다
- 추상클래스에서 정의한 구현없는 메소드를 추상 메소드라 한다
- 추상클래스를 상속받은 클래스에서 추상메소드를 반드시 구현하여야 한다
- 예)
public abstract class Shape {
public abstract void draw(); // 추상메서드
public void Print() {
Console.WriteLine("추상 클래스는 구현있는 메소드를 포함할 수도 있다");
}
}
public class Circle: Shape {
//추상클래스의 구현
public override void draw() { Console.WriteLine("원을 그립니다"); }
}
public class Rect: Shape {
//추상클래스의 구현
public override void draw() { Console.WriteLine("사각형을 그립니다"); }
}
public class Program {
public static void Main() {
Circle cir = new Circle();
Rect rec = new Rect();
cir.draw(); // 원그리기
rec.draw(); // 사각형 그리기
rec.Print();
}
}
구조체
클래스
구조체
참조형식
값 형식
얕은 복사(Shallow Copy)
깊은 복사(Deep Copy)
new 연산자와 생성자 필요
선언만으로 생성
상속 가능
상속 불가
매개변수 없는 생성자 선언 가능
매개변수 없는 생성자 선언 불가능
struct Test
public
public
public
public
}
{
string name;
int korean;
int math;
int science;
public Test(string name, int korean, int math, int science)
{
this.name = name;
this.korean = korean;
this.math = math;
this.science = science;
}
public void Show()
{
Console.WriteLine(name + "의 시험 점수:");
Console.WriteLine("국어: "+ korean + ", 수학: "+ math + ", 과학: " + science);
}
class Program {
static void Main(string[] args)
{
Test student1 = new Test("김철수", 94, 96, 84, 92);
student1.Show();
}
}
Test student2;
student2.name = "김영희";
student2.korean = 100;
student2.math = 84;
student2.science = 86;
student2.Show();
결과는 ?
교과서 50p 예제 실행해보기
필수 구조체 (매우 중요함)
기능
Point / PointF
Point()000
생성자
속성(프로퍼티)
메소드
SIZE / SizeF
Size()
Point(int data)
Point(SIZE size)
Size(Point data)
Point(int x, int y)
Size(int x, int y)
X (Point x 좌표)
Height (Size 의 세로 값)
Y (Point y 좌표)
Width (Size의 값)
Empty (Point 객체 최기화)
Empty (Size 객체 초기화)
isEmpty (Point 가 비워있는지 검사)
isEmpty (Size 가 비워있는지 검사)
ToString()
ToString()
Equals(Point obj)
Equals(Point obj)
Offset(int x, int y)
Offset(int x, int y)
Rectangle 구조체 속성과 메소드 알아보기 ?
Color 구조체 속성과 메소드 알아보기 ?
인덱서(Indexer)
- 클래스 또는 구조체 객체를 배열과 같은 방식으로 이용
- 구조는 속성(Property)과 유사하며 get 및 set 접근자를 사용
- 객체를 인덱스하기 위한 인자를 가지며, 클래스 자체를 배열처럼 사용
하기 때문에 this 키워드를 인덱스의 이름으로 사용
- 예)
class 클래스명 {
…..….…
[접근 변경자] 데이터타입 this[int index] {
set {
//지정된 요소 설정
}
get {
//지정된 요소 반환
}
}
}
class SimpleIndexer {
ArrayList lname = new ArrayList();
//ArryList의 객체를 생성
public object this[int index] { // //ArrayList의 객체가 반환하는 값이 object 형
get {
if (index > -1 & index < lname.Count) //속성 Count는 포함된 요소의 수
return lname[index];
else {
Console.WriteLine("sid["+index+"] 는 없습니다!");
return null;
}
}
set {
}
}
if(index > -1 & index < lname.Count)
lname[index] = value;
else if (index == lname.Count) {
Console.WriteLine("lname.Count = {0}",lname.Count);
lname.Add(value);
}
else
Console.WriteLine("sid["+index+"] : 입력 범위 초과 에러!!");
class Program {
public static void Main() {
SimpleIndexer sid = new SimpleIndexer();
sid[0]
sid[1]
sid[2]
sid[4]
}
}
=
=
=
=
"Choi"; // 인덱스 0에 추가
"Lee"; // 인덱스 1에 추가
"Cho"; // 인덱스 2에 추가
"Park"; // 범위초과
Console.WriteLine(sid[0]);
Console.WriteLine(sid[1]);
Console.WriteLine(sid[2]);
Console.WriteLine(sid[4]); // 존재하지 않음
네임 스페이스(namespace)
- 서로 연관된 클래스, 인터페이스, 구조체, 열거형, 델리게이트를 그룹화
- 클래스 이름들의 중복 문제를 쉽게 해결
- 예)
namespace 이름 {
………………………
}
- 사용자가 정의한 클래스나 구조체를 이용하려면 그것들을 포함하고 있는
namespace를 using 키워드를 이용하여 사용하면 됨
- 예)
using System;
using System.Collections;
4장 인터페이스
인터페이스(Interface)
- 구현이 없는 클래스, 즉 선언만 가지고 있는 클래스
- 구현이 없는 메소드(Method), 속성(Property), 이벤트(Event), 인덱서(Indexer)
를 포함할 수 있음
- 인터페이스는 객체를 생성할 수 없음
- 인터페이스를 이용하기 위해서는 인터페이스를 상속받은 클래스에서 인터페이
스의 모든 구성요소(메소드, 속성, 이벤트, 인덱서 등) 를 전부 구현하여야 함
- 예)
public interface IStringList {
void Add(string s) ;
int Count(int[] t) ;
}
인터페이스 상속
- 클래스와는 다르게 다중 상속 가능
- 예)
interface Interface_A { void Method_A(); }
interface Interface_B
{ void Method_B(); }
interface Interface_C : Interface_B, Interface_A
void Method_C();
}
{
인터페이스 구현 I (메소드)
- 인터페이스의 메소드를 구현하는 경우,
- 예)
interface MyInterface
{
void Method_A();
}
class MyClass : MyInterface
//MyClass는 MyInterface를 구현
{
public void Method_A() { // 메소드 구현
Console.WriteLine("인터페이스의 메서드를 구현");
}
}
class Program
{
public static void Main() {
MyClass mc = new MyClass();
MyInterface imc = mc;
//업캐스팅, 동적 바인딩, 다형 변수
imc.Method_A();
//구현된 메서드를 호출
mc.Method_A();
}
}
인터페이스 구현 II (속성)
- 속성(Property)을 인터페이스에 사용할 때에는 속성의 이름과 set을 구현할
것이지, get을 구현할 것인지만 명시
- 인터페이스를 상속받은 클래스에서는 get 속성과 set 속성을 구현
- 예)
interface IMyInterface {
int IProperty { get ; set ; }
}
class ImplementsClass : IMyInterface {
private int myValue;
public int Myvalue {
// 속성 구현
get {
return myValue ;
}
set {
myValue = value ;
}
}
}
class Program {
public static void Main() {
ImplementsClass ic = new ImplementsClass();
IMyInterface imi = ic; // 업 캐스팅, 동적 바인딩
imi.Myvalue = 1000; // set
Console.WriteLine("Interface의 Property : " + imi.Myvalue);
}
}
인터페이스 구현 III (인덱서)
- 인덱서를 사용하기 위해서는 인덱서의 프로토타입만을 인터페이스에 명시
- 인터페이스를 상속받은 클래스에서는 인덱서를 구현
- 예)
public interface SimpleInterface
{
object this[int index] { get; set; }
}
public class SimpleIndexer : SimpleInterface {
ArrayList lname = new ArrayList();
public object this[int index] { //인덱서 구현
get {
If (index >-1 & index<lname.Count) return lname[index];
else
return null;
}
set {
if(index>-1 & index<lname.Count) name[index] = value;
else if (index == lname.Count) lname.Add(value);
else
Console.WriteLine("sid["+index+"] : 입력에러!!");
}
}
}
class Program {
}
public static void Main(){
SimpleIndexer sid = new SimpleIndexer();
sid[0]= "Choi"; //인덱스 0에 추가
sid[1]= "Lee"; //인덱스 1에 추가
sid[2]= "Cho"; //인덱스 2에 추가
sid[4] = "Park"; // 범위초과
Console.WriteLine(sid[0]);
Console.WriteLine(sid[1]);
Console.WriteLine(sid[2]);
}
인터페이스 구현 IV (다중상속)
- 클래스와는 다르게 다중 상속이 가능
- 예)
interface InterA { void a(); }
interface InterB { void b(); }
interface InterC : InterA { void c(); }
class MultiInheritance : InterB, InterC {
public void a() {
Console.WriteLine( "InterA의 a()를 구현" );
}
public void b() { // 메서드 b 구현
Console.WriteLine( "InterB의 b()를 구현" );
}
public void c() { // 메서드 c 구현
Console.WriteLine( "InterC의 c()를 구현" );
}
}
public class Program {
public static void Main() {
MultiInheritance mi = new MultiInheritance();
mi.a();
mi.b();
mi.c();
}
}
5장 델리게이트, 이벤트,
애드리뷰트
델리게이트(Delegate)
- C 언어의 함수 포인터와 동일
- C# 언어에서는 스레드와 이벤트 관련 처리시 사용
- 특정 객체의 메소드를 직접 사용하는 것이 아니라 델리게이트를 이용하여
간접적으로 사용
- 선언형식)
public delegate 반환형 메소드 이름(메소드 인자) ;
- 예)
public delegate int Add(inta, int b);
public delegate void test() ;
- 사용방법 )
① delegate 로 사용할 메소드를 결정(메소드의 입력인자와 결과 형 주의)
② 결정한 메소드에 맞는 delegate를 선언
③ 메소드가 포함되어 있는 객체를 만든다(static 메소드는 필요 없음)
④ delegate를 생성한다
⑤ Delegate를 필요시 호출한다
delegate void SimpleDelegate1();
delegate void SimpleDelegate2(int i);
// delegtate 선언 ②
// delegtate 선언 ②
class MyClass
{
public void MyMethod1()
{ // delegate 할 메소드 ①
System.Console.WriteLine("MyClass.MyMethod1");
}
public void MyMethod2(int x) { // delegate 할 메소드 ①
System.Console.WriteLine("MyClass.MyMethod2 x=" + x);
}
}
class Program
{
public static void Main() {
MyClass at = new MyClass();
// delegate 메소드 포함한 객체 만들기 ③
// delegate 생성 ④
SimpleDelegate1 d1 = new SimpleDelegate1( at.MyMethod1 );
SimpleDelegate2 d2 = new SimpleDelegate2( at.MyMethod2 );
}
}
// delegate 호출 ⑤
d1();
d2(1000);
멀티 델리게이트(Multin Delegate) 구현
- 사용하는 연산자
① += delegate 에 새로운 delegate 를 추가 등록시 사용
② -= delgate 에 포함된 delegate를 삭제시 사용
- 하나의 delegate 에 여러 개의 delegate가 포함되어 있으면, 호출시 포함된
모든 delegate 가 호출됨
- 예)
class Example {
public static void StaticMethod() {
Console.WriteLine(“Static Method”);
}
public void Normal Method() {
Console.WriteLine(“Normal Method”);
}
}
결과는 ?
교과서 66p 예제 실행해보기
delegate void ExamDelegate;
class DelegateExam {
Example obj = new Example();
ExamDelegate ex1 = new ExamDelegate(obj.NormalMethod);
ExamDelegate ex2 = new ExamDelegate(Example.StaticMethod);
ExamDelegate data = ex1; data();
}
data += ex2;
data -= ex2;
data();
data()
이벤트 작성 순서
-
사용자의 어떤 동작에 의해 운영체제에서 발생하는 사건(메시지)
이벤트가 발생하면 이벤트에 등록된 메소드(이벤트 핸들러)가 자동 실행됨
주로 윈도우 프로그래밍(GDI+ 컨트롤 프로그래밍)을 하는 경우 사용
이벤트는 델리게이트와 같이 사용되며, event 키워드를 통해 이벤트 처리
사용형식)
[변경자] delegate 반환형 DelegateName(메소드 인자) ;
[변경자] event DelegateName EventName;
- 예)
public delegate void MyDelegate();
private event MyDelegate ExamEvent;
(의미 : 이벤트 이름인 ExamEvent 가 발생하면 델리게이트 MyDelegate
호출된다)
- 이벤트를 정의했으면, +=, -= 를 이용해 이벤트 핸들러를 등록 및 제거
(이벤트 핸들러가 정의된 객체는 미리 생성되어 있어야 함)
- 예)
ExampleClass obj = new ExampleClass(); // 이벤트핸들러가 포함된 객체
ExamEvent += new MyDelegate(obj.Method);
이벤트 작성 순서
① 이벤트가 발생했을 때 처리해 주는 메소드를 임의의 클래스 내부에 작성
② 이벤트 처리 메소드와 일치하는 델리게이트를 선언
(System.EventHandler 를 사용한다면 ② 번 과정은 생략)
③ 사용할 이벤트를 선언한다(미리 정의된 이벤트일 경우는 생략한다)
④ 이벤트에 이벤트 처리 메소드를 등록한다.
⑤ 이벤트를 발생시킨다
public delegate void MyEventHandler();
// 델리게이트 선언 ②
class Button {
// 이벤트를 발생시키는 클래스
public event MyEventHandler Push; // 이벤트 선언 ③
public void OnPush() {
if (Push != null) Push();
// 이벤트 발생 ⑤
}
}
class EventHandlerClass { // 이벤트 처리기를 갖는 클래스
public void MyHandler() {
// 이벤트 처리기 ①
Console.WriteLine(" 이벤트 처리기를 수행합니다. “);
}
}
class Program {
public static void Main() {
Button btn = new Button();
EventHandlerClass ob = new EventHandlerClass(); // 이벤트 처리기를 갖는 객체
btn.Push += new MyEventHandler(ob.MyHandler); //이벤트 처리기 등록 ④
// btn.Push += ob.MyHandler 도 가능
btn.OnPush(); // btn 객체의 OnPush() 메소드 호출
}
}
윈도우 폼에서의 이벤트 처리 예제(System.EventHandler 델리게이트 이용)
① Visual C# 프로젝트를 콘솔 응용 프로그램으로 만든다
② 프로젝트에 윈도우 폼을 추가하기 위해, 솔루션탐색기의 참조추가를 선택후
System.Windows.Forms를 선택한다
③ 프로그램에서 윈도우 폼을 사용하기 using System.Windows.Forms 구문
을 추가한다
④ 아래와 같은 EventForm 클래스를 추가한다
public class EventForm : Form
{
}
⑤ 폼의 클릭(click) 이벤트 처리기 ClickReceive() 메소드를 추가한다
⑥ 폼의 클릭(click) 이벤트 처리기를 델리게이트에 등록한다
⑦ main() 함수에 Application.Run(new EvnetForm()) 을 추가한다
using System;
using System.Windows.Forms;
//프로그램에서 윈도우 폼을 사용하기 위해 추가
public class EvnetForm : Form
{
public EventForm() {
// 생성자에서 Click 이벤트에 대한 이벤트처리기 등록
this.Click += new EventHandler( ClickReceive );
}
private void ClickReceive( object sender, EventArgs e ) { // 이벤트 처리기 추가
MessageBox.show("마우스를 클릭했습니다.");
}
}
public class Program
{
static void Main() {
Application.Run( new EvnetForm());
}
}
⑧ 결과 화면
⑨ 교과서 72p 예제 실행해보기 (매우 중요)
6장 윈도우 컨트롤
윈도우 폼(Window Form)
- C#에서 윈도우 폼을 만들고 컨트롤을 배치시키려면 System.Windows.Forms
네임스페이스를 사용한다
- 윈도우 폼 만들기 예제)
1) 프로젝트 템플릿이 Windows Forms 응용 프로그램인 프로젝트를 만든다
(솔루션 이름은 WindowForm, 이름은 FormTest 로 설정)
2) 솔루션 탐색기를 보면 Form1.cs, Program.cs 2개의 파일이 작성된 것을
볼 수 있다
3) 또한, Form1.cs[디자인] 탭 화면과 타이틀이 Form1 으로 설정된 윈도우를
볼 수 있다
4) ctrl + F5 키를 눌러 프로그램을 실행시켜 결과를 확인해본다
윈도우 폼(Window Form) 예제 분석
-
솔루션 탐색기에서 Program.cs 파일을 더블클릭한다
윈도우 폼을 사용하기 위한 using System.Windows.Forms 구문 확인
C# 프로그램의 시작인 Main() 함수가 보이고,
Main() 함수에서는 Application 객체의 run() 함수를 호출하여 Form1 객체를
생성한다(new Form1())
- 솔루션 탐색기의 Form1.cs에서 F7을 눌러 코드를 확인한다
- Form1 객체의 생성자 함수(Form1())는 InitializeComponent()를 실행한다
- 솔루션 탐색기의 Form1.Designer.cs 에서 F7을 눌러 코드를 확인한다
- Form1.Designer.cs 파일은 윈도우 폼에 윈도우 컨트롤을 배치하고, 윈도우
컨트롤의 속성을 설정하기 위해 주로 사용(대부분 자동으로 설정됨)
- [꼭 기억할 것]
Main() 함수가 어디에 있는가 ?
그리고 Main() 함수의 역할은 ?
윈도우 컨트롤의 배치와 속성 설정은 어디에서 하는가 ?
윈도우 컨트롤의 동작은 어디에서 설정하는가 ?
윈도우 폼(Window Form) 예제 1 (Button)
- 앞의 예제에서 보기 메뉴의 도구상자를 선택한다
- 도구상자의 공용컨트롤에서 Button을 마우스로 클릭하여 Form1 윈도우로
이동한다
- Form1 윈도우에 배치한 버튼에서 마우스 오른쪽 버튼을 눌러 속성을 선택한다
- 속성 윈도우의
버튼(이벤트)을 눌러 나오는 메뉴 중 Click을 선택한 후
button_click 이라고 입력한다 (속성 윈도우에 있는 버튼을 더블클릭하여도 됨)
- Form1.cs 파일을 열어보면 button_click(object sender, EventArgs e) 함수가
추가되어있는 것을 볼 수 있다
- 여기에 MessageBox.Show("버튼이 눌려졌습니다”); 를 입력한 후 프로그램을
실행해 본다
[주의]
- Form1.cs 파일의 역할은 ?
- Form1.Designer.cs 파일의 역할은 ?
- Form1.cs[디자인] 화면의 역할은 ?
윈도우 폼(Window Form) 예제 2 (TextBox)
- TextBox는 문자열을 입력받는데 사용한다
- TextBox의 주요 속성
속성
의미
Text
텍스트박스에 입력된 내용
ReadOnly
읽기 전용 텍스트박스
MultiLine
텍스트박스에 한 줄 이상의 문자열을 입력
ScrollBars
멀티라인으로 지정된 경우 스크롤바를 나타낼지를 지정
AcceptReturn
엔터키를 누르면 줄 바꿈
PasswordChar
패스워드 입력에 표시할 문자
CharacterCasting
텍스트박스의 내용을 대문자나 소문자로 나타냄
- 도구상자 컨트롤을 이용하여 TextBox, Label 3개, Button 을 을 배치한다
- label의 text 속성을 ID 로 변경한다
- 아래 오른쪽 표와 같이 컨트롤의 모든 속성을 설정한다
컨트롤
속성
값
TextBox 1
Name
textID
TextBox 2
Name
textPW
PasswordChar
*
Name
textContents
MultiLine
True
ScrollBars
True
Name
button
Text
확인
Label 1
Text
ID
Label 2
Text
PW
Label 3
Text
Content
TextBox 3
Button
- 버튼을 더블 클릭하여 button_click() 메소드를 추가한 후 다음과 같은 코드를
입력한다
MessageBox.Show(“내용이 올바르게 입력되었습니까”,”텍스트박스 예제”);
- ctrl + F5 를 눌러 프로그램을 실행시킨다
윈도우 폼(Window Form) 예제3 (CheckBox, RadioButton, GroupBox)
- CheckBox는 임의의 항목을 입력받을 때 사용
- RadioButton은 여러 가지 항목 중 한 항목만 선택할 때 사용
- 컨트롤의 경계를 나타내기 위하여 GroupBox를 사용. GroupBox 내부에 있는
RadioButton 끼리는 배타적 선택이 가능
- 앞의 예제의 탭 화면을 모두 닫는다
- 솔루션 탐색기의 솔루션’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 아래
와 같이 새 프로젝트를 추가하고, 프로젝트 이름을 RadioCheckEx 로 한다
- 솔루션 탐색기의 RadioCheckEx 프로젝트를 아래와 같이 시작프로젝트로 설정
한다
- ctrl + F5 를 눌러 프로그램을 실행시킨다
- 도구상자 컨트롤을 이용하여 GroupBox, RadioButton, CheckBox, TextBox를
아래와 같이 배치한다
- 아래 표와 같이 컨트롤의 모든 속성을 설정한다
컨트롤
GroupBox
값
GroupBox
Text
색 선택
RadioButton 1
Text
붉은색
Name
radioButton1
Text
파란색
Name
radioButton2
Text
녹색
Name
radioButton3
Text
체크박스
Name
checkBox1
Text
“”
Name
textBox1
RadioButton
CheckBox
속성
RadioButton 2
RadioButton 3
CheckBox
TextBox
- RadioButton에 대한 이벤트를 처리하기 위해 붉은색 RadioButton을 선택 한
후 속성창의
버튼(이벤트)를 누른다. Click 이벤트를 선택 후 오른 쪽에
radioButton_Click 을 입력한다
- 파란색 RadioButton, 녹색 RadioButton도 동일한 과정을 반복한다
(이벤트 함수를 붉은색 RadioButton 과 동일하게 radioButton_Click 로 설정)
- RadioButton에 대한 이벤트 처리함수 radioRadioButton_Click 에 아래와
같이 입력한다
private void radioButton_Click(object sender, EventArgs e)
{
if(radioButton1.Checked)
textBox1.Text="빨간색이 선택되었습니다.";
if(radioButton2.Checked)
textBox1.Text="파란색이 선택되었습니다.";
if(radioButton3.Checked)
textBox1.Text="녹색이 선택되었습니다.";
}
- CheckBox에 대한 이벤트를 처리하기 위해 붉은색 CheckBox를 선택 한
후 속성창의
버튼(이벤트)를 누른다. Click 이벤트를 선택 후 오른 쪽에
checkBox_Click 을 입력한다
- CheckBox에 대한 이벤트 처리함수 checkBox_Click 에 아래와 같이 입력한다
private void checkBox1_Click(object sender, EventArgs e)
{
if(checkBox1.Checked)
textBox1.Text="체크표시 설정되었습니다";
else
textBox1.Text="체크표시 설정되지 않았습니다";
}
결과 꼭 확인하세요.. ?
윈도우 폼(Window Form) 예제 4 (ScrollBar 와 Spin 컨트롤)
-
스크롤바는 수직스크롤바(VSCrollBar)와 수평스크롤바(HScrollBar)가 있다
스크롤바는 긴 목록이나 많은 양의 데이터를 쉽게 탐색하게 하는데 사용
스핀 컨트롤은 두 개의 스크롤 단추와 입력란으로 구성
스핀 컨트롤은 입력란에 원하는 문자를 넣어서 사용자가 선택할 수 있는
DomainUpDown 컨트롤과 숫자의 범위에서 숫자를 선택할 수 있는
NumericUpDown 컨트롤이 있다.
ScrollBar 속성
의미
LargeChange
스크롤바 내의 작은 상자의 를 이
동시키는 값
Maximum
스크롤할 수 있는 범위의 상한
값
Minimum
스크롤할 수 있는 범위의 하한
값
SmallChange
스크롤바 내의 작은 상자의 를
이동시키는 값
Value
ScrollBar 이벤트
스크롤바 내의 작은 상자의 현재
위치 값
의미
Scroll
마우스 또는 키보드로 스크롤
바를 움직일 때 발생
ValueChanged
Value속성이 바뀔때 발생
Spin 컨트롤 속성
의미
Maximum
스핀 컨트롤의 최대값
Minimum
스핀 컨트롤의 최소값
ReadOnly
위쪽 또는 아래쪽 단추를 사용
해야만 텍스트를 변경할 수 있
는지 여부
Value
스크롤바 내의 작은 상자의 현재 위
치값
ScrollBar 이벤트
ValueChanged
의미
Value속성이 바뀔 때 발생
- 솔루션 탐색기의 솔루션 ’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 새
프로젝트를 추가하고, 프로젝트 이름을 ScrollSpin 로 한다
HscrollBar
컨트롤
HScrollBar1
값
Maximum
255
Name
hSCrollRed
Maximum
255
Name
hScrollGreen
Maximum
255
Name
hSCrollBlue
Label1
Text
빨간색
Label2
Text
녹색
Label3
Text
파란색
NumericUpDown1
Maximum
255
Name
UpDownRed
Maximum
255
Name
UpDownGreen
Maximum
255
Name
UpDownBlue
Label4
Text
빨간색(스핀)
Label5
Text
녹색(스핀)
Label6
Text
파란색(스핀)
HScrollBar2
HScrollBar3
NumericUpDown2
NumericUpDown
속성
NumericUpDown3
- 더블 클릭으로 이벤트 처리기를 작성하지 말고 스크롤 바를 선택한 후 속성 창의
Scroll 이벤트 오른쪾 옆에 hScrollRed_Scroll 이라고 직접 이벤트 처리 함수를 기
록한다
- 3개의 수평 스크롤바에 대한 이벤트 처리기는 동일한 내용을 수행하므로,
이벤트 처리기 이름을 동일하게 주어 한 개가 처리기로 처리한다.
private void hScrollRed_Scroll(object sender, ScrollEventArgs e)
{
this.BackColor = Color.FromArgb(hScrollRed.Value, hScrollGreen.Value, hScrollBlue.Value);
}
- 스핀 버튼도 동일한 방법으로 작성하여 보시오.
(스핀버튼의 경우는 ValueChanged 이벤트를 이용하시오)
private void UpDownRed_ValueChanged(object sender, EventArgs e)
{
// 속성 Value는 decimal 타입이므로 int로 캐스팅
this.BackColor = Color.FromArgb( (int)UpDownRed.Value,
(int)UpDownGreen.Value,
(int)UpDownBlue.Value );
}
윈도우 폼(Window Form) 예제 5 (리스트박스와 콤보박스)
- 리스트박스는 여러 항목 중 원하는 항목을 선택할 수 있도록 항목들을 나열
- 항목의 추가도 가능하며 항목이 많아지면 자동으로 스크롤바가 생긴다
- 리스트 박스는 리스트 박스의 속성창의 ( Items [컬렉션] ) 속성을 사용하여
항목을 추가할 수도 있고, 프로그램 수행 중 항목을 추가, 삭제할 수도 있다
- CheckedListBox는 리스트 박스의 각 항목에 체크표시를 할 수 있는 기능을
추가한 컨트롤임
리스트박스 속성
의미
Items
ListBox의 항목들
MultiColumn
ListBox에서 여러 열을 지원하는지 여부
SelectedIndex
현재 선택된 항목에 대한 인덱스
첫 번째 항목이 선택된 경우 : 0, 선택된 항목이 없을 경우 : -1
SelectedIndices
현재 선택되어 있는 모든 항목의 인덱스(0부터 시작)가 들어 있는 컬렉션
SelectedItem
현재 선택된 데이터 값
SelectionMode
ListBox에서 항목을 선택하는 방법
MultiExtended : Shift, Ctrl 및 화살표 키를 사용하여 선택
MultiSimple : 여러 항목을 선택, None : 항목을 선택할 수 없다.
One : 하나의 항목만 선택
Sorted
항목이 사전 순으로 정렬되는지 여부
리스트박스 메소드
의미
Add
리스트박스의 끝에 새 항목을 추가
Insert
두 번째 인수인 새 항목을 첫 번째 인수인 위치에 추가
Remove
항목을 리스트에서 제거
Clear
리스트박스에 있는 모든 항목을 제거
ClearSelected
선택된 항목을 취소
Findstring
지정된 문자열로 시작되는 ListBox의 첫째 항목을 찾습니다.
SetSelected
지정된 항목을 선택하거나 선택 취소
- 솔루션 탐색기의 솔루션 ’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 새
프로젝트를 추가하고, 프로젝트 이름을 ListComBo 로 한다
컨트롤
Label1
Label2
ListBox
Button1
Button2
Button3
ListBox
Button
TextBox
TextBox
속성
값
Text
우리나라의 주요 산의 목록
Name
label1
Text
새 항목
Name
label2
Name
listBox1
Items
설악산
지리산
북한산
Text
추가
Name
button1
Text
삽입
Name
button2
Text
모두 삭제
Name
button3
Text
“”
Name
textBox1
- 폼에서 리스트 박스 컨트롤을 선택한 후 속성창의 SelectdIndexChanged 이벤
트 처리기를 추가한다
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
// 리스트 박스에서 마우스 클릭하는 경우
string str = listBox1.SelectedItem.ToString();
MessageBox.Show(str+"을 선택했습니다.");
}
- 폼에서 3개의 버튼 컨트롤을 각각 선택한 후 click 이벤트 처리기를 아래와 같이
작성한다
private void button1_Click(object sender, EventArgs e) // 추가 버튼 클릭 처리기
{
listBox1.Items.Add(textBox1.Text);
textBox1.Text="";
}
private void button2_Click(object sender, EventArgs e) // 삽입 버튼 클릭 이벤트 처리기
{
listBox1.Items.Insert(0, textBox1.Text);
textBox1.Text="";
}
private void button3_Click(object sender, EventArgs e) // 모두 삭제 버튼 클릭 이벤트 처리기
{
listBox1.Items.Clear();
}
- 앞의 예제에 추가하여 아래와 같이 화면을 설계한다.
컨트롤
Form1
CheckedListB
ox
ListBox2
Button4
Button5
Button6
TextBox2
CheckedListBox
TextBox
ComboBox
Button
ComboBox
속성
값
MaximizeBox
False
FormBorderStyle
FixedSingle
CheckOnClick
True
Name
checkedListBox1
Items
경기도,강원도
Name
listBox2
SelectionMode
One
Text
>
Name
button1
Text
>>
Name
button2
Text
추가
Name
button3
Text
도명입력
Name
textBox1
Name
comboBox1
DropDownStyle
DropDownList
Items
정렬, 선택아이템삭제
- 추가 버튼 컨트롤을 선택한 후 click 이벤트 처리기를 아래와 같이 작성한다
private void button3_Click(object sender, EventArgs e)
{
checkedListBox1.Items.Add(textBox1.Text);
}
- > 버튼 컨트롤을 선택한 후 click 이벤트 처리기를 아래와 같이 작성한다
private void button2_Click(object sender, EventArgs e)
{
foreach(string str in checkedListBox1.CheckedItems)
listBox2.Items.Add(str);
}
- >> 버튼 컨트롤을 선택한 후 click 이벤트 처리기를 아래와 같이 작성한다
private void botton2_Click(object sender, EventArgs e)
{
foreach(string str in checkedListBox1.Items)
listBox2.Items.Add(str);
}
- 콤보박스를 선택 후 SelectedIndexChanged 이벤트 처리기를 아래와 같이
작성한다
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
switch(comboBox1.SelectedItem.ToString())
{
case "정렬":
listBox2.Sorted=true;
break;
case "선택아이템삭제":
if(listBox2.SelectedIndex != -1)
{
listBox2.Items.RemoveAt(listBox2.SelectedIndex);
}
break;
case "모든아이템삭제":
listBox2.Items.Clear(); break;
}
}
윈도우 폼(Window Form) 예제 6 (리스트뷰)
-
리스트뷰 컨트롤은 리스트 박스의 기능을 확장
리스트뷰는 큰아이콘, 작은아이콘, 자세히, 간단히 와 같은 4개의 보기 모드지원
리스트뷰의 첫번째 항목에는 이미지를 포함할 수 있음
이미지를 포함하기 위해서는 ImageList 컨트롤을 사용
리스트뷰 속성
의미
Columns
모든 열 머리글의 컬렉션
FocusedItem
현재 포커스가 있는 항목
Items
모든 항목이 들어 있는 컬렉션
LabelEdit
항목의 레이블을 편집할 수 있는지 여부
LargeImageList
항목을 큰 아이콘으로 표시할 때 사용하는 ImageList
MultiSet
여러 개의 항목을 선택할 수 있는지 여부
Scrollable
스크롤 막대를 컨트롤에 추가할지 여부
SelectedIndices
선택한 항목의 인덱스들
SelectedItems
선택된 항목들
SmallImageList
작은 아이콘으로 표시할 때 사용할 ImageList
Sorting
항목 정렬 순서
View
보기 모드
리스트뷰 메소드
의미
Clear
모든 항목과 열을 제거
GetItemAt
지정한 위치에서 항목을 검색
ColumnClick
열 머리글을 클릭할 때 발생하는 이벤트
DoubleClick
컨트롤을 두 번 클릭하면 발생하는 이벤트
ItemCheck
항목의 선택 상태가 변경되면 발생하는 이벤트
TextChanged
Text 속성이 변경되면 발생하는 이벤트
- 솔루션 탐색기의 솔루션 ’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 새
프로젝트를 추가하고, 프로젝트 이름을 ListView 로 한다
컨트롤
속성
값
GroupBox
Text
보기
ListView
Name
listView1
Columns
Text : 도명, 도청소재지
Width : 100,200
RadioButton1
RadioButton2
RadioButton3
GroupBox
RadioButton
ListView
RadioButton4
ImageList1
( ImageList2
도 동일)
Items
경기도, 강원도, 충청도
SmallImage
List
imageList1
LargeImage
List
imageList2
Text
큰아이콘
Name
radioLarge
Text
작은아이콘
Name
radioSmall
Text
간단히
Name
radioSimple
Text
자세히
Name
radioDetail
Image
MOON01 ~ MOON05
Name
imageList1 (imageList2)
[리스트뷰 컨트롤 속성 설정]
① 리스트뷰 컬럼 설정
- 리스트뷰의 Columns 속성의 (컬렉션)을 선택한다
- ColumnHeder 컬 렉 션 편 집 기 에 서 추 가 버 튼 을 2 번 누 르 면 2 개 의
columnHeader 가 추가된다. 각각을 선택 후 오른 쪽 화면에 보이는 속성창
에서 Text 속성을 도명, 도청소재지 로 변경하고 Width 속성을 각각 100,
200으로 설정
오른쪽 창에서 필요한
속성값을 설정한다
추가 버튼을 누르면
컬럼헤더가 추가된다
② 리스트뷰 컨트롤에 항목 추가
- 리스트뷰의 Items 속성의 (컬렉션)을 선택한다
- ColumnHeder 컬렉션 편집기에서 추가 버튼을 6번 누른 후 각각을 선택 후
오른 쪽 화면에 보이는 속성창에서 Text 속성을 경기도, 강원도, 충청도, 전
라도, 경상도, 제주도 순으로 입력한다
추가 버튼을 누르면
컬럼 항목이 추가된다
6개의 컬럼 항목 값을
순서대로 설정한다
③ 리스트뷰 컨트롤 항목에 서브항목(SubItem) 추가
- 리스트뷰 컬렉션 편집기의 오른쪽 화면에서 SubItems 속성의 (컬렉션)을 선
택한다
- ListViewSubItem 컬레션 편집기가 보이면 추가 버튼을 누른 후, 오른쪽 화
면에 보이는 속성창에서 Text 속성을 수원으로 입력한다.
- 위의 과정을 반복하여 춘천, 대전, 광주, 대구, 제주를 추가한다
컬렉션을 선택하면
ListViewSubItem 편집기가 열린다
Text 속성을 수원으로 입력한다
④ 리스트뷰에 ImageList 컨트롤 추가하기
- 도구상자에서 이미지리스트(ImageList)컨트롤을 선택하여 2번 추가한다.
- imageList2는 큰 아이콘의 이미지로 사용되므로 ImageSize 속성을 32,32
로 설정(imageList1의 ImageSize 속성은 16,16)
추가
ImageSize 속성 조정
⑤ ImageList 컨트롤에 아이콘 추가하기
- imageList1 컨트롤의 images 컬렉션 속성을 이용하여 원하는 아이콘을 추
가한다
- imageList2 컨트롤도 동일한 아이콘으로 설정한다
마우스 오른쪽 버튼을
누른다
Images 컬렉션을
선택
추가버튼을 누른다
왼쪽 화면의 추가버튼을 이용하여
6개의 아이콘을 다 추가한다
⑥ ListView 에서 ImageList 컨트롤에 사용하기
- listView1의 smallImageList, LargerImageList 속성을 각각 imageList1,
imageList2로 설정한다
- 리스트뷰의 각 항목에 아이콘을 추가하기 위해서는 오른쪽 화면과 같이 리
스트 뷰의 Items 속성에서 컬렉션을 클릭하면 나타나는 ListViewItem 컬렉
션 편집기의 ImageIndex 속성에서 각 항목에 추가할 아이콘의 인덱스를 선
택하면 된다
[4개의 RadioButton click 이벤트 처리기 작성하기]
- 그룹 박스에 속해있는 4개의 RadioButton을 각각 더블클릭하여 이벤트 처
리기를 생성 후 아래의 코드를 입력한다
private void radioLarge_Click(object sender, EventArgs e)
{
listView1.View=View.LargeIcon;
// 큰 아이콘
}
private void radioSmall_Click(object sender, EventArgs e)
{
listView1.View=View.SmallIcon;
// 작은아이콘
}
private void radioSimple_Click(object sender, EventArgs e)
{
listView1.View=View.List;
// 간단히
}
private void radioDetail_Click(object sender, EventArgs e)
{
listView1.View=View.Details;
// 자세히
}
[실행결과]
[HomeWork 1]
- 교과서 107 쪽 과 같이 화면을 설계하고,
- 도명과 소재지를 입력받아 리스트뷰에 추가할 수 있는 프로그램을 작성하시오
윈도우 폼(Window Form) 예제 7 (트리뷰)
- 트리뷰 컨트롤은 데이터나 정보를 계층적으로 보여줌
- 트리뷰의 각 노드는 이미지를 포함할 수 있으며, 리스트뷰와 사용법 동일
트리뷰 속성
의미
CanSelect
컨트롤을 선택할 수 있는지 여부
CheckBoxes
트리 노드 옆에 확인란이 표시되는지 여부
ImageIndex
트리 노드에 표시되는 기본 이미지의 이미지 목록 인덱스 값
ImageList
트리 노드에서 사용하는 Image 객체가 들어 있는 ImageList
Node
트리뷰 컨트롤에 할당된 트리 노드의 컬렉션
PathSeperator
트리 노드 경로에서 사용하는 구분 기호 문자열
SelectedImageIndex
TreeNode가 선택된 상태일 때 표시되는 기본 이미지 키
SelectedNode
현재 선택되어 있는 트리 노드
ShowLines
트리 노드 사이에 선이 그려졌는지 여부
ShowPlusMinus
자식 트리 노드를 포함하는 트리 노드 옆에 더하기 기호(+) 및 빼기 기호(-) 단
추가 표시되는지 여부
ShwoRootLines
루트에 있는 트리 노드 사이에 선이 그려졌는지 여부
Sorted
트리 노드가 정렬되어 있는지 여부
트리뷰 메소드
의미
CollapseAll
모든 트리 노드를 축소
ExpandAll
모든 트리 노드를 확장
GetNodeAt
지정된 위치에 있는 트리 노드를 검색
GetNodeCount
모든 하위 트리에 있는 트리 노드를 포함하여 트리뷰 컨트롤에 할당된 트리 노드
의 수를 검색
- 솔루션 탐색기의 솔루션 ’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 새
프로젝트를 추가하고, 프로젝트 이름을 TreeView 로 한다
컨트롤
TreeView
값
Name
treeView1
Nodes
트리노트 편집기 이용
ImageList1
Name
imageList1
Button1
Text
추가
Name
button1
Text
삭제
Name
button2
Text
확장
Name
button3
Text
축소
Name
button4
Text
“”
Name
textBox1
Button2
Button3
Button4
TextBox
TreeView
속성
- 트 리 뷰 의 노 드 추 가 는 Nodes 속 성 의 컬 렉 션 을 클 릭 하 면 나 타 나 는
TreeNode 편집기를 이용한다
- 먼저 루트 추가를 누른다. 그리고 Text 속성에는 “시도” 를 입력한다
- 다음은 자식 추가를 누른다. (왼쪽 화면의 트리를 잘 보면서 루트인지 자식인
지 확인 후 원하는 곳에 추가하면 된다)
- 4개의 Button에 대한 click 이벤트 처리기 작성하기
private void button1_Click(object sender, EventArgs e) //“추가” 버튼의 클릭 이벤트 처리기
{
//두번째, 세 번째 인수는 선택, 비선택 이미지
TreeNode node1 = new TreeNode(textBox1.Text,0,1);
if(treeView1.SelectedNode != null && treeView1.SelectedNode.IsSelected)
treeView1.SelectedNode.Nodes.Add(node1);
else
treeView1.Nodes.Add(node1); //루트의 자식 노드로 삽입
}
private void button2_Click(object sender, EventArgs e) //“삭제” 버튼의 클릭 이벤트 처리기
{
if(treeView1.SelectedNode != null && treeView1.SelectedNode.IsSelected)
reeView1.SelectedNode.Remove();
}
private void button3_Click(object sender, EventArgs e) //“확장”버튼의 클릭 이벤트 처리기
{
treeView1.ExpandAll();
}
private void button4_Click(object sender, EventArgs e) //“축소”버튼의 클릭 이벤트 처리기
{
treeView1.CollapseAll();
}
[ 트리뷰에서 이미지 아이콘 사용하기 ]
- 트리뷰의 노드에 아이콘을 추가하기 도구상자에서 ImageList 컨트롤을 추가
한다
- ImageList에서 Image 속성의 컬렉션을 선택하면 나타나는 이미지컬렉션 편
집기에서 2개의 이미지를 추가한다
- 추가된 imageList1을 트리뷰에서 사용하기 위해 treeView1의 imageList 속
성을 imageList1으로 설정한다
- 또한 TreeView의 ImageIndex 속성에는 선택되지 않았을 때 사용할 아이콘
을 SelectedImageIndex 속성에는 선택되었을 때 사용할 아이콘을 지정한다
- 교과서 p111 참조하기
윈도우 폼(Window Form) 예제 8 (트랙바, 프로그래스바, 타이머)
 트랙바(TrackBar) 컨트롤 (가로 또는 세로로 사용 가능)
-
스크롤바 컨트롤과 유사하게 스크롤 할 수 있는 컨트롤
Minimum 속성을 설정해서 범위의 하한을 지정
Maximum 속성을 설정해서 범위의 상한을 지정
Value 속성 값은 현재 스크롤 위치
LargeChange 속성은 스크롤상자의 어느 한 쪽을 클릭할 때 Value 속성에
서 증가되거나 감소되는 값을 정의
 프로그레스바(ProgressBar) 컨트롤
- 응용 프로그램에서 파일 복사나 문서 인쇄 같이 시간이 많이 걸리는 작업의
진행률을 시각적으로 나타낼 때 사용
- Maximum 및 Minimum 속성은 작업의 진행률을 나타내는 값 범위를 정의
- Value 속성은 작업을 완료할 때까지의 응용 프로그램 진행률
- Step 속성을 사용하여 Value 속성이 특정 값만큼 증분 되도록 지정한 다음
PerformStep 메서드를 호출하여 값을 증분
- 증분 값을 변경하려면 Increment 메서드를 사용하여 Value 속성을 증분시
킬 값의 양을 지정
 타이머(Timer) 컨트롤
-
주어진 시간 간격으로 타이머를 발생시키는 컨트롤
정기적으로 어떤 일을 처리하도록 관리하는데 사용
Enabled 속성은 타이머가 실행 중인지 여부
Interval 속성은 Tick 이벤트를 발생시킬 간격을 밀리 초로 설정
Start 메서드는 타이머를 시작
Stop 메서드는 타이머를 중지
OnTick 메서드는 Tick 이벤트를 발생
- 솔루션 탐색기의 솔루션 ’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 새
프로젝트를 추가하고, 프로젝트 이름을 Timer 로 한다
컨트롤
TrackBar
60
Name
trackBar1
Maimum
60
Name
progressBar1
Interval
100
Name
timer1
Label1
Text
타이머 : 0
Button1
Text
시작
Button2
Text
정지
Timer
ProgressBar
Timer
Button
값
Maximum
ProgressBar
TrackBar
속성
- 카운터 값을 설정하기 위해 전용 멤버 필드 myCount를 추가
private int myCount = 0;
- 시작버튼, 정지버튼에 대한 click 이벤트 처리기 작성하기
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true; // Tick 이벤트를 주어진 시간 간격마다 발생시킴
}
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = false; // Tick 이벤트를 정지시킴
}
- 타이머 이벤트 처리기 작성하기
private void timer1_Tick(object sender, EventArgs e)
{
if (myCount == 60)
myCount = 0; // myCount가 60이 되면 0부터 다시 시작
else
myCount++;
label1.Text = "타이머 : " + myCount.ToString(); // 레이블을 현재 타이머 값으로 설정
trackBar1.Value = myCount;
progressBar1.Value = myCount;
}
윈도우 폼(Window Form)예제 9 (DateTimePicker, MonthCalendar, TabControl)
 DateTimePicker 컨트롤
- 날짜와 시간을 선택하고, 해당 날짜와 시간을 지정된 형식으로 표시할 수
있는 컨트롤
- MinDate 및 MaxDate 속성을 설정하여 선택할 수 있는 날짜와 시간을 제한
- Format 속성은 컨트롤의 DateTimePickerFormat을 설정
- Long : 기본 날짜 Format 속성
- Custom : CustomFormat 속성을 설정하고 사용자 지정 형식의 문자열
을 작성하여, 사용자 고유의 형식 스타일을 만듬
 MonthCalendar 컨트롤
-
시각적 월별 달력 화면 표시로 날짜를 선택
MinDate 및 MaxDate 속성을 설정하여 선택할 수 있는 날짜와 시간을 제한
SelectionRange.Start 속성은 선택 영역 범위의 시작 날짜 및 시간
SelectionRange.End 속성은 선택 영역 범위의 끝 날짜 및 시간
 TabControl
- 탭으로 된 페이지를 포함
- TabPages.Add 메서드를 이용해서 탭 페이지를 추가
- 주요 속성, 메서드, 이벤트
탭컨트롤 속성
의미
Alignment
탭의 위치(Top, Bottom, Left, Right)을 가져오거나 설정
Appearance
탭의 시각적 모양(Normal, Buttons, FlatButtons)
DrawMode
컨트롤의 탭을 그리는 방법
HotTrack
탭 위로 마우스를 이동할 때 컨트롤 탭의 모양이 변경되는지 여부
MultiLine
탭의 행을 둘 이상 표시할 수 있는지 여부
SelectedIndex
현재 선택된 탭 페이지의 인덱스
SelectedTab
현재 선택된 탭 페이지
TabCount
탭 스트립의 탭 수
TabPages
현재 탭 컨트롤의 탭 페이지들
탭컨트롤 메소드
의미
GetTabRect
현재 탭 컨트롤에 지정된 탭에 대한 경계 사각형을 반환
RemoveALl
현재 탭 컨트롤의 모든 탭페이지를 제거
SelectedIndexChanged
SelectedIndex 속성이 변경될 때 발생하는 이벤트
- 솔루션 탐색기의 솔루션 ’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 새
프로젝트를 추가하고, 프로젝트 이름을 TabControl 로 한다
컨트롤
TabControl
TabControl
RadioButton
GroupBox
Label
속성
값
Name
tabControl1
tabPage1
다음 페이지 참조
tabPage2
다음 페이지 참조
Timer
Interval
100
Label1
Name
label1
RadioButton1
Text
상
RadioButton2
Text
하
RadioButton3
Text
좌
RadioButton4
Text
우
RadioButton5
Text
보통
RadioButton6
Text
버튼
RadioButton7
Text
프렛버튼
GroupBox1
Text
위치
GroupBox2
Test
모양
[ TabControl 에서 TabPage 설정하기]
- TabControl의 TabPages 속성의 컬렉션을 선택한 후 TabPages 컬렉션 편집
기에서 원하는 TabPage를 선택 후 Text 속성을 각각 날자와 달력으로 변경
한다
- 디자인 화면 각각의 TabPage 에 DataTimePicker, MonthCalendar 컨트롤
을 갖다 놓는다
- 추가된 RadioButton들에 대한 click 이벤트 처리기 작성하기
private void radioButton1_Click(object sender, EventArgs e)
{
tabControl1.Alignment = TabAlignment.Top;
// 탭을 위쪽에 위치
}
private void radioButton2_Click(object sender, EventArgs e)
{
tabControl1.Alignment = TabAlignment.Bottom;
// 탭을 아래쪽에 위치
}
private void radioButton3_Click(object sender, EventArgs e)
{
tabControl1.Alignment = TabAlignment.Left;
// 탭을 왼쪽에 위치
}
private void radioButton4_Click(object sender, EventArgs e)
{
tabControl1.Alignment = TabAlignment.Right;
// 탭을 오른쪽에 위치
}
private void radioButton5_Click(object sender, EventArgs e)
{
tabControl1.Appearance = TabAppearance.Normal; // 탭의 모양을 보통 모양으로
}
private void radioButton6_CheckedChanged(object sender, EventArgs e)
{
tabControl1.Appearance = TabAppearance.Buttons;
}
private void radioButton7_Click(object sender, EventArgs e)
{
tabControl1.Appearance = TabAppearance.FlatButtons;// 탭의 모양을 프렛버튼 모양으로
}
- DateTimePicker에서 날짜가 변경되면 ValueChanged 이벤트가 발생한다.
변경된 날짜와 시간을 구해 레이블의 Text 속성으로 설정하기 위해
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
label1.Text = dateTimePicker1.Value.ToString();
}
- MonthCalendar 에서 날짜를 선택하면 DateSelected 이벤트가 발생한다
변경된 날짜와 시간을 구해 레이블의 Text 속성으로 설정하기 위해
private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e)
{
label1.Text = monthCalendar1.SelectionRange.Start.ToString();
}
윈도우 폼(Window Form)예제 10 (메뉴)
 메뉴
- 사용자와의 인터페이스로 많이 사용하는 컨트롤
- 메뉴 관련 클래스
- MenuStrip, ToolStripMenuItem, ContextMenuStrip 등
 MenuStrip
- 폼의 메뉴 구조에 대한 컨테이너
- ToolStripMenuItem, ToolStripComboBox, ToolStripSeperator,
ToolStripTextBox 개체의 컨테이너
- 메뉴의 하부 항목은 DropDownItems 편집기를 사용하여 추가
 ToolStripMenuItem
- 메뉴 구조의 개별 메뉴 항목을 나타냄
- 응용 프로그램의 메뉴 항목이나 다른 하위 메뉴 항목의 부모 메뉴 항목이 될
수 있음
 ContextMenuStrip
- 컨트롤, 폼의 일정 영역 위에서 마우스 오른쪽 버튼을 누르면 표시되는 메뉴
- ContextMenuStrip 은 MenuStrip 에 속한 여러 메뉴 항목과 대응
- ToolStripMenuItem, ToolStripComboBox, ToolStripSeperator,
ToolStripTextBox 개체의 컨테이너
 MenuStrip의 주요 속성과 이벤트
메뉴스트립 속성
의미
ContextMenuStrip
ToolStripMenuItem가 선택되어 있는지 여부를 나타내는 값 획득 / 설정
Enabled
컨트롤을 사용할 수 있는지 여부
Items
ToolStrip에 속한 모든 항목
메뉴스트립 메소드
의미
GetItemAt
지정한 위치에 있는 항목을 반환
Click
컨트롤을 클릭하면 발생
ItemClicked
ToolStripItem을 클릭하면 발생
 ToolStripMenuItem의 주요 속성과 이벤트
툴스트립 메뉴아이템 속성
의미
Checked
ToolStripMenuItem가 선택되어 있는지 여부
Enabled
컨트롤을 사용할 수 있는지 여부
ShortcutKeys
ToolStripMenuItem과 연결된 바로 가기 키
Visible
항목이 표시되는지 여부
툴스트립 메뉴아이템 메소드
의미
Click
ToolStripItem을 클릭하면 발생하는 이벤트
VisibleChanged
Visible 속성 값이 변경되면 발생하는 이벤트
- 솔루션 탐색기의 솔루션 ’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 새
프로젝트를 추가하고, 프로젝트 이름을 Menu 로 한다
MenuStrip 컨트롤
toolStripMenuItem
toolStripMenuItem
toolStripMenuItem
MenuStrip
toolStripMenuItem
속성
값
Text
새파일(&N)
ShortCutKeys
Ctrl+N
Name
menuItemNew
Text
열기(&O)
ShortCutKeys
Ctrl+O
Name
menuItemOpen
Text
닫기(&C)
ShortCutKeys
Ctrl+C
Name
menuItemClose
Seperator
구분선
toolStripMenuItem
Text
저장(&S)
ShortCutKeys
Ctrl+S
Name
menuItemStore
Text
새이름으로 저장
(&A)
ShortCutKeys
Ctrl+A
Name
menuItemAnother
toolStripMenuItem
- 메뉴 항목 새파일의 Click 이벤트 처리기 추가
private void menuItemNew_Click(object sender, EventArgs e)
{
MessageBox.Show("파일을 새로 만듭니다.");
}
- 메뉴 항목 열기, 닫기, 저장의 의 Click 이벤트 처리기 추가
private void menuItemOpen_Click(object sender, EventArgs e)
{
MessageBox.Show("파일을 오픈합니다.");
}
private void menuItemClose_Click(object sender, EventArgs e)
{
MessageBox.Show("파일을 닫습니다.");
}
private void menuItemStore_Click(object sender, EventArgs e)
{
MessageBox.Show("파일을 저장합니다");
}
private void menuItemNewName_Click(object sender, EventArgs e)
{
MessageBox.Show("새 이름으로 저장합니다");
}
윈도우 폼(Window Form)예제 10 (ContextMenuStrip 컨트롤)
 ContextMenuStrip의 주요 속성과 이벤트
메뉴스트립 속성
의미
Items
ToolStrip에 속한 모든 항목
Parents
컨트롤의 부모 컨테이너
RightToLeft
컨트롤의 텍스트가 오른쪽에서 왼쪽으로 표시되는 여부를 나타내는 값 획득
/ 설정
메뉴스트립 메소드
의미
GetItemAt
지정한 위치에 있는 항목을 반환
GetNextItem
지정한 참조 지점부터 지정한 방향으로 이동하여 다음 ToolStripItem을 검색
GetMainMenu
지정된 좌표를 기준으로 ToolStripDropDown 위치를 설정
Show
지정된 좌표를 기준으로 ToolStripDropDown 위치 설정
- 솔루션 탐색기의 솔루션 ’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 새
프로젝트를 추가하고, 프로젝트 이름을 ContextMenu 로 한다
Button
ListView
ContextMenuStrip
컨트롤
속성
값
ContextMenuStrip1
Name
button1
최대화(ToolStripMenuItem1)
ContextMenuStrip
ContextMenuStrip2
ContextMenuStrip
ContextMenuStrip3
보통(ToolStripMenuItem3)
Name
listView1
Name
ContextMenuStrip2
View
Details
메뉴항목
빨강색
(ToolStripMenuItem4)
ContextMenuStrip1
ContextMenuStrip
Name
메뉴항목
최소화(ToolStripMenuItem2)
녹색
(ToolStripMenuItem5)
파랑색
(ToolStripMenuItem6)
ContextMenuStrip
값
마우스오른쪽버튼클릭
ContextMenuStrip
Name
ContextMenuStrip3
메뉴항목
큰아이콘
(ToolStripMenuItem7)
작은아이콘
(ToolStripMenuItem8)
간단히
(ToolStripMenuItem9)
자세히
(ToolStripMenuItem10)
Button
속성
Text
Form
ContextMenuStrip
컨트롤
ListView
- 추가시킨 contextMenuStrip1에 최대화, 최소화, 보통이라는 메뉴항목 추가
- contextMenuStrip2(빨강색, 녹색, 파란색), contextMenuStrip3(큰아이콘,
작은 아이콘, 간단히, 자세히)에도 메뉴 항목 추가
- 예제 6을 참조하여 ListView에 컬럼(날씨, 설명)을 추가하고, Items 항목에
는 구름, 비, 눈, 해 를 추가한다. 또한 각각의 subitems 항목에는 “흐린날씨”,
“비가 오는 중”, “눈이 내리는 중”, “화창한 날씨” 를 추가
메뉴항목추가
ListView항목추가
- 3개의 ContextMenuStrip에 추가한 10개의 메뉴항목에 대한 Click 이벤트처리기 추가
// 폼을 최소화
private void ToolStripMenuItem1_Click(object sender, EventArgs
{
this.WindowState = FormWindowState.Minimized;
}
// 폼을 최대화
private void ToolStripMenuItem2_Click(object sender, EventArgs
{
this.WindowState = FormWindowState.Maximized;
}
// 폼을 보통으로
private void ToolStripMenuItem3_Click(object sender, EventArgs
{
this.WindowState = FormWindowState.Normal;
}
// 버튼의 배경색을 빨강색으로
private void ToolStripMenuItem4_Click(object sender, EventArgs
{
button1.BackColor = Color.Red;
}
// 버튼의 배경색을 녹색으로
private void ToolStripMenuItem5_Click(object sender, EventArgs
{
button1.BackColor = Color.Green;
}
e)
e)
e)
e)
e)
// 버튼의 배경색을 파랑색으로
private void ToolStripMenuItem6_Click(object sender, EventArgs e)
{
button1.BackColor = Color.Blue;
}
// 리스트뷰의 보기를 큰아이콘으로
private void ToolStripMenuItem7_Click(object sender, EventArgs e)
{
listView1.View = View.LargeIcon;
}
// 리스트뷰의 보기를 작은아이콘으로
private void ToolStripMenuItem8_Click(object sender, EventArgs e)
{
listView1.View = View.SmallIcon;
}
// 리스트뷰의 보기를 간단히로
private void ToolStripMenuItem9_Click(object sender, EventArgs e)
{
listView1.View = View.List;
}
// 리스트뷰의 보기를 자세히로
private void ToolStripMenuItem10_Click(object sender, EventArgs e)
{
listView1.View = View.Details;
}
윈도우 폼(Window Form)예제 12 (StatusStrip)
 StatusStrip
- 윈도우 상태 표시줄
- 폼에서 현재 보고 있는 개체에 대한 정보, 해당 개체의 구성요소 또는 응용
프로그램 내에서의 개체 동작과 관련된 상황 정보를 표시
- 텍스트나 아이콘 또는 모두를 표시하는 ToolStripStatusLabel 개체로 구성
- ToolStripDropDownButton,ToolStripSplitButton,ToolStripProgressBar
컨트롤도 포함할 수 있다
- 패널을 StatusStrip에 추가하는 방법
- ToolStripItemCollection.AddRange 메서드를 사용
- StatusStrip 항목 컬렉션 편집기를 사용
 StatusStrip 컨트롤의 주요 속성과 이벤트
StatusStrip 속성
의미
AutoSize
전체 내용이 표시되도록 컨트롤의 크기를 자동으로 조정할지 여부
BackColor
ToolStrip의 배경색
Font
정보를 표시하는 데 사용할 글꼴
ForeColor
ToolStrip의 전경색
Items
ToolStrip에 속한 모든 항목
ShowItemToolTips
도구 설명이 StatusStrip에 대해 표시되는지 여부
SizingGrip
컨트롤의 오른쪽 아래 모퉁이에 크기 조정 그립이 표시되는지 여부
StatusStrip 메소드
의미
Click
컨트롤을 클릭하면 발생
ItemClicked
ToolStripItem을 클릭하면 발생
- 솔루션 탐색기의 솔루션 ’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 새
프로젝트를 추가하고, 프로젝트 이름을 StatusStrip 로 한다
StatusStrip
Timer
StatusStrip 항목컬렉션편집기
컨트롤
StatusStrip
속성
값
Name
StatusStrip1
ShowImageToolTips
true
AutoSize
True
SizingGrip
true
Items
StatusLabels
toolStripStatusLabel1
Text : 마우스 좌표
ToolTipText : 마우스의 좌표 표시
toolStripStatusLabel2
Text : 날짜
ToolTipText : 현재 날짜를 표시
toolStripStatusLabel3
Text : 시간
ToolTipText : 현재 시간을 표시
Timer
Name
timer1
Interval
1000
Enabled
true
- 폼에서 마우스가 음직이면 현재의 마우스 좌표를 상태표시줄에 표시하도록
MouseMove 이벤트 처리기 작성
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
toolStripStatusLabel1.Text = String.Format("X : {0}, Y : {1}", e.X, e.Y);
}
- 타이머의 tick 이벤트 처리기는 상태 표시줄에 현재의 날짜와 시간을 표시
private void timer1_Tick(object sender, EventArgs e)
{
DateTime dt = DateTime.Now;// 현재 시간을 구함
toolStripStatusLabel2.Text = String.Format("{0}년 {1}월 {2}일", dt.Year,
dt.Month, dt.Day);
toolStripStatusLabel3.Text = String.Format("{0}시 {1}분 {2}초", dt.Hour,
dt.Minute, dt.Second);}
- 상태표시줄의 패널에서 ItemClicked 이벤트가 발생하면 해당 ToolStripItem의
텍스트를 멧지로 갖는 메시지박스를 표시
private void statusStrip1_ItemClicked(object sender,ToolStripItemClickedEventArgs e)
{
MessageBox.Show(e.ClickedItem.Text);
}
윈도우 폼(Window Form)예제 13 (ToolStrip)
 ToolStrip
- 메뉴와 유사한 기능을 툴스트립에 있는 버튼을 클릭하여 수행
- 툴스트립에 있는 버튼은 ToolStripButton 클래스를 사용
- Image 속성을 사용하여 버튼에 이미지를 제공  ToolStrip 컨트롤의 주요 속성과 이벤트
ToolStrip 속성
의미
AutoSize
전체 내용이 표시되도록 컨트롤의 크기를 자동으로 조정할지 여부
ImageList
ToolStrip 항목에 표시된 이미지가 포함된 이미지 목록
Items
ToolStrip에 속한 모든 항목
ShowItemToolTips
ToolStrip 항목에 도구 설명을 표시할지 여부
ToolStrip 메소드
의미
Click
컨트롤을 클릭하면 발생
ItemClicked
ToolStripItem을 클릭하면 발생
 ToolStripButton 컨트롤의 주요 속성
ToolStripButton 속성
의미
Image
ToolStripItem에 표시되는 이미지
ImageIndex
항목에 표시되는 이미지의 인덱스 값
ToolTipText
컨트롤의 ToolTip으로 표시되는 텍스트
- 솔루션 탐색기의 솔루션 ’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 새
프로젝트를 추가하고, 프로젝트 이름을 ToolStrip 로 한다
MenuStrip
TooltipStrip
컨트롤
MenuStrip
속성
값
Name
MenuStrip1
파일
(ToolStripMenuItemFile)
파일메뉴1(Menuitem1)
파일메뉴2(MenuItem2)
파일메뉴3(MenuItem3)
ToolsTrip1
ToolStrip2
보기
(ToolStripMenuItemView)
보기메뉴1(MenuItem4)
Name
toolStrip1
ShowITemToolTips
true
Items
toolStripButton1
Image : CDROM01, ToolTipText : 파일메뉴1
toolStripButton2
Image : CDROM02, ToolTipText : 파일메뉴2
toolStripButton3
Image : CDROM03, ToolTipText : 파일메뉴3
보기메뉴2(MenuItem5)
Name
toolStrip2
ShowITemToolTips
true
Items
toolStripButton4
Image : FACE01, ToolTipText : 보기메뉴1
toolStripButton5
Image : FACE02, ToolTipText : 보기메뉴2
- menuSTrip의 5개 메뉴 항목에 대한 Click 이벤트 처리기 작성
private void menuItem1_Click(object sender, EventArgs e)
{
MessageBox.Show("파일 메뉴 1을 수행합니다");
}
private void menuItem2_Click(object sender, EventArgs e)
{
MessageBox.Show("파일 메뉴 2를 수행합니다");
}
private void menuItem3_Click(object sender, EventArgs e)
{
MessageBox.Show("파일 메뉴 3을 수행합니다");
}
private void menuItem4_Click(object sender, EventArgs e)
{
MessageBox.Show("보기 메뉴 1을 수행합니다");
}
private void menuItem5_Click(object sender, EventArgs e)
{
MessageBox.Show("보기 메뉴 2를 수행합니다.");
}
- ToolStrip의 버튼에 대한 [ItemClicked] 이벤트 처리기를 추가
- toolStrip1의 3개 버튼은 각가 파일 메뉴에서 만들어 준 3개의 메뉴 항목을
대신 수행
- toolStrip2의 2개 버튼은 각각 보기 메뉴에서 만들어 준 2개의 메뉴 항목을
대신 수행
private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
switch (toolStrip1.Items.IndexOf(e.ClickedItem))
{
case 0: MenuItem1_Click(sender, e); break;
case 1: MenuItem2_Click(sender, e); break;
case 2: MenuItem3_Click(sender, e); break;
}
}
private void toolStrip2_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
switch (toolStrip2.Items.IndexOf(e.ClickedItem))
{
case 0: MenuItem4_Click(sender, e); break;
case 1: MenuItem5_Click(sender, e); break;
}
}
윈도우 폼(Window Form)예제 14 (대화상자)
 대화상자
- 응용프로그램에서 사용자의 입력을 받아들이거나 프로그램의 현재 상태의 정
보를 보여주는 용도로 사용
- 모달 대화상자
- 대화상자를 종료하기 전에는 다른 작업을 할 수 없다.
- (예) 오픈 대화상자, 메시지 대화상자 등
- 모달리스 대화상자
- 대화상자를 열어놓은 채로 다른 작업을 할 수 있다.
- (예) 찾기 대화상자
- 대화상자는 모두 Form 클래스를 상속
- 모달 대화상자는 Form 클래스의 ShowDialog 메서드를 사용
- 모달리스 대화상자는 Show 메서드를 사용
- 솔루션 탐색기의 솔루션 ’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 새
프로젝트를 추가하고, 프로젝트 이름을 Dialog 로 한다
예제 6 리스트뷰
와 동일하게 작
성
Button
- 모달 대화상자를 만들기 위해 솔루션 탐색기의 Dialog 프로젝트를 선택, 오른
쪽 마우스 버튼을 클릭 후 추가 메뉴에서 windows 폼 추가를 차례로 선택
- 새항목추가 대화상자가 나타나면 DialogForm.cs 입력 후 추가 버튼 클릭
- 새로 추가된 DialogForm 대화상자에 Button과 도명, 도청소재지, 인텍스를
입력하기 위한 TextBox와 Label을 배치하고 속성 설정
컨트롤
Label1
Label2
Label3
TextBox1
TextBox2
TextBox3
Button
속성
값
Name
label1
Text
도명
Name
label2
Text
도청소재지
Name
label3
Text
인덱스
Name
textBox1
Text
“”
Name
textBox2
Text
“”
Name
textBox3
Text
“”
Name
button1
Text
확인
- Form1에서 DialogForm의 textBox들을 접근할 수 있게 하기 위해 textBox 의
Modifer 속성을 public 으로 설정한다
- Form1의 대화상자로 입력 버튼의 Click 이벤트 처리기 추가
private void button2_Click(object sender, EventArgs e)
{
DialogForm input = new DialogForm(); // 대화상자 객체 생성
input.ShowDialog(); // 모달 대화상자로 수행
// 모달 대화상자에서 입력한 데이터를 사용하여 ListViewItem 객체 생성
ListViewItem item = new ListViewItem(input.textBox1.Text,
int.Parse(input.textBox3.Text));
item.SubItems.Add(input.textBox2.Text);
listView1.Items.Add(item); // 리스트뷰에 새 항목을 추가
}
- DialogForm의 확인 버튼에 대한 Click 이벤트 처리기 추가
private void button1_Click(object sender, EventArgs e)
{
Close();
}
윈도우 폼(Window Form)예제 15 (공통대화상자)
 ColorDialog
- 색상을 선택할 때 사용하는 대화상자
- 대화상자를 수행시키고 원하는 설정을 한 다음 [확인] 버튼을 클릭하면
Color 속성에 설정된 내용이 저장
- ColorDialog의 주요 속성 및 메서드
ColorDialog 속성
의미
AnyColor
대화 상자에서 기본 색 집합에 있는 색 중 사용 가능한 색이 모두 표시되는
지 여부
Color
선택한 색
CustomColors
대화 상자에 표시된 사용자 지정 색 집합
ColorDialog 메소드
의미
Reset
모든 옵션을 해당 기본값으로, 마지막으로 선택한 색을 검정으로, 사용자 지
정 색을 해당 기본값으로 다시 설정
ShowDialog
대화상자를 실행
 FileDialog
- FileDialog를 상속받은 OpenFileDialog와 SaveFileDialog 2종류가 있음
- 파일을 열거나 저장할 때 사용하는 공통 대화상자
- 대화상자를 수행시키고 원하는 파일을 선택한 다음 열기 버튼을 클릭하면
FileName 속성에 설정한 파일 이름이 저장
- 파일 대화상자의 주요 속성 및 메서드
FileDialog 속성
의미
AddExtension
확장명을 생략한 경우 대화 상자가 파일 이름에 확장명을 확장명을 자동으로 추가할지
여부
CheckFileExists
존재하지 않는 파일 이름을 지정할 때 대화 상자에 경고가 표시되는지 여부
CheckPathExists
존재하지 않는 경로를 지정할 때 대화 상자에 경고가 표시되는지 여부
DefaultExt
기본 확장명
FileName
파일 대화상자에서 선택한 파일 이름을 포함하는 문자열
FileNames
대화상자에서 선택한 모든 파일의 파일 이름
Filter
대화상자에서 "파일 형식으로 저장" 또는 "파일 형식" 상자에 표시되는 선택 옵션을
결정하는 현재 파일 이름 필터 문자열
InitialDirectory
파일 대화상자가 표시하는 초기 디렉터리
Titel
파일 대화상자 제목
FileDialog 메소드
의미
Reset
모든 속성을 기본값으로 다시 설정
ShowDialog
대화상자를 실행
 FontDialog
-
폰트를 설정하는데 사용하는 공통 대화상자
글꼴, 글꼴 스타일, 크기, 효과 등을 설정
설정된 값은 [Font] 속성에 저장
폰트 대화상자의 주요 속성 및 메서드
FontDialog 속성
의미
Color
선택한 글꼴 색
Font
선택한 글꼴
ShowEffects
취소선, 밑줄 및 텍스트 색 옵션을 지정하는 데 사용할 수 있는 컨트롤이
대화상자에 들어 있는지 여부
FontDialog 메소드
의미
Reset
모든 속성을 기본값으로 다시 설정
ShowDialog
대화상자를 실행
- 솔루션 탐색기의 솔루션 ’WindowForm’ 에서 마우스 오른쪽 버튼을 눌러 새
프로젝트를 추가하고, 프로젝트 이름을 CommonDlg 로 한다
컨트롤
속성
MenuStrip
값
Name
menuStrip1
메뉴항목
컬러(menuitemColor)
파일(menuitemColor)
폰트(menuitemFont)
TextBox
Name
textBox1
Text
공통대화상자
MultiLine
true
ColorDialog
Name
ColorDialoag1
FontDialog
Name
FontDialog1
OpenFileDialog
Name
OpenFileDialog1
TextBox
MenuStrip
ColorDialog
FontDialog
OpenFileDialog
- 메뉴항목에 대한 Click 이벤트 처리기 추가
// 색 대화상자는 텍스트박스의 전경색을 변경시키는 용도로 사용
private void menuItemColor_Click(object sender, EventArgs e)
{
colorDialog1.ShowDialog(); // 대화상자 수행
textBox1.ForeColor = colorDialog1.Color; // 텍스트박스의 펜 색 변경
// ColorDialog dlg = new ColorDialog();
// dlg.ShowDialog();
// textBox1.ForeColor = dlg.Color;
}
// 열기 대화상자에서 선택한 파일의 경로명을 텍스트박스에 출력
private void menuItemFile_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog(); // 대화상자 수행
string str = openFileDialog1.FileName + " 파일을 선택";
textBox1.Text = str; // 텍스트박스에 선택한 파일의 경로 표시
}
// 텍스트박스의 폰트를 폰트 대화상자에서 선택한 폰트로 설정
private void menuItemFont_Click(object sender, EventArgs e)
{
fontDialog1.ShowDialog(); // 대화상자 수행
textBox1.Font = fontDialog1.Font; // 텍스트박스의 폰트 변경
}