Overview C# Windows Forms 321190 2009 년가을학기 10/27/2009 박경신 Windows OS & Windows Applications 특징이해 Windows Form Form 클래스 InitializeComponent() Application.Run() Form 속성 (Property) - 모양변경, 위치및크기, 초기상태 Form Modality MDI (Multiple Document Interface) Windows OS 특징 Graphical User Interface (GUI) 일관성있는사용자 인터페이스시스템메뉴 메뉴 툴바 최소 / 최대 / 닫기버튼 Windows OS 특징 메시지기반구조 (Message-driven Architecture) 이벤트발생 대기 대화상자 클라이언트영역 스크롤바 윈도우시스템메시지큐 응용프로그램메시지큐 #3 응용프로그램메시지큐 #2 처리 처리 상태바 3 응용프로그램메시지큐 #1 4
Windows OS 특징 멀티태스킹 (Multi-Tasking) 하나의윈도우즈시스템에서여러개의응용프로그램을수행 응용프로그램사이의상호작용가능 멀티스레딩 (Multi-Threading) 하나의응용프로그램에여러개의실행흐름을생성 장치에독립적 장치드라이버 (Device Driver) 에의해주변장치들을제어 Windows Application 특징 API 호출문집합 API(Application Programming Interface) - 윈도우운영체제가응용프로그램을위해제공하는각종함수집합 응용프로그램 call API#1 call API#2 call API#3 call API#4 call API#n 5 6 Windows Application 특징 메시지핸들러 (Message Handler) 집합 메시지핸들러 (Message Handler) - 메시지를받았을때동작을결정하는코드 - 키보드, 마우스, 메뉴, 등등 윈도우프로시저 (Window Procedure) 이러한메시지핸들러의집합 Windows Application 특징 실행파일과 DLL 집합 DLL(Dynamic-Link Library): 프로그램이실행중에호출할수있는함수 ( 코드 ) 와리소스 응용프로그램 메시지핸들러 #1 메시지핸들러 #2 메시지핸들러 #3 메시지핸들러 #4 메시지핸들러 #5 메시지핸들러 #6 윈도우프로시저 : 메시지핸들러집합 7 응용프로그램 실행파일 DLL #1 DLL #2 DLL #3 DLL #4 DLL #5 8
Windows Application 특징 장치독립적 윈도우시스템의 API 를사용하여간접적으로주변장치들을제어 응용프로그램 API 장치드라이버주변장치 Windows Forms Windows Forms 응용프로그램에공통적으로들어가는기능을사용자인터페이스컴포넌트형태로미리구현해놓은.NET 클래스 Windows 응용프로그램의사용자인터페이스를구성하는창또는대화상자 ( 응용프로그램에표시되는모든창 ), 다중문서인터페이스등 VC++ MFC와비슷함.NET 프레임워크에서지원되므로.NET 언어에서모두사용가능 9 Windows Forms 윈도우폼응용프로그램생성시대부분의기능 System.Windows.Forms 네임스페이스에포함 기본적인윈도우폼응용프로그램 () IDE 의시작페이지에서 Windows Form Application 새프로젝트를만들면자동생성 새프로젝트대화상자 using System; using System.Windows.Forms; static class Program { // 프로그램시작점 static void Main() { Application.EnableVisualStyle(); Application.SetCompatibleTextRenderingDefault(false); p Application.Run(new Form1()); // 폼객체생성및메시지처리
기본폼 폼은 CLR 의 System.Windows.Forms.Form 클래스에서지원 프로젝트생성시자동으로작성된 Form1.cs 파일생성 Form1.cs 의디자인템플릿과코드보기 Form1() 생성자에서 InitializeComponent() t() 호출 Partial 클래스 partial 키워드를사용하여클래스나구조체의정의또는인터페이스를두개이상의소스파일로분할가능 대규모프로젝트를진행하는경우클래스를개별파일로분할하면여러프로그래머가동시에작업을수행할수있음 자동으로생성된소스를사용하여작업하는경우소스파일을다시만들지않고도클래스에코드를추가가능 public partial class Employee { public void DoWork() {. public partial class Employee { public void GoToLunch() {. InitializeComponent() 윈도우폼을응용프로그램에연결해주는코드가포함 윈도우폼과이벤트핸들러를연결하는코드가포함 System.Windows.Forms.Application.Run 메소드가이벤트처리스레드를만드는역할을함 폼클래스의생성자가딱한번호출 partial class Earth : Planet, IRotate {. partial class Earth : IRevolve {
Application.Run(Form) 현재스레드에서표준응용프로그램메시지루프의실행을시작하고지정된폼을표시 폼이닫힐때, 메시지루프에종료메시지를보냄 Message Loop 메시지큐에서메시지를하나씩꺼내어처리하기위한반복문 응용프로그램이종료될때까지반복응용프로그램 윈도우폼에서컨트롤사용 개발자는도구상자에서각종컨트롤 ( 예 : 버튼, 텍스트박스, 리스트뷰등 ) 을 Drag-and-Drop하여원하는곳에배치하여화면을디자인 응용프로그램메시지큐 Message loop 메시지핸들러 #1 메시지핸들러 #2 메시지핸들러 #3 윈도우폼에서컨트롤사용 그리고, 속성 (Property) 창에서속성을변경하면자동으로 InitializeComponent() 메소드에업데이트 private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); this.suspendlayout(); // // button1 // this.button1.location = new System.Drawing.Point(34, 43); this.button1.name = "button1"; this.button1.size = new System.Drawing.Size(121, 53); this.button1.tabindex = 0; this.button1.text = "button1"; this.button1.usevisualstylebackcolor = true; // 중간생략.. 폼클래스 윈도우응용프로그램의움직임을제어하는멤버들을정의해놓은하위수준의클래스 응용프로그램을종료하거나휴식 (Idle) 상태를처리하는등의응용프로그램의행동을처리하는많은이벤트를정의 응용프로그램클래스의정적메소드, 속성, 이벤트 응용프로그램클래스로할수있는기능 응용프로그램의정보를제공, 응용프로그램이종료할때의이벤트를처리, 메시지처리
폼클래스상속계층구조 System.Object System.MarshalByRefObject System.ComponentModel.Component System.Windows.Forms.Control System.Windows.Forms.ScrollableControl System.Windows.Forms.ContainerControl System.Windows.Forms.Form 폼클래스자체로서의의미뿐만아니라, Custom Form 클래스의직접적인기본클래스로서의의미도가짐 폼클래스는대부분의특성을상속받아재정의하는메소드제공 메소드 설명 Activate() 주어진폼을활성화시키시고, 그포커스를폼에맞춤 Close() 폼을닫고폼과관련된컨트롤과컴포넌트에할당되 었던모드리소스를해제 CenterToScreen() 폼을스크린부동중심점에위치 LayoutMDI() 부모폼안의자식폼들을모두정렬 OnResize() Resize 이벤트에반응 ShowDialog() 폼을 Modal Dialog 로서나타냄 Show() 숨겨진 (Hide) 폼을화면상에표시 Hide() 단지폼을화면상에보이지않게함 폼클래스의속성 (Property) Name : 폼의이름 BackColor : 배경색 ( 색상이름또는빨강 (Red), 녹색 (Green), 파랑 (Blue) 의 RGB 값으로지정 ) form1.backcolor = System.Drawing.Color.DarkBlue; BackgroundImage g : 폼의배경그림 Icon : 폼아이콘 Opacity : 폼의투명도 폼의버튼사용여부 form1.minimizebox = false; 속성 값 설명 MinimizeBox True/False 최소화버튼사용여부 MaximizeBox True/False 최대화버튼사용여부 ControlBox True/False 최소, 최대, 닫기버튼사용여부 FormBrderStyle : 폼의테두리모양 form1.formborderstyle = FormBorderStyle.FixedSingle; 값설명 Fixed3D 크기가고정된 3 차원테두리 FixedDialog 크기가고정된대화상자스타일의굵은테두리 FixedSingle 크기가고정된단일선테두리 Sizable 크기를조정할수있는테두리 None 테두리가없는창 FixedToolWindow 크기가고정된도구창 SizableToolWindow 크기를조정할수있는도구창 Size : 폼의크기설정 form1.size = new System.Drawing.Size(100, 100); 폭 : Form1.Width = 200 높이 : Form1.Height = 200
Location : 폼의위치설정 form1.location = new Point(100, 100); X좌표 : Form1.Left = 200; Y좌표 : Form1.Top = 200; StartPosition : 초기위치설정 form1.startposition = FormStartPosition.Manual; 값 Manual CenterScreen WindowsDefaultLocation WindowsDefaultBounds CenterParent 설명디자인때의 location 속성값으로설정된위치에표시화면중앙위치에표시 Windows 기본위치인화면의좌측상단에표시 Windows 기본테두리설정값의테두리를포함한윈도우기본위치에표시부모폼의테두리내에서중앙에위치 WindowState : 폼의표시상태설정 (Normal : 보통상태로변경, Minimized : 최소화상태로변경, Maximized : 최대화상태로변경 ) form1.windowstate = FormWindowState.Normal; ShowInTaskbar :Windows 작업표시줄에표시여부설정, 작업표시줄로프로그램전환불가능, <Alt+Tab> 을사용하여프로그램전환가능 form1.showintaskbar = false; TopMost : 최상위창으로설정 form1.topmost = true; Visible : 화면에폼표시여부설정 form1.visible = true; 모달리티 (Modality) Modal Form 모달폼이표시되는동안제어권을독점하고있는형태 사용자로부터입력받은정보로다음진행상태가결정되는경우에사용 ShowDialog() 메소드를사용 예 : 열기, 저장, 옵션창 Modeless Form 모달이아닌폼이표시되는동안다른폼으로의제어이동이가능한형태 서로다른창사이에서의정보교환을필요로하는경우에사용 Show() 메소드를사용 예 : 찾기및바꾸기 창 MDI(Multiple Document Interface) MDI (Multiple Document Interface) 하나의부모창 ( 컨테이너 ) 과여러개의자식창으로구성 부모창 (Parent Form) 다른창을영역내에포함시키는창 IsMdiContainer 속성값을 true로설정 form1.ismdicontainer = true; 활성화된자식창확인 form activechild = this.activemdichild; 자식창 (Child Form) 부모창의영역내에존재하는창 MdiParent 속성값에부모객체설정 form2.mdiparent = form1;
MDI(Multiple Document Interface) LayoutMdi 속성을이용하여자식폼정렬 Form1.LayoutMdi(System.Windows.Forms.MdiLayout.Cascade); 멤버이름설명 ArrangeIcons 모든 MDI 자식아이콘은 MDI 부모폼의클라이언트영역내에서정렬 Cascade 모든 MDI 자식창은 MDI 부모폼의클라이언트영역내에서단식으로정렬 TileHorizontal 모든 MDI 자식창은 MDI 부모폼의클라이언트영역내에서 Tile Horizontal 식으로정렬 TileVertical 모든 MDI 자식창은 MDI 부모폼의클라이언트영역내에서 Tile Vertical식으로정렬 MdiChildren 속성을사용하여모든자식폼을배열로얻기 Form[] forms = form1.mdichildren foreach (Form f in forms) { Visual Studio.NET의대부분의컨트롤들은 System.Windows.Forms.Control 클래스로부터파생 모든컨트롤들은컨트롤의모습이나행동을결정하는여러속성을가짐 기반클래스인 Control 클래스로부터상속, 재정의 컨트롤클래스의공통속성 (Property) 공통속성 BackColor BackgroundImage Enabled Focused 설명컨트롤의배경색컨트롤의배경이미지컨트롤의활성화여부 ( 비활성화된컨트롤은화면엔표시되지만동작되지않음 ) 초점을갖고있는지여부 ( 초점을갖고있는컨트롤만마우스나키에반응함 ) Font 컨트롤텍스트의폰트 ForeColor 컨트롤의전경색 ( 일반적으로글자의색깔을의미 ) TabIndex 탭순서 ( 탭키를누를때초점이이동하는순서 ) TabStop 탭키를누를때초점을받을지를지정 Text 컨트롤과관련된텍스트 Visible 컨트롤의가시성지정 (true로지정된컨트롤만화면에표시 ) 컨트롤클래스의공통메소드 (Method) 공통메소드 Focus() Hide() Show() 설명입력초점을설정컨트롤을숨김컨트롤을표시 컨트롤클래스의 GUI 관련디자인속성 속성 설명 Anchor 폼의크기변경시고정거리를유지해야할측면 Dock 컨트롤의도킹형태지정 Padding 측면과도킹컨트롤사이의공간지정 (default: 0) Location 폼의좌측상단을모서리를기준으로한컨트롤의좌표 Size 컨트롤의픽셀단위의크기 MinimumSizei 컨트롤의최대, 최소크기 MaximumSize
앵커 폼안의컨트롤들이그려지는위치를고정 예 : 앵커를 Top, Bottom, Left, Right 를지정한경우 도킹 컨트롤들을폼의치수에상관없이폼의지정된가장자리를모두차지 예 : 도킹을 Right 를지정한경우 이벤트 Key press 또는 mouse click 등사용자조작이발생할경우의행동 버튼클릭이벤트 사용자가버튼위에마우스포인터를놓고왼쪽마우스버튼을눌렀다가, 포인터가버튼위에있는동안떼면발생 ( 버튼이포커스를가진경우엔터키를눌러도발생 ) 핸들러추가시, InitializeComponent() 에이벤트핸들러등록을위한대리자코드추가 this.button1.click tt += new System.EventHandler(this.button1_Click); th tt 이벤트핸들러로사용될메소드자체추가 메소드명은컨트롤이름에밑줄이붙고, 뒤에이벤트명시 버튼을클릭하였을경우폼의타이틀변화 private void button1_click(object sender, System.EventArgs e) { this.label1.text = 버튼이클릭되었습니다. ; // 레이블의텍스트 컨트롤의마우스이벤트발생순서 1. MouseEnter : 마우스포인터가컨트롤에들어가면발생 2. MouseMove : 마우스포인터를컨트롤위로이동하면발생 3. MouseHover : 마우스포인터가컨트롤위에있을때발생 4. MouseDown : 마우스포인터가컨트롤위에있을때마우스 단추를클릭하면발생 5. MouseWheel : 컨트롤에포커스가있을때마우스휠을 움직이면발생 6. MouseUp : 마우스포인터가컨트롤위에있을때마우스 단추를눌렀다놓으면발생 7. MouseLeave : 마우스포인터가컨트롤을벗어나면발생 // 버튼이눌렸을때 private void button1_click(object sender, EventArgs e){ F 1 f F 1() Form1 f = new Form1(); f.showdialog(); // 버튼이눌렸을때 private void button2_click(object sender, EventArgs e){ Control p = button2.parent; MessageBox.Show("Parent Type = " + p.gettype() + ", Parent Text = " + p.text, "button2_click"); // 마우스포인터가컨트롤내에들어올때발생되는이벤트처리 private void button3_mouseenter(object sender, EventArgs e) { Button b = (Button)sender; prevcolor = button3.backcolor; b.backcolor = System.Drawing.Color.AliceBlue; // 마우스포인터가컨트롤을벗어날때발생되는이벤트처리 private void button3_mouseleave(object sender, EventArgs e) { Button b = (Button)sender; ( ) b.backcolor = prevcolor ;