시간이 흐름에 따라 계속해서 값을 변경시켜줘야 하는 경우 Timer 클래스를 이용할 수 있다.


[그림 1]


Timer를 처음 생성하면 기본적으로 Enabled가 False로 되어있어 동작하지 않는다.

그렇기에 따로 Enabled속성을 true로 바꿔주어야 한다.


Timer엔 Tick이라는 EventHandler가 있다. 

이 Tick을 이용해 실시간으로 이벤트를 발생시킬 수 있는것.


예를 들어 DateTime을 이용해 현재 시간을 실시간 출력하고자 할때


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private void Form1_Load(object sender, EventArgs e)
{
    string strMsg = String.Empty;
    strMsg = String.Format("{0}년\r\n{1}월\r\n{2}일\r\n" + "{3}시\r\n{4}분\r\n{5}초\r\n",
        DateTime.Now.Year,
        DateTime.Now.Month,
        DateTime.Now.Day,
        DateTime.Now.Hour,
        DateTime.Now.Minute,
        DateTime.Now.Second);
    this.textBox1.Text = strMsg;
 
    // 또는 아래와 같은 방식으로도 표현 할 수 있다.
    // StringBuilder 클래스 사용 <- 긴 문자열 처리할 때
    System.Text.StringBuilder sb = new StringBuilder();
    sb.Append("현재시간\r\n");
    sb.Append(DateTime.Now.Year.ToString() + "년");
    sb.AppendFormat("\r\n{0}월", DateTime.Now.Month);
    sb.AppendFormat("{0}{1}일 {2}""\r\n", DateTime.Now.Day, "\r\n");
    sb.AppendFormat("{0}시 {1}분 {2}초", DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
    this.textBox1.Text = sb.ToString();
}
 
private void timer1_Tick(object sender, EventArgs e)
{
    this.Form1_Load(nullnull);
}
cs

[코드 1]


[코드 1]을 보면 Form_Load 이벤트에서 DateTime의 형식을 지정해 textBox로 출력해준다.

그리고 Timer의 Tick 이벤트가 동작하면 Form_Load 이벤트를 동작시킨다.


Tick 이벤트는 Timer의 Interval 속성에 지정된 빈도값(밀리초)마다 동작한다. 1초는 1000밀리초다.

반응형


16년 8월 6일부터 12일까지 갔던 오사카 여행 먹거리




[사진 1]

숙소 근처 골목거리 식장에 메뉴 선전용으로 걸려있던 음식모형들.. 대규모 손님을 겨냥한건가 싶다.



[사진 2]

경단 대가족은 말끔히 뱃속으로 사라졌습니다.



[사진 3]

빈곤 여행객의 선택1 회전초밥



[사진 4]

무려 아이스크림 자판기가 있다.



[사진 5]

한글로 오사카 맛집 검색하면 항상 나온다던 그곳.


[사진 6]

맛은 그냥 괜찮았던듯..?



[사진 7]

거대 게


[사진 8]

거대 스시


[사진 9]

거대 문어

거대한 무언가로 자신들의 아이덴티티를 강조하고 있다.



[사진 10]

친구의 추천으로 갔던 "진한" 라멘집


[사진 11]

추천했던 친구는 이 일로 10년정도 구박받을 것이다(?)


p.s. 사실 평점은 높은걸 보아 이런걸 즐기는 분들에겐 호평을 받는듯 하지만... 개인적으론 불호였다. 기름이 좀 과다기름



[사진 12]

빈곤 여행객의 선택2 패밀리 레스토랑?


[사진 13]

간단히


[사진 14]

먹었다.

드링크바가 무료인줄알고 마실려했다가 큰일날뻔



[사진 15]

이것은


[사진 16]

먹음직스럽게


[사진 17]

찍힌


[사진 18]

뭐더라


[사진 19]

일단 맛있게 먹었었다.



[사진 20]

무려 무인 편의점



[사진 21]

모찌를 모찌모찌하게 모찌해버렸다.



[사진 22]

빈곤 여행객의 선택3 롯데리아

배고픔을 참지못하고 치즈버거를 시켜먹었던 친구의 슬픈 손이다.



[사진 23]

이곳은


[사진 24]

정말 맛있게 먹은 라멘집


[사진 25]

옆에서 볶음밥 먹은 친구는 볶음밥이 그렇게 맛있다고 놀랐다.


[사진 26]

맛있었기에 간판도 찍어놨다. 읽지는 못한다.



[사진 27]

지하상가? 쪽에서 먹었던 돈까스. 나름 괜찮았던거 같기도..



[사진 28]

빈곤 여행객의 선택4 간식으로 때우기


[사진 29]

라곤 하지만 빵들도 엄청 맛있어 뵈는게 많다


[사진 30]

에그타르트에


[사진 31]

고로케


[사진 32]

차이나 타운에서 먹은 얼음딸기빙수까지

특이 이 얼음딸기빙수는 무더위 속에서 먹었어서 그런지 정말 맛있게 먹었다.



[사진 33]

차이나 타운에서 줄까지 서서 먹은 만두


[사진 34]

일본여행가서 차이나타운 가는 멋진 여행코스



[사진 35]

일본이면 스시가 유명하죠


[사진 36]

스시


[사진 37]

깈초밥이 뭘까?¿



[사진 38]

길축제에서 사먹은 것


[사진 39]

꼬치구이도 팔았다.


[사진 40]

맛있어보인다.



[사진 41]

이후 어딘가 고깃집


[사진 42]

여기도 줄서서 들어갔는데 양이 적어서 미묘했다.


반응형

'PHOTO' 카테고리의 다른 글

제작년 갔던 일본여행 사진[feat.오사카]  (0) 2018.05.17
병원 다녀오던 길  (0) 2018.04.19


16년 8월 6일부터 12일까지 다녀왔던 오사카 여행 사진 몇장




[사진 1]


[사진 2]


[사진 3]

Hotel Zoo라는 곳에서 숙박을 했었는데 웬걸 최근 구글맵에 업데이트된 사진을 봤더니 철거된 상태였다... 꽤 깨끗하고 좋았는데 무슨일이 있었는지..


[사진 4]

숙소 근처 골목거리에 있던 식당


[사진 5]

오사카성에서 발견한 투명한건물(?)


[사진 6]

저 위에 새를 올려둘 생각을 하다니 하고 감탄했었다. 덕분에 위에 걸터앉거나 하진 못하지만..


[사진 7]

그림의 떡같은 존재였던 인형


[사진 8]

신사를 올라가던 중 만난 고양이


[사진 9]

신사를 내려가던 중 만난 까마귀..?


[사진 10]

기념품점에서 발견한 완전 귀여운 고양이..모양.. 친구가 하나 샀었다.


[사진 11]

온천을 향한 전철행에서 때마침 한칸이 완전 비어 찍을 수 있었던 사진


[사진 12]

느닷없이 발견한 활기찬 선인장


[사진 13]

마침 온천 근처에서 축제같은걸 하길래 들렸었다


[사진 14]

자전거가 활용이 높은 나라답게 길가에서 쉽게보이는 자전거들..


[사진 15]

그.. 유명한 다리 위에서 우연히 보게된 아이돌?의 공연 나중에 찾아보니 동물을 컨셉으로 활동하는 듯..


[사진 16]

게임장에서 마리오를 뵈었다.


[사진 17]

축제길에 나서면 머리큰 아져씨도 나타난다.


[사진 18]

축제길 한복판 왜인지 놓여있던 테드들..


[사진 19]

돈키호테의 앞


[사진 20]

그 앞에서 발견한 물에 뜨지 않는 캔음료..


[사진 21]

숙소로 돌아가던 길 뵈었던 버스킹 아져씨.. 노래를 정말 잘부르셨다.


[사진 22]

뜬금없는 골목사진

반응형

'PHOTO' 카테고리의 다른 글

제작년 갔던 일본여행 음식 사진(feat.오사카)  (0) 2018.05.17
병원 다녀오던 길  (0) 2018.04.19



DateTimePicker는 날짜를 표시, 선택할 수 있게 만들어진 클래스다.


[그림 1]


[그림 2]


날짜와 시간을 표시하는 방식은 4가지로 나눌 수 있는데

Long , Short , Time , Custom 이 그것이다.


Long


1
this.dateTimePicker1.Format = DateTimePickerFormat.Long;
cs

[코드 1]

[코드 1]처럼 DateTimePicker의 Format 속성을 Long으로 설정해주면

[그림 3]

[그림 3]과 같이 년, 월, 일, 요일이 모두 표시된다.


Short


1
this.dateTimePicker1.Format = DateTimePickerFormat.Short;
cs

[코드 2]

마찬가지로 [코드 2]처럼 Format 속성을 Short로 설정해주면

[그림 4]

[그림 4]와 같이 년, 월, 일이 간단하게 표시된다.


Time


1
this.dateTimePicker1.Format = DateTimePickerFormat.Time;
cs

[코드 3]

Time은 단어에서 알 수 있듯 시간을 표시할 때 사용한다.

[그림 5]


Custom


1
2
3
this.dateTimePicker1.Format = DateTimePickerFormat.Custom;
//형식 지정
this.dateTimePicker1.CustomFormat = "yy년 MM월 dd일(ddd)";
cs

[코드 4]

Custom또한 이름에서 알 수 있듯이 표시될 형식을 직접 커스텀 할 때 사용한다.

[코드 4]와 같이Format 속성을 Custom으로 설정한 뒤 CustomFormat 속성을 따로 지정해 준다.

[그림 6]

[코드 4]에 CustomFormat 속성에 지정된 yy년 mm월 dd일(요일) 형식으로 [그림 6]에 표시된것을 볼 수 있다.

ddd는 요일을 가리키며 년도를 4자리로 표현하려면 "yyyy년"으로 쓰면 된다.




날짜 데이터를 원하는 형식으로 불러와 출력하려 할 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void button1_Click(object sender, EventArgs e)
        {
            string strMsg = String.Empty;
            switch (Flag)
            {
                case 1 :
                    strMsg = String.Format(
                "배송 예정일은 {0}입니다."this.dateTimePicker1.Value.ToLongDateString()); 
                    break;
                case 2 :
                    strMsg = String.Format(
                "배송 예정일은 {0}입니다."this.dateTimePicker1.Value.ToShortDateString()); 
                    break;
                case 3 :
                    strMsg = String.Format(
                "배송 예정일은 {0}입니다."this.dateTimePicker1.Value.ToLongTimeString()); 
                    break;
                case 4 :
                    strMsg = String.Format(
                "배송 예정일은 {0}년 {1}월 {2}일({3})입니다."this.dateTimePicker1.Value.Year, 
                        this.dateTimePicker1.Value.Month, this.dateTimePicker1.Value.Day, 
                        this.dateTimePicker1.Value.DayOfWeek); 
                    break;
            }
            MessageBox.Show(strMsg, "배송 예정일", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
cs

[코드 5]


[코드 5]와 같이 String으로 불러와 사용할 수 있다. 하지만 표시되는 Format 속성이 바뀌어도 Value 값에 영향을 주는건 아니기에 값을 불러올때의 형식을 따로 지정해줘야 한다.

Format 속성의 Long과 같은 형식으로 가져오려면 ToLongDateString()

Short와 같은 형식으로 가져오려면 ToShortDateString()

Time과 같은 형식으로 가져오려면 ToLongTimeString()으로 설정하면 되지만

Custom의 경우 맞는 형식이 따로 존재하지 않기에 [코드 5]와 같이 직접 설정해줘야 할 듯 싶다.

반응형




얼마전에 검진받으러 아산병원 다녀오던 길에 찍은 사진 몇장...





병원으로 들어가는 다리에 잔뜩 묶여있던 글들

얼마전 뉴스로 봤던 간호사 자살 사건이 아산병원이었나보다.





아무쪼록 잘 해결됐으면 좋겠다.




반응형

모달과 모달리스는 둘 다 우리가 컴퓨터를 이용하며 자주 접하던 기능이지만 이름만 들으면 이게 대체 뭐지? 하고 생각할 수 있다. 둘의 이름에서 서로 상반되는 기능을 할 것이라는건 추측할 수 있겠지만 이름만으론 무슨 기능을 할지 감이 잘 안잡히기 때문이다. 


모달, 모달리스는 윈도우에 Form이나 Dialog를 띄울 때 표시되는 방법 중 하나라 볼 수 있다.


모달(Modal)로 표시된 대화상자는 해당 대화상자가 종료되기 전에 그 대화상자를 띄운 애플리케이션으로 돌아갈 수 없는 대화상자를 의미한다. 반대로 모달리스(Modeless) 혹은 논 모달(Non-Modal)로 표시된 대화상자는 그 대화상자가 종료되지 않더라도 그 대화상자를 띄운 애플리케이션으로 돌아갈 수 있는 대화상자를 의미한다.


모달 대화상자는 현재의 대화상자가 종료되기 전엔 부모 단계로 돌아가지 못한다. 이것은 마치 반복문 내에 반복문이 또 하나 있을 때와 유사하다. 실제로 모달 대화상자를 생성하는 ShowDialog() 메서드는 Application.RunDialog()를 호출하여 새로운 메시지 루프를 생성한다. 기존 메인 스레드의 메인 루프에서 새로운 메시지 루프를 생성해 종료되기 전까진 메인 루프가 멈춰있는 것과 같은 효과를 내는것이라 생각한다.

모달리스 대화상자는 새로운 스레드를 생성하지도 새로운 메시지 루프를 생성하지도 않는다. 생성된 모달리스 대화상자는 부모폼과 Owner관계로 연결되며 메인 스레드의 메인 메시지 루프가 모달리스 대화상자를 처리하는 것이다.


프로그램 내에서의 동작을 생각해보면 순차지향적으로 동작하는 모달 대화상자가 설계하기에 쉬울것이라 짐작할 수 있다. 만약 데이터가 대화상자간 이동하는 상황에서 모달리스로 대화상자를 띄우면 데이터가 제대로 전달되지 못할 수 있기때문이다.


■모달 대화상자 띄우는 법


1
2
3
4
//Form2 인스턴스 생성
Form2 udf = new Form2();
 
udf.ShowDialog();//모달 폼
cs


■모달리스 대화상자 띄우는 법


1
2
3
4
//Form2 인스턴스 생성
Form2 udf = new Form2();
 
udf.Show();//모달리스 폼
cs


모달 대화상자는 애플리케이션 모달 대화상자와 시스템 모달 대화상자로 구분지을 수 있다. 


애플리케이션 모달 대화상자는 해당 대화상자를 띄운 애플리케이션으로는 돌아가지 못하지만 다른 애플리케이션으로는 돌아갈 수 있는 대화상자이다. 흔히 모달 대화상자의 예시로 볼 수 있는 도움말같은 정보를 보여줄 뿐인 messagebox같은 경우가 이에 속한다 할 수 있다.


시스템 모달 대화상자는 윈도우 운영체제에서 사용하는 대화상자로 치명적인 문제가 생겨 그 문제를 해결하지 않으면 더 이상 작업을 할 수 없을 때 사용된다.

반응형

그룹박스의 안에 만들어진 컨트롤에 접근하려면 Controls 메소드를 이용


groupBox.Controls[/*컨트롤의 인덱스 값*/]


와 같이 접근할 수 있다. 하지만 각 컨트롤이 몇번째 인덱스인지 햇갈릴 수 있는데 이 경우 Designer.cs에서 확인하면 된다.



예를 들어 위와같이 그룹 박스 안에 버튼 두개를 만들었다. 그리고 각 버튼의 Text값을 가져오려 한다.

그러려면 각 버튼이 그룹박스의 몇번째 컨트롤인지 확인해야 한다. Designer.cs의 groupBox에 대해 정의된 곳으로 가보면


1
2
3
4
5
6
7
8
9
10
11
// 
// groupBox1
// 
this.groupBox1.Controls.Add(this.방가워여);
this.groupBox1.Controls.Add(this.안뇽하세여);
this.groupBox1.Location = new System.Drawing.Point(4456);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(200100);
this.groupBox1.TabIndex = 0;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "그룹 박스";
cs


위와 같이 생성되어있다. 여기서 Controls.Add로 추가된 컨트롤들을 보자.

각 컨트롤의 인덱스 값이 몇인지는 나와있지 않지만 대충 코드가 순차적으로 진행된다는 것을 인지하면 가장 첫번째로 만나는 컨트롤에게 인덱스 0번이 부여될 것이라 추측해볼 수 있다.


컨트롤을 드래그 앤 드롭으로 그룹 박스 내에 생성시키면 Designer에는 자동으로 위로 쌓아가며 코드가 추가되기에 만약 별다른 수정을 거치지 않는다면 가장 마지막에 넣은 컨트롤이 인덱스 0번을 갖게 되는 것이다.


아래는 별다른 수정을 거치지 않고 컨트롤의 Text에 접근해 본 것이다.


1
2
3
4
5
6
7
8
9
private void 안뇽하세여_Click(object sender, EventArgs e)
{
    textBox1.Text = groupBox1.Controls[1].Text;
}
 
private void 방가워여_Click(object sender, EventArgs e)
{
    textBox1.Text = groupBox1.Controls[0].Text;
}
cs


마지막에 추가하여 groupBox1의 가장 위쪽에 정의된 "방가워여" 버튼이 Controls[0] 으로 접근 가능한 것을 볼 수 있다.

반응형

폼을 디자인 하던 중 현재 폼에서 다음 폼으로 넘어가는 동작을 구현해 보고 싶어져서 시도해 봤었다.


단순히 새로운 폼을 띄우는 방법은 간단하다. Form2라는 폼을 불러오고 싶으면 아래와 같이 해주면 된다.

1
2
3
Form2 showForm = new Form2();
 
showForm.Show();
cs


하지만 다음 폼을 띄워도 이전 폼이 남아있으면 다음으로 넘어간 느낌이 들지 않을테니 이전 폼을 꺼주는 동작을 추가해줘야 한다.  이를 위해 처음 사용해 본 방법은 Visible 속성을 이용한 방법이었다.



Visible 이용.


Visible 속성은 해당 컨트롤과 그 자식 컨트롤들을 표시해줄지를 설정하는 속성이다. 기본값은 true로 되어 있다.

말하자면 현재 켜져있는 폼의 Visible 속성을 false로 줌으로써 화면상에 표시되지 않도록 하고 다음 폼을 불러오는 것이다.

1
2
3
4
5
this.Visible = false;
 
Form3 showForm = new Form3();
 
showForm.Show();
cs


이렇게 하면 별 문제 없이 다음 폼으로 넘어가는 동작을 만들 수 있다. 

여기서 이전 폼으로 다시 돌아가는 동작을 하려면 두 폼간에 데이터 교환이 가능하거나 둘의 관계가 Owner 관계가 되어있으면 된다.


1
2
3
4
5
6
7
8
9



1
2
3
4
5
6
7
Form1.cs
 
Form2 frm = new Form2();
private void Next_button_Click(object sender, EventArgs e)
{
    this.Visible = false;
    frm.Owner = this;
    frm.Show();
}
 
 
 
Form2.cs
 
private void Back_button_Click(object sender, EventArgs e)
{
    this.Visible = false;
    Owner.Show();
}
cs


위와 같이 Form1에서 Form2 인스턴스를 생성시켜줄 때 Form2의 Owner 속성을 현재 폼을 가리키는 this로 주면 Form1에서 Form2를 소유하는 관계로 만들어진다. 그렇게 되면 Form2에서 이전 폼으로 돌아가는 동작을 할 때 자신의 Owner을 Show 시켜주는 것으로 간단히 이전 폼을 나타나게 할 수 있다.



Hide 이용.


같은 효과를 Hide 메소드를 이용해서도 줄 수 있다.

this.Visible = false부분만 아래와 같이 Hide로 바꿔주면 된다.


1
2
//this.Visible = false;
this.Hide();
cs



폼 종료 후 다음 폼 열기.


위 방법들을 사용해보다가 이번엔 이전의 폼은 종료시키고 다음 폼으로 넘어가버리는 동작을 구현해 보았다.


1
2
3
Form2 frm = new Form2();
frm.Show();
this.Close();
cs

Close로 Form1을 종료시키고 Form2로 넘어가는 동작이다. 하지만 이렇게만 해주면 Form1이 종료되면서 생성된 Form2도 함께 종료될 것이다. 그 이유는 Program.cs를 보면 조금 이해가 쉽다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// 해당 응용 프로그램의 주 진입점입니다.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
cs


위 코드가 Program.cs의 내용이다. 위의 Main()을 보면 Application.Run(new Form1()); 라는 부분이 있다.

Form1을 메모리에 할당하여 윈도우 메시지 루프를 실행시켜주는 것이라 볼 수 있는데, 이 때 메모리에 할당된 Form1이 부모스레드로서 동작하고 Form2 등을 자식 스레드를 만들어 해결하고 있는 것이기에 Close로 Form1이 종료되면 생성되었던 Form2도 종료되어 버리는 것이다.


Form1이 할당된 메모리가 종료될 때 자동으로 Form2를 메모리에 할당시켜 주도록 하면 처음 폼이 꺼지면서 다음 폼을 켜주는 동작을 구현할 수 있다. 위의 Main()에 아래와같이 추가해주면 된다.

1
2
3
4
5
6
7
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
    Application.Run(new Form2());
}
cs


이렇게 하면 별도로 Form1에서 Form2를 만들어 보여주는 동작을 하지 않아도 Form1이 Close되면 순차적으로 다음 코드Application.Run(new Form2()); 가 실행되며 Form2를 보여주게 된다.

반응형


폼(Form)?


폼이란 겉으로 드러나는 형태, 즉 사용자가 보게 되는 틀을 말한다. 
컴퓨터에서의 폼이라 하면 우리가 컴퓨터를 이용하며 흔히 접하게 되는 창들(ex | 메모장이나 윈도우 탐색기, 프로그램을 실행할 때 뜨는 창 등)을 통틀어 폼이라고 볼 수 있다. 윈도우 폼은 윈도우 운영체제에서 쓰이는 윈도우 API를 이용한 폼이라고 볼 수 있다.

윈도우 폼은 사용자가 직접적으로 보게되는 인터페이스이기에 사용자가 이용하기 편리하도록 실용적이고 멋있게 디자인 될 필요가 있을 것이다. 하지만 거기에서 끝나면 그냥 껍데기만 만들어진 것에 그친다. 그렇기에 각 부분에 컨트롤을 추가하여 이벤트가 발생할 시 처리할 수 있도록 만들어주면 윈폼 애플리케이션이 되는 것이다.

아래는 Visual Studio 2013을 이용해 간단한 윈폼 애플리케이션을 생성시켜 보는 과정이다.


위의 1 -> 2 -> 3 순으로 새 프로젝트를 생성시키면 아래와 같이 가장 기본적인 윈폼이 만들어진다.


옆의 솔루션 탐색기의 목록을 보면 Form1.cs 클래스 아래에 Designer와 Form1 총 2개의 클래스가 있는걸 볼 수 있다.

이는 코딩의 편의를 위해 Form1클래스를 partial을 이용해 부분클래스로 나눴기 때문인데 둘 중 개발자가 주로 다루게 될 부분은 Form1의 내용이다. Designer에는 폼의 디자인 및 속성과 관련한 코드가 들어가는데 이 코드는 개발자가 직접 추가할 수도 있지만 도구상자나 속성창을 이용해 변경하는 값들이 자동으로 추가되기 때문에 미세한 조정 이외에는 굳이 손댈일이 적기 때문이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
namespace WindowsFormsApplication17
{
    partial class Form1
    {
        /// <summary>
        /// 필수 디자이너 변수입니다.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// 사용 중인 모든 리소스를 정리합니다.
        /// </summary>
        /// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Windows Form 디자이너에서 생성한 코드
 
        /// <summary>
        /// 디자이너 지원에 필요한 메서드입니다.
        /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Text = "Form1";
        }
 
        #endregion
    }
}
 
 
cs

<기본적으로 만들어지는 Designer의 내용>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication17
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}
 
