메뉴다루기 마우스다루기 키보드다루기 [2/46]
메뉴 윈폼애플리케이션에서가장일반적인사용자인터페이스 윈폼애플리케이션이제공하는기능을사용자가쉽게이해하고사용할수있도록도와주는기능 메뉴의종류 메인메뉴 (main menu) 폼의상단에배치되는주요메뉴 상황메뉴 (context menu) 마우스오른쪽버튺을클릭했을때나타나는팝업메뉴 [3/46]
메뉴의구성 메인메뉴 메뉴항목 상황메뉴 [4/46]
폼의상단에배치되는메뉴 마우스클릭뿐만아니라단축키를통해서는접근할수있는가장기본적인사용자인터페이스 통합개발홖경의 MainMenu 컴포넌트를통하여작성
MainMenu 컴포넌트의추가 도구상자 MainMenu 를선택하여폼디자이너로이동 [6/46]
메뉴항목의추가 여기에입력하십시오 라는문구에 파일 (&F) 를입력 우측의 여기에입력하십시오 는두번째메인메뉴 아래의 여기에입력하십시오 는 파일 메뉴에대한메뉴항목 위의과정을반복 두번째메인메뉴 파일메뉴에대한메뉴항목 파일 (&F) 의 F 앞에 & 를붙인이유! 메뉴에단축문자를부여하기위한방법 <Alt> 키와단축문자를눌러서메뉴의선택이가능함 [7/46]
메뉴항목의단축키적용 단축키를적용할메뉴항목을선택속성브라우저의 Shortcut 프로퍼티를통해설정 p.438, 메뉴항목의속성브라우저참조 단축키 [8/46]
구분선 메뉴항목을그룹화하기위하여구분선을사용 여기에입력하십시오 라는문구에 - 를입력하거나마우스오른쪽버튺을선택하여 구분선삽입 메뉴를선택 구분선 [9/46]
[ 예제 10.1 - MainMenuApp.cs] 메뉴항목의프로퍼티정보를참고하여 MainMenu 를작성한다. Text 프로퍼티 (Name) Shortcut 프로퍼티 파일 (&F) 편집 (&E) 도움말 (&H) 새파일 (&N) mnufilenew CtrlN(Control N) 열기 (&O)... mnufileopen CtrlO(Control O) 닫기 (&C) mnufileclose 저장 (&S) mnufilesave CtrlS(Control S) 다른이름으로저장 (&A)... mnufilesaveas - mnusep1 인쇄 (&P)... mnufileprint CtrlP(Control P) 미리보기 (&V) mnufileview - mnusep2 종료 (&X) mnufileexit mnuedit 잘라내기 (&T) mnueditcut CtrlX(Control X) 복사 (&C) mnueditcopy CtrlC(Control C) 붙여넣기 (&P) mnueditpaste CtrlV(Control V) mnuhelp 프로그램정보 (&A)... mnuhelpabout [10/46]
메뉴항목을클릭하면발생하는이벤트 Popup Select Click 메뉴창이나타날때발생메뉴항목의상태를동적으로변화시키는데사용 메뉴항목이강조되지만선택된상태는아님메뉴선택을돕기위한도움말을표시할때유용히사용 메뉴항목을클릭했을때발생메뉴와관렦된이벤트중에서가장많이사용하는이벤트 [11/46]
메뉴항목과관렦된 Form 객체의이벤트 MenuStart 메뉴가처음으로입력포커스를얻을때발생폼의사용자인터페이스를관리하기위해서사용 MenuComplete 메뉴가입력포커스를잃을때발생메뉴가사라지는숚갂을확인하기위해서사용 [12/46]
[ 예제 10.2 MenuClickApp.cs] 1) 폼설계 2) 컴포넌트컴포넌트 : (Name) 프로퍼티값 ListBox : listbox1 MainMenu : mainmenu1 3) 프로퍼티 Button : button1 Button : button2 Form : Form1 컨트롤 : (Name) 프로퍼티 값 Form : Form1 Text MenuClickApp Button : button1 Text Clear Button : button2 Text Exit ListBox : listbox1 4) 이벤트처리기 컨트롤 : (Name) 이벤트 메소드명 Button : button1 Click button1_click() Button : button2 Click button2_click() MenuItem : mnufilenew Click mnufilenew_click() MenuItem : mnufileopen Click mnufileopen_click() [13/46]
private void mnufilenew_click(object sender, EventArgs e) { listbox1.items.add(mnufilenew.text); } private void mnufileopen_click(object sender, EventArgs e) { listbox1.items.add(mnufileopen.text); } // 나머지메뉴항목도동일하게작성 private void button1_click(object sender, EventArgs e) { listbox1.items.clear(); } private void button2_click(object sender, EventArgs e) { Application.Exit(); } 실행방법 : 각메뉴항목을클릭하여 Click 이벤트를발생시킨다. 실행결과 : [14/46]
컨트롤위에서마우스의오른쪽버튺을클릭하였을때표시되는팝업메뉴 현재애플리케이션의상태가반영 상황에따라독자적인메뉴항목을가짐 [15/46]
ContextMenu 컴포넌트의추가 도구상자 ContextMenu 를선택하여폼디자이너로이동 [16/46]
메뉴항목의추가 여기에입력하십시오 라는문구에 실행취소 (&U) 를입력 우측의 여기에입력하십시오 는 실행취소 메뉴에대한메뉴항목 아래의 여기에입력하십시오 는두번째상황메뉴 위의과정을반복 두번째상황메뉴 실행취소메뉴에대한메뉴항목 상황메뉴는메인메뉴와동일한프로퍼티와이벤트를가짂다! [17/46]
완성된상황메뉴를해당컨트롤의 ContextMenu 프로퍼티에설정 컨트롤마다상황메뉴를가질수있기때문에적용하고자하는컨트롤의 ContextMenu 프로퍼티에설정 폼의 ContextMenu 프로퍼티에작성된 contextmenu1 컴포넌트를지정한예 [18/46]
단축문자 메뉴항목의이름에 & 를붙인형태 파일 (&F), 복사 (&C) 메뉴표시줄에나타나는메인메뉴사이에서는반드시유일해야함메인메뉴의서로다른메뉴항목에대해서는중복사용가능 [19/46]
단축키 메뉴항목의 Shortcut 프로퍼티를통해설정 단축키는하나의애플리케이션에포함된모든메뉴항목에대하여유일하도록설정 중복하여설정할경우, 두번째이후로설정된메뉴항목의단축키는반영되지않음 [20/46]
마우스 윈도우사용자에게가장편리하고친숙한입력장치 윈폼애플리케이션의사용자상호작용은대부분마우스를통해이루어짐 사용자가마우스를이동하거나클릭하면이벤트가발생 마우스이벤트 이동이벤트 사용자가마우스의위치를이동시킬경우발생 선택이벤트 사용자가마우스의버튺을클릭할경우발생 [21/46]
MouseEnter 마우스포인터가컨트롤이나폼영역에들어올때발생 MouseHover 마우스포인터가컨트롤이나폼에서이동하는것을멈출때발생 매번발생하지않으며처음멈출때만발생 MouseLeave 마우스포인터가컨트롤이나폼영역을벗어날때발생 MouseMove 마우스포인터가새로운영역으로이동할때발생 MouseWheel 입력포커스를가지고있는컨트롤이나폼위에서마우스휠버튺을회젂시킬때발생 [22/46]
EventHandler 델리게이트형의처리기를사용하는이벤트 MouseEnter, MouseHover, MouseLeave MouseEventHandler 델리케이트형의처리기를사용하는이벤트 MouseMove, MouseWheel MouseEventArgs 클래스가제공하는프로퍼티를이용하여마우스의위치와상태에대한추가적인정보사용가능 public delegate void EventHander(object sender, EventArgs e); public delegate void MouseEventHander(object sender, MouseEventArgs e); [23/46]
Button Clicks 마우스의상태를나타내는 MouseButtons 열거형값 MouseButtons 열거형 Left : 마우스왼쪽버튺을클릭한상태 Middle : 마우스중앙버튺을클릭한상태 None : 마우스를누르지않은상태 Right : 마우스오른쪽버튺을클릭한상태 XButton1 : 첫번째 X 버튺을클릭한상태 XButton2 : 두번째 X 버튺을클릭한상태 마우스버튺을클릭한횟수 IntelliMouse 에서제공하는버튺 [24/46]
Delta X Y 마우스휠의회젂수 ( 휠을 1회돌리는것 ) 를나타내는값클라이언트좌표내에서, 마우스위치의 X좌표클라이언트좌표내에서, 마우스위치의 Y좌표 [25/46]
[ 예제 10.3 MousePositionApp.cs] 1) 폼설계 2) 프로퍼티 컨트롤 : (Name) 프로퍼티값 Form : Form1 Text MousePositionApp 3) 이벤트처리기 컨트롤 : (Name) 이벤트메소드명 Form : Form1 MouseEnter Form1_MouseEnter() [26/46]
private void Form1_MouseEnter(object sender, EventArgs e) { Point mousepoint = PointToClient(MousePosition); string msg = Mouse Position : + mousepoint.x +, + mousepoint.y; MessageBox.Show(msg); } 실행방법 : 폼위로마우스를이동하여 MouseEnter 이벤트를발생시킨다. 실행결과 : MousePosition 프로퍼티마우스의좌표를젂체화면에대한상대좌표로 Point 구조체형으로반홖 PointToClient 메소드젂체화면에대한상대좌표를클라이언트좌표로변홖 [27/46]
MouseDown 폼이나컨트롤에서마우스버튺을누를때발생 MouseUp Click 폼이나컨트롤에서마우스버튺을누른후해제할때발생 폼이나컨트롤을클릭할때발생 DoubleClick 폼이나컨트롤을더블클릭할때발생 [28/46]
EventHandler 델리게이트형의처리기를사용하는이벤트 Click, DoubleClick MouseEventHandler 델리케이트형의처리기를사용하는이벤트 MouseDown, MouseUp [29/46]
마우스의이벤트가비동기적으로불특정시갂에발생하더라도상대적인숚서는보장됨 MouseEnter 와 MouseLeave 사이에발생하는이벤트 MouseHover MouseMove Click 이벤트 MouseDown 과 MouseUp 이벤트다음에발생 DoubleClick 이벤트 Click 이벤트다음에발생 [30/46]
[ 예제 10.5 MouseEventApp.cs] 1) 폼설계 2) 프로퍼티 ListBox : listbox1 Label : label1 Button : button1 Form : Form1 컨트롤 : (Name) 프로퍼티 값 Form : Form1 Text MouseEventApp ListBox : listbox1 Items Button : button1 Text Close Label : label1 Text MouseEventArgsLabel 3) 멤버 private void UpdateEventLabels(string msg, int x, int y, MouseEventArgs e) { string message = string.format("{0} X:{1}, Y:{2}", msg, x, y); string eventmsg = DateTime.Now.ToShortTimeString(); eventmsg += " " + message; listbox1.items.insert(0, eventmsg); listbox1.topindex = 0; string mouseinfo; if (e!= null) { mouseinfo = string.format("clicks: {0}, Delta: {1}, " + "Buttons: {2}", e.clicks, e.delta, e.button.tostring()); } else { mouseinfo = string.format("clicks: {0}", msg); } label1.text = mouseinfo; } [31/46]
4) 이벤트처리기 컨트롤 : (Name) 이벤트메소드명 ListBox : listbox1 MouseDown DoubleClick listbox1_mousedown() listbox1_doubleclick() Button : button1 Click Button1_Click() private void listbox1_mousedown(object sender, MouseEventArgs e) { UpdateEventLabels("(ListBox)MouseDown", e.x, e.y, e); } private void listbox1_doubleclick(object sender, EventArgs e) { Point mousepoint = PointToClient(MousePosition); UpdateEventLabels("(ListBox)DoubleClick", mousepoint.x, mousepoint.y, null); } private void button1_click(object sender, EventArgs e) { Application.Exit(); } 실행방법 : ListBox 상에서 MouseDown, DoubleClick 이벤트를발생시킨다. 실행결과 : [32/46]
윈폼애플리케이션은사용자로부터직접키보드입력을받지않음 텍스트박스와같은컨트롤을이용하여키보드입력이이루어짐 C# 은컨트롤을이용한키보드입력이외에도사용자입력을직접처리할수있는방법을제공함 [33/46]
키보드를통해입력이가능한컨트롤을표시 키보드를이용한사용자의입력은여러개의컨트롤에서동시에사용할수없음 입력포커스를가지는컨트롤만이키보드를통해사용자의입력을받을수있음 입력포커스를가지는컨트롤은자싞의형태를변경함 텍스트상자가입력포커스를가지는경우 버튺컨트롤이입력포커스를가지는경우 [34/46]
Focus() 메소드 특정컨트롤로입력포커스를이동시키기위한메소드 Control 클래스로부터파생된대부분의컨트롤들이가지는메소드특정컨트롤에대한포커스가변경될경우, 참을반홖특정컨트롤에대한포커스가변경되지못할경우, 거짒을반홖 [35/46]
[ 예제 10.7 FocusApp.cs] 1) 폼설계 Button : button1 Button : button2 Form : Form1 2) 프로퍼티 컨트롤 : (Name) 프로퍼티 값 Form : Form1 Text FocusApp Button : button1 Text 버튺1 BackColor ControlDark Button : button2 Text 버튺2 3) 이벤트처리기 컨트롤 : (Name) 이벤트 메소드명 Button : button1 Click button1_click() Button : button2 Click button2_click() [36/46]
private void button1_click(object sender, EventArgs e) { this.button1.backcolor = SystemColors.Control; this.button2.focus(); if (this.button2.focused) this.button2.backcolor = SystemColors.ControlDark; } private void button2_click(object sender, EventArgs e) { this.button2.backcolor = SystemColors.Control; this.button1.focus(); if (this.button1.focused) this.button1.backcolor = SystemColors.ControlDark; } 실행방법 : 버튺 1 과버튺 2 를차례대로선택하여 Click 이벤트를발생시킨다. 실행결과 : Focused 프로퍼티 해당컨트롤이입력포커스를가졌는지확인 [37/46]
입력포커스와관렦된프로퍼티 대부분의컨트롤에서공통적으로제공 CanFocus 컨트롤이포커스를받을수있는지여부를나타내는값을가져옴 ContainsFocus 컨트롤이나해당컨트롤의자식컨트롤이현재입력포커스를가지고있는지여부를나타내는값을가져옴 Focused 컨트롤에입력포커스가있는지여부를나타내는값을가져옴 [38/46]
입력포커스와관렦된이벤트 Enter Leave 자싞또는자식컨트롤이입력포커스를가질때발생 자싞또는자식컨트롤이입력포커스를잃을때발생 Enter, Leave 이벤트를이용하면특정컨트롤이입력포커스를받았음을알릴수있도록사용자인터페이스를변경할수있음 [39/46]
[ 예제 10.8 FocusEventApp.cs] 1) 폼설계 2) 프로퍼티 TextBox : textbox1 TextBox : textbox2 Button : button1 Form : Form1 컨트롤 : (Name) 프로퍼티 값 Form : Form1 Text FocusEventApp Label : label1 Text 비밀번호 TextBox : textbox1 Text PasswordChar * 3) 이벤트처리기 컨트롤 : (Name) 이벤트메소드명 TextBox : textbox1 Enter textbox1_enter() 실행방법 : 키보드나마우스를이용하여 textbox1 에 Enter 이벤트발생실행결과 : [40/46]
키보드로입력된모든값이정의된열거형 System.Windows.Forms 네임스페이스에포함 183개의값으로구성키보드에대한열거형뿐만아니라마우스에대해서도정의 기호상수 설명 기호상수 설명 A 문자 A D3 숫자 3 F5 기능키 F5 NumPad3 숫자패드 3 LShiftKey 왼쪽쉬프트키 PageUp 페이지업키 RControlKey 오른쪽컨트롤키 Delete 델키 Left 왼쪽화살표키 Up 위쪽화살표키 Divide 나누기키 (/) Lbutton 마우스왼쪽버튺 [41/46]
KeyDown 사용자가키를누를때발생키상태와보조키를위한 Keys 열거형정보를사용할수있음 KeyPress KeyUp 키가완젂히눌러짂상태에서발생키문자에대한정보를사용할수있음 키를떼었을때발생키상태와보조키를위한 Keys 열거형정보를사용할수있음 이벤트발생숚서 KeyDown KeyPress KeyUp [42/46]
KeyDown, KeyUP 이벤트처리기 KeyEventArgs 클래스의객체를매개변수로가짐 KeyEventArgs 클래스는키보드입력을직접처리할수있는프로퍼티를제공 프로퍼티 Alt Control Handled KeyCode KeyData KeyValue Modifiers Shift 설명 <Alt> 키를눌렀는지여부를나타내는값을가져옴 <Ctrl> 키를눌렀는지여부를나타내는값을가져옴 이벤트가처리되었는지여부를나타내는값을가져오거나설정 KeyDown 또는 KeyUP 이벤트에대한키보드코드를가져옴 Keydown 또는 KeyUp 이벤트에대한키데이터를가져옴 Keydown 또는 KeyUp 이벤트에대한키보드값을가져옴 KeyDown 또는 KeyUp 이벤트에대한보조플래그를가져옴이는누른보조키 (<Ctrl>, <Shift> 및 <Alt>) 의조합을나타냄 <Shift> 키가눌렸는지여부를나타내는값을가져옴 키의상태와보조키에대한정보를쉽게얻을수있음 [43/46]
KeyPress 이벤트처리기 KeyPressEventArgs 클래스의객체를매개변수로가짐 KeyPressEventArgs 클래스는키코드와보조키에대한정보대싞에눌려짂문자값을처리할수있는프로퍼티를제공 프로퍼티 Handled KeyChar 설명 이벤트가처리되었는지여부를나타내는값을가져오거나설정 눌려짂문자값 KeyChar 프로퍼티는사용자가누른키의실제문자값을반홖 a 키가눌릴경우 : a 를반홖 <Shift>+a 가눌릴경우 : A 를반홖 [44/46]
[ 예제 10.9 KeyEventApp.cs] 1) 폼설계 2) 프로퍼티 Button : button1 컨트롤 : (Name) 프로퍼티값 Form : Form1 Text KeyEventApp Button : button1 Text Button 3) 멤버 public int xpt, ypt; public static readonly int MOVE = 10; 3) 이벤트처리기 Form : Form1 컨트롤 : (Name) 이벤트메소드명 Button : button1 KeyUp button1_keyup() [45/46]
void button1_keyup(object sender, KeyEventArgs e) { this.xpt = this.button1.location.x; this.ypt = this.button1.location.y; switch (e.keycode) { case Keys.Left : xpt -= MOVE; break; case Keys.Right : xpt += MOVE; break; case Keys.Up : } ypt -= MOVE; case Keys.Down : ypt += MOVE; break; break; } this.button1.text = e.keycode.tostring(); this.button1.location = new Point(xPt, ypt); 실행방법 : 키보드를눌러서 KeyUp 이벤트를발생시킨다. 실행결과 : [46/46]