[C# 강좌 - 42] WIndow Form - 4 구조체 , 모달과 모달리스


Study/C#  2012. 10. 16. 09:00

안녕하세요 명월입니다.


이번 포스팅에서는 Form 클래스의 구조체에 대해서 알아보도록 하겠습니다. 솔직히 이번 포스팅에서 하는 부분은 모두 MSDN에 있는 부분이니 자주 사용하는 구조체는 무엇무엇이 있구나 하는 정도로 이해하고 넘어가시면 될 듯 싶습니다.

 

Window 폼의 구조체 타입의 값들은 보통 클래스와 다른 점은 값을 반영하면 바로 적용이된다는 점입니다. 그 이유는 3번의 걸쳐서 이야기를 하는 Window form 메시지 루프 이기 때문입니다. 즉, 구조체의 값을 바꾸면 다시 그려질때 그 값으로 그려지기에 사람의 눈으로 보기에는 마치 이벤트처럼 동적으로 움직이는 것 처럼 보이는 것입니다.

 

제가 왜 이 메시지 루프를 강조하느냐 하면 이 개념이 확실히 잡혀 있어야 GDI를 할때 이해하기 편해지기 때문입니다.

 

자 그럼 가장 많이 쓰이는 구조체부터 알아보도록 하겠습니다.

MSDN - Form 클래스 바로가기

 

 

 

자주 사용되는 구조체를 표시하여 보았습니다. 그럼 설명보다는 예제로 알아보도록 하겠습니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace Blog20121015
{
    class Program : Form
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Show();
            Application.Run();
        }
        public Program() 
        {
            this.Load += new EventHandler(Program_Load);           
        }
        public void Program_Load(object sender, EventArgs e)
        {
            this.Size = new Size(500, 500);
            this.Text = "명월";
            this.Location = new Point(0, 0);
            this.MaximizeBox = false;
            this.MinimizeBox = false;
        }
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            Application.Exit();
        }
    }
}

 

 구조체로 최소화 버튼, 최대화 버튼, 그리고 텍스트 박스 크기와 위치, 라벨을 바꾸어 보았습니다.

 

구조체는 여기까지 알아보고 Form의 모달과 모달리스에 대해서 알아보도록하겠습니다.

모달과 모달리스의 방식차이는 포커스에 차이입니다. 모달은 윈도우가 또다른 윈도우를 호출할때 비활성화를 사용할 수 있는 방식이고 모달리스는 또다른 윈도우를 호출해도 포커스에 영향이 없는 것을 뜻합니다.

 

우리가 이 차이를 볼 수 있는 큰 차이는 내가 무언가를 저장하거나 열때, 하물려 이 익스플로러 창의 파일에서 열기 버튼을 누르면 새로운 윈도우가 나오면서 열리 Dialog 가 나오는데 그때 그 Dialog를 호출한 창은 포커스를 잃게 되는 형식입니다.

모달리스는 우리가 포토샵을 열때 보면 도구툴이 많이 있는 것이 보이는데 이 때 본 윈도우에서 도구차을 오픈하여도 포커스를 잃지 않고 독립적인 형태를 띕니다.

 

C#에서는 모달은 ShowDialog 함수를 써서 선언하고 모달리스는 Show 함수를 써서 나타낼 수 있습니다. 역시 설명보다는 예제로 살펴보겠습니다.

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace Blog20121015
{
    class Program : Form
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Show();
            Application.Run();
        }
        public Program()
        {
            this.Load += new EventHandler(Program_Load);
            this.KeyDown += new KeyEventHandler(Program_KeyDown);
        }

        void Program_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Left)
            {
                Form f = new Form();
                f.ShowDialog();
            }
            else if (e.KeyCode == Keys.Right)
            {
                Form f = new Form();
                f.Show();
            }
        }

        public void Program_Load(object sender, EventArgs e)
        {
            this.Size = new Size(500, 500);
            this.Text = "명월";
            //this.Location = new Point(0, 0);
            this.MaximizeBox = false;
            this.MinimizeBox = false;
        }
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            Application.Exit();
        }
    }
}


 

 

 

이미지 상으로는 큰 차이가 없어 보이나 실제 코딩하여 확인 하시면 확실히 아실 수 있습니다.

 

참조 소스 :  Blog20121015.zip