cs

<기본적으로 만들어지는 Form1의 내용>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication17
{
    static class Program
    {
        /// <summary>
        /// 해당 응용 프로그램의 주 진입점입니다.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
 
cs

<기본적으로 만들어지는 Program.cs의 내용>


위 3개가 각 클래스 3개에 자동으로 생성되는 코드다. 

코드를 보면 Program.cs에 응용 프로그램의 시작점인 Main메소드가 있다. Application 클래스의 Run메소드에 윈도우 폼 클래스의 인스턴스를 매개변수로 넘겨주어 호출하면 Main스레드에서 윈도우 메시지 루프를 시작하고 지정된 폼을 보여주게 된다.


Form1클래스 안에 public Form1(){}은 생성자의 역할을 한다. 클래스가 생성될 때 자동으로 실행되는 부분인데 안에 보면 InitializeComponent();가 추가되어 있다. 이는 Designer 클래스에서 찾아볼 수 있는데 폼의 디자인이나 컨트롤 정의들이 모두 이 안에 정의되어 생성된다. 말하자면 폼의 디자인, 컨트롤 등을 초기화 해주는 작업이라 볼 수 있다.


폼의 디자인은 도구상자에 등록되어 있는 각 객체(도구들은 모두 클래스로 만들어져 있다.)들을 드래그 앤 드롭으로 쉽게 디자인 할 수 있게 만들어져 있지만 좀더 세세한 내부 과정을 보고 싶으면 드래그 앤 드롭으로 만들 시 Designer 클래스에 자동으로 추가되는 내용들의 변화를 살펴보며 해보면 도움이 될 듯 하다.


<오른쪽 Form1.cs[디자인]의 폼을 클릭 후 도구 상자를 열면 여러 도구가 나타난다>


반응형

+ Recent posts