본문 바로가기

C#

[C# Form] GDI+와 비트맵 이미지 Form 프로그램에서는 그래픽을 GDI+(Graphics Device Interface)를 사용한다. 그래서 원을 하나 그린다면, Graphics g = panel1.CreateGraphics(); // panel1에서 그래픽을 사용할 때 g.DrawEllipse(pen, rect); // rect는 원이 내접하는 Rectangle 객체 g.FillEllipse(Brushes.Black, rect); 와 같이 사용한다. 이와 함께 이미지 파일을 비트맵으로 그려주는 DrawImage() 함수를 많이 사용한다. Bitmap bmp = new Bitmap("../../Images/xxx.png"); g.DrawImage(bmp, rect);또는 다음과 같이 한 줄로 사용할 수 있다.g.DrawImage(new.. 더보기
[C# Form] 간단한 디지털 시계 그림과 같이 간단한 디지털 시계를 WinForm으로 만들어 보자 lable1에 현재의 시간을 기록하게 하면 된다. 시간을 처리하기 위해 Timer 콘트롤을 사용한다. 주의할 점은 WPF에서는 Timer를 쓸 수 없고 DispatcherTimer를 쓴다는 점이다. 또, DispatcherTimer를 사용하기 위해서 using System.Windows.Threading; 를 추가해야 한다. 폰트는 디자이너에서 수정했다. Form의 가운데에 글씨가 나타나게 하려면 Form의 ClientSize를 참조해야 한다. 또한 Label의 Size는 글자가 들어가야 나오므로 현재 시간을 넣어 주고 크기를 계산하도록 한다. 코드는 다음과 같다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 .. 더보기
StackPanel of StackPanels StackPanel 안에 다른 StackPanel이 포함될 수 있다. 다음 그림과 같이 30개의 버튼이 있는 프로그램을 만들어보자. 이 프로그램은 10개씩의 버튼을 자식으로 갖고 있는 StackPanel 3개를 포함하는 StackPanel로 만들수 있을 것이다. 즉, 다음 그림과 같이 colStack 3개를 자식으로 갖는 mainStack을 만들고, 각각의 colStack에는 10개의 Button을 자식으로 포함시키면 된다. mainStack의 Orientation은 Horizontal, colStack의 Orientation은 default인 Vertical 이 된다. 소스코드는 다음과 같다. Button에 이름을 부여하기 위해서 39번째 줄 btn.Name = "Button" + (10*i+j).To.. 더보기
Grid Panel 두번째 패널 콘트롤로 Grid 콘트롤을 알아보자. Grid 콘트롤은 격자형태로 칸을 나누어 각각의 칸에 하나씩의 콘트롤을 배치할 수 있게 한다. 우선 다음과 같이 아이디와 패스워드를 체크할 수 있는 윈도우를 만들어보자. (0,0) (0,1) (1,0) (1,1) (2,0) (2,1) 이 프로그램은 2개의 Label, 2개의 TextBox, 1개의 버튼으로 구성된다. 5개의 콘트롤들은 그림과 같은 Grid에 배치된다. Grid의 각각의 공간은 (row, column)으로 번호가 주어진다. 먼저, 프로그램을 gridTest 클래스로 구현해보자. Grid콘트롤 grid를 생성하고, 3행 2열의 공간을 만들어 리턴해주는 함수를 CreateGrid()라고 하면, 이는 다음과 같다. // 그리드의 행과 열을 지정하.. 더보기
패널 콘트롤 Content 에는 하나의 콘트롤 밖에 붙일 수 없다. 만일 다음과 같이 여러개의 콘트롤 들이 포함된 윈도우를 만들기 위해서는 패널(Panel) 콘트롤을 사용한다. 패널은 자신은 보여지지 않지만, 여러개의 콘트롤들을 자식으로 포함할 수 있다. 패널에는 StackPanel, DockPanel, Grid 가 있다. StackPanel StackPanel을 이용하면 콘트롤들을 한 방향으로 차곡차곡 쌓을 수 있다. 정렬방향은 Default로 수직방향이며, Orientation을 Horizontal로 바꾸어주면 수평방향으로 위치시킬 수 있다. 우선 다섯개의 버튼을 수직으로 배치해보자. // 생성자 public controlTest() { Title = "Control Test"; Width = 400; Heigh.. 더보기
콘트롤의 처리 윈도우 프로그램은 GUI(Graphical User Interface) 프로그램이다. GUI 객체는 "사용자와 프로그램 사이에 정보교환을 위한 시각적 요소를 갖고 있는 객체"라고 할 수 있으며, 우리가 윈도우 프로그램에서 익히 보아왔던 Label, TextBox, Button 등을 얘기한다. 이렇게 시각적 요소를 가지고 있는 객체를 콘트롤(Control)이라 부른다. 콘트롤을 사용하려면 using System.Windows.Controls; 을 삽입해야 한다. 콘트롤은 많은 프로퍼티(속성)을 갖고 있는데, 프로퍼티는 콘트롤 마다 서로 다르다. 이중 Content 라는 프로퍼티는 많은 콘트롤들이 공통으로 갖고 있는데 말 그대로 내용물이라는 뜻이다. A와 B가 콘트롤이라고 할 때, A.Content = B;.. 더보기
Event Handler 2 Event Handler 예제에서 마우스 버튼이 눌렸을 때의 좌표를 출력했었는데, 이번에는 마우스버튼이 눌렸을 때와 눌렀다가 놓았을 때의 이벤트를 같이 처리해보자. 눌렸을 때의 이벤트는 MouseDown, 놓았을 때의 이벤트는 MouseUp 이다. 두 이벤트를 처리하는 이벤트핸들러 함수는 하나로 처리하기로 하자. 이 함수의 이름은 myWindow_MouseHandler로 하겠다. BeeEye 드무 더보기
Event Handler 마우스를 움직이거나 클릭할 때, 키보드가 눌렸을 때 등 사용자의 입력에 따라 이벤트가 발생한다. 특정 이벤트가 발생하는 것에 따라 자동으로 호출되어 실행되는 함수를 이벤트 처리함수 또는 이벤트 핸들러(Event Handler)라고 한다. 아래의 예는 윈도우 창에서 마우스가 눌려졌을 때 그것이 왼쪽 버튼인지 오른쪽 버튼인지와 마우스가 눌려진 좌표를 콘솔 창에 출력해주는 프로그램이다. 마우스가 눌려졌을 때 처리되는 이벤트는 MouseDown 이벤트이다. 이를 처리하는 함수가 MouseDownHandler 이다. myWindow() 생성자 함수에서 이벤트 처리함수를 등록한다. 다음 그림과 같이 MouseDown+= 까지 입력하고 Tab을 누르면 이벤트처리함수를 자동으로 입력해준다. (물론 이벤트처리함수의 이름.. 더보기
상속에 의한 윈도우 생성 앞의 예에서, Main()은 static이어야 하고 Main()함수에서 호출되는 CreateWindow() 함수도 static이어야 한다고 했다. static 함수에서 호출해야 하는 함수가 static이어야 한다면, 앞으로 만드는 모든 함수가 static이어야 한단 말인가... 이를 해결하기 위해서 새로운 class인 MyWindow를 만들어서 사용하도록 한다. MyWindow 클래스에서 Window 클래스를 상속하고 객체가 만들어질 때 수행되는 생성자 함수에서 윈도우의 Title, Width, Height 등의 속성을 지정하도록 한다. 18번째 줄에 있는 class MyWindow : Window 는 MyWindow 클래스가 Window 클래스를 상속한다는 것을 정의한다. 21번째 줄의 public M.. 더보기
Window 객체 생성함수 사용하기 앞의 프로그램에서는 Main() 함수에 모든 일을 다 처리했으나, 이는 바람직 하지 않다. Main()함수는 최대한 간략하게 하여 전체 프로그램의 골격을 볼 수 있게 하는 것이 좋다. 다음과 같이 Main() 에서 CreateWindow()라는 함수(메소드)를 호출하게 하면 훨씬 간단한 Main()이 된다. 여기서 CreateWindow()는 Window 객체를 return 하는 함수이다. 또한 CreateWindow()가 static이어야 하는 이유는 Main()이 static 이기 때문이다. 참고로 class 안에서 생성되는 함수는 별도로 public 이라고 써주기 전에는 default로 private 가 된다. using System; using System.Windows; namespace Cod.. 더보기