패스가 안잡혔을때 cmd창을 비쥬얼 스튜디오 용으로 하면 자동 패스된 상태
도스에서 윈폼만 뜨도록 할때 설정
using System;
using System.Windows.Forms;//윈폼 관련 클래스
namespace Csharp
{
//Hello.cs
class Hello
: Form//창을 생성하려면 반드시 Form으로부터
파생
{
public static void Main(string[] args)
{
//csc.exe /t:exe
Hello.cs - 콘솔 컴파일
//csc.exe /t:winexe
Hello.cs - 윈폼 컴파일
//csc.exe /t:library
TestDll.cs - DLL 컴파일
Hello h = new Hello();
Application.Run(h);
}
}
}
모든 행동을 이벤트를 OS가 관리한다. 무한루프를 가지고 있는 상태에서 윈도우가 쏴주는 메세지를 읽으려고 기다리고 있다. 이러한 행동을 WIN32에서 메시지 루프라고 한다.
//무한루프 메시지 루프를 돌며 os가 이벤트
받는것을 기다린다.
//시작폼, 메인폼 나머지는 모두 자식창 Run이 시작점
// - 메인폼이 닫히면 나머지 폼도 닫힌다.
// 프로젝트 제외의 차이 = 실제 코드에 추가가
되서 파일의 크기가 커진다.
Application.Run(new Form1());
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsForms01
{
public partial class Event02 : Form
{
public Event02()
{
InitializeComponent();
}
private void Test(object
sender, EventArgs e)
{
//정적 이벤트 관리(추가, 수정, 삭제)
// - 컴파일 이전에 완료(완성)
//동적 이벤트 관리
// - 2번쨰 버튼 -> 클릭 이벤트X -> 동적 생성
this.button2.Click
+= new EventHandler(Test2);
// - 3번째 버튼 이벤트 추가
this.button3.Click
+= new EventHandler(Test3);
//4번째 이벤트 추가
if
(DateTime.Now.Hour < 12)
this.button4.Click
+= new EventHandler(M1);
else
this.button4.Click
+=new EventHandler(M2);
}
void button4_Click(object sender, EventArgs e)
{
throw new NotImplementedException();
}
//4번째 버튼 클릭 이벤트 핸들러(메서드)
private void M1(object
sender, EventArgs args)
{
//C#에서 쓰는 모든 델리게이트는 object
sender, EventArgs args(모든게 상속받는다 인자값을 갖는다)
MessageBox.Show("안녕하세요~");
}
private void M2(object
sender, EventArgs args)
{
//C#에서 쓰는 모든 델리게이트는 object
sender, EventArgs args(모든게 상속받는다 인자값을 갖는다)
MessageBox.Show("안녕히 가세요~");
}
private void Test2(object
sender, EventArgs e)
{
MessageBox.Show("안녕");
}
private void Test3(object
sender, EventArgs e)
{
//접근지정자 생략시 자동으로 private(캡슐화
때문에)
//동적 이벤트 관리를 사용하는 이유?
}
}
}
Control 클래스
- 폼, 컨트롤의 부모 클래스
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsForms01
{
public partial class Form03 : Form
{
public Form03()
{
InitializeComponent();
}
private void Form03_Load(object
sender, EventArgs e)
{
//폼로드
// - 폼 인스턴스가 생성되고 난 직후에
// - 초기화 작업(컨트롤) = 생성자 초기화와 차이가 거의 없다.
// - 폼로드 <> 폼이 화면에 보임
// - 폼로드 == 폼이 메모리상에 생성
// - 폼객체가 생성되고 난 직후 or 폼객체가
화면에 보이기 직전
MessageBox.Show("생성자 변수 초기화 등");
}
private void Form03_FormClosed(object
sender, FormClosedEventArgs e)
{
//폼이 닫힌 후 발생
// - 마무리 작업
MessageBox.Show("클린, 클로스, 파일 클로스등");
}
private void Form03_Shown(object
sender, EventArgs e)
{
//Load와 유사
// - 처음 실행할때 발생
// - 1. 폼객체가 메모리에 생성 -> 2. Load이벤트
발생 -> 3. 폼객체가 화면에 표시 -> 4. Shown이벤트
발생
//탄생이유? 화면적인 필요성에 의해 만들어짐
팝업용도로도 사용가능
MessageBox.Show("Shown");
}
private void Form03_FormClosing(object
sender, FormClosingEventArgs e)
{
//Closed : 폼이 완전히 닫혔을때
//Closing : 폼이 닫히기 바로 직전
//e.Cancel 이것 때문에 클로징을 쓴다.
if (MessageBox.Show
("정말 종료 하시겠습니까", "종료",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Exclamation) == DialogResult.Cancel)
{
e.Cancel = true;//폼이 닫히는 진행을 취소
}
//MessageBox.Show("Closing");
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsForms01
{
public partial class Form04 : Form
{
//살려두기위해서..(모든메서드에서 접근 가능하게
하기 위해서)
private Form04Child child;
public Form04()
{
InitializeComponent();
}
private void button1_Click(object
sender, EventArgs e)
{
//자식창(Form) 생성 -> 열기
// - Form클래스의 객체 == 창(윈도우, 폼)
//폼은 실제 보이지 않지만 메모리에 올려져 있다.
Form f = new Form();
//자식창 꾸미기
//this == Form04(Form)
//form == form
f.Text = "자식창";
f.Size = new
System.Drawing.Size(100, 100);
f.FormBorderStyle = FormBorderStyle.FixedToolWindow;
f.BackColor = Color.Yellow;
f.Show();
}
private void button2_Click(object
sender, EventArgs e)
{
child = new Form04Child();
this.child.Show();
}
private void button3_Click(object
sender, EventArgs e)
{
//자식창 닫기 -> 폼객체.Close();
this.child.Close();
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsForms01
{
public partial class Form04Child : Form
{
public Form04Child()
{
InitializeComponent();
}
private void button1_Click(object
sender, EventArgs e)
{
this.Close();//창닫기
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsForms01
{
public partial class Form04 : Form
{
//살려두기위해서..(모든메서드에서 접근 가능하게
하기 위해서)
private Form04Child child;
public Form04()
{
InitializeComponent();
}
private void button1_Click(object
sender, EventArgs e)
{
//자식창(Form) 생성 -> 열기
// - Form클래스의 객체 == 창(윈도우, 폼)
//폼은 실제 보이지 않지만 메모리에 올려져 있다.
Form f = new Form();
//자식창 꾸미기
//this == Form04(Form)
//form == form
f.Text = "자식창";
f.Size = new
System.Drawing.Size(100, 100);
f.FormBorderStyle = FormBorderStyle.FixedToolWindow;
f.BackColor = Color.Yellow;
f.Show();
}
private void button2_Click(object
sender, EventArgs e)
{
//방법1. 생성자를 통해서 부모 폼을 넘겨준다.
//child = new
Form04Child(this);
//방법2. 프로퍼티를 통해서 부모폼을 넘겨준다.
//child = new
Form04Child();
//child.Parent1 = this;
//방법3 프로퍼티를 통해서 부모폼을 넘겨준다. Owner 와 방법 2는 같은 로직이다.
child = new Form04Child();
child.Owner = this;
this.child.Show();
}
private void button3_Click(object
sender, EventArgs e)
{
//자식창 닫기 -> 폼객체.Close();
this.child.Close();
}
private void button4_Click(object
sender, EventArgs e)
{
//부모 -> 자식(텍스트박스)
child.textBox1.Text = "부모로부터 접근했습니다.";
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsForms01
{
public partial class Form04Child : Form
{
private Form04 parent;
public Form04 Parent1
{
get { return parent; }
set { parent = value; }
}
public Form04Child()
{
InitializeComponent();
}
public Form04Child(Form04 parent)
{
InitializeComponent();
this.parent =
parent;
}
private void button1_Click(object
sender, EventArgs e)
{
this.Close();//창닫기
}
private void button2_Click(object
sender, EventArgs e)
{
//부모폼객체.textBox1
//this.parent.textBox1.Text
//부모폼객체(this)
//소유하고 있는 주체를 파악하도록 한다.
//((Form04)this.Owner).textBox1.Text
= "자식~";
((Form04)this.Owner).textBox1.Text = this.textBox1.Text;
}
private void textBox1_KeyDown(object
sender, KeyEventArgs e)
{
//엔터키를 눌렀을때..반응
if (e.KeyCode == Keys.Enter)
{
//복사
((Form04)this.Owner).textBox1.Text = this.textBox1.Text;
this.Close();
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsForms01
{
public partial class Form05 : Form
{
private Form05Child child;
public Form05()
{
InitializeComponent();
}
private void button1_Click(object
sender, EventArgs e)
{
child = new Form05Child();
child.Show();
}
private void button2_Click(object
sender, EventArgs e)
{
child.Close();
}
private void button3_Click(object
sender, EventArgs e)
{
//닫기 : 창객체를 메모리에서 제거
//감추기 : 화면에서만 보이지 않게(메모리 살아있음)
//토글 버튼
if (button3.Text
== "자식창 감추기")
{
child.Hide();
button3.Text = "자식창 보이기";
}
else
{
child.Show();
button3.Text = "자식창 감추기";
}
}
private void button4_Click(object
sender, EventArgs e)
{
this.Hide();
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsForms01
{
public partial class Form05Child : Form
{
public Form05Child()
{
InitializeComponent();
}
private void button1_Click(object
sender, EventArgs e)
{
//열기
}
}
}