닷넷프로그래밍정복 김상형저 가메출판사

 

콘트롤 - 사용자와 직접 통신하는 유저 인터페이스 장치이다. 사용자에게 프로그램의 실행 결과나 현재상태를 보여주기도 하고 사용자로부터 명령이나 옵션을 입력받기도 한다.

가장 흔하고 대표적인 컨트롤이 바로 버튼이다.

 

양방향 편집

속성 창에서 편집하나 코드를 직접 수정하나 결과는 마찬가지이며 한쪽의 편집 결과가 다른 쪽에 즉시 영향을 미친다. 이런 방식을 양방향(Two Way) 편집이라고 하는데 상황에 따라 편리한 쪽을 선택하면 된다.

 

 

값 입력

텍스트 박스 - 키보드로 문자열을 입력받는 컨트롤이다.

정보나 실수를 입력받는 컨트롤은 따로 존재하지 않으며 텍스트 박스로 입력받는다. 수치값을 입력받더라도 키보드로부터 입력되는 모든 정보는 문자열 타입이르모 일단 문자열을 입력받은 후 원하는 타입으로 변환해서 사용해야 한다.

 

리스트 박스는 스스로 이벤트를 처리할수 있는 컨트롤이며 목록만 제공하면 항목들을 그리는 것도 직접처리한다. 그런데 컬렉션 편집기에서 추가할수 잇는 항목은 문자열뿐이므로 리스트박스가 관리하고 그릴수 잇는 항목도 문자열뿐이다. 그러나 리스트 박스가 아닌 오너, 즉 부모가 직접 그리기를 하면 문자열뿐 아니라 그래픽으로 된 내용물을 그릴수 있다.

이런 식으로 오너가 직접 그리기를 수행하는 콘트롤을 오너 드로우(Owner Draw)라고 한다. 리스트 박스뿐만 아니라 대부분의 콘트롤은 DrawMode 프로퍼티로 오너 드로우 방식을 지정한다. 이 프로퍼티가 None이면 오너 드로우 기능을 쓰지 않는 것이고 None이 아니면 부모가 직접 내용물을 그릴수  있도록 DrawItem 이벤트를 보낸다. 오너 드로우는 항목의 높이를 결정하는 방식에 따라 두가지가 있다. DrawMode 프로터티 값은 NMormal과 다음이 있다.

  • OwnerDrawFixed - 항목들의 높이가 모두 일정하다. 항목의 높이는 ItemHeight  프로퍼티로 딱 한번만 지정하면 된다
  • OwnerDrawVariable - 항목의 높이가 개별적으로 모두 다르다. 따라서 프로퍼티로 항목의 높이를 지정할수는 없으며 각 항목에 대해서 MEasureItem이벤트로 질문을 하며 이 이벤트에서 항목의 높이를 결정한다.

항목을 그려야 할떄는 부모에게 DrawItem 이벤트가 전달된다. 항목을 그리는 주체가 부모이므로 리스트 박스는 그리기를 할 때마다 부모에게 이벤트를 보내 어떤 항목을 그려달라는 것을 부탁한다. 이 이벤트의 인수로  DrawITemEventArgs객체가 전다뢴다. 이 객체에는 항목을 그리는데 필요한 정보들이 프로퍼티로 제공되며  ㄸ또 그리기에 필요한 여러가지 메소드로 포함되어 있다. 프로퍼티는 그리기에 필요한 정보들을 전달하므로 모두 읽기 전용이다.

 

ex.

        private DashStyle Dash = DashStyle.Solid;

        public JohnForm()
        {
            InitializeComponent();
        }
        private void JohnForm_Paint(object sender, PaintEventArgs e)
        {
            Pen P = new Pen(Color.Black, 2);
            P.DashStyle = Dash;
            e.Graphics.DrawRectangle(P, 300, 20, 140, 140);
        }
        private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            Pen P = new Pen(Color.Black, 2);
            P.DashStyle = (DashStyle)e.Index;
            e.DrawBackground();
            P.Color = e.ForeColor;
            e.Graphics.DrawLine(P, e.Bounds.Left + 10, e.Bounds.Top + 10,
                e.Bounds.Right - 10, e.Bounds.Top + 10);
            e.DrawFocusRectangle();
        }
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            ListBox L = (ListBox)sender;
            Dash = (DashStyle)L.SelectedIndex;
            Invalidate();
        }

 

콤보박스 - 리스트박와 텍스 박스를 결합한 콘트롤이다. 평소에는 텍스트박스처럼 보이지만 드랍다운을 펼치면 리스트 박스가 열려 목록 중 하나를 고를 수 있다. 리스트 박스와는 달리

목록에 없는 것도 텍스트 박스에 직접 입력해넣을수 있고 필요할때만 드랍다운을 펼치므로 자리를 적게 차지 한다는 이점이 있다. 그러나 드롭 다운을 펼치기 전에는 목록을 볼수 없고 선택을 변경하기 위해 두번 클릭해야 한다는 점이 불편하다.

 

컨트롤의 컬렉션

폼이나 그룹박스, 패널처럼 다른 컨트롤을 자식으로 거느릴수 있는 컨트롤을 컨테이너라고 한다. 컨테이너는 ControlCollection 타입의 Controls 프로퍼티로 자신에게 소속된 컨트롤의 목록을 유지하고 관리한다. CotrolCollection 클래스는 쉽게 말해 콘트롤의 배열인데 목록을 관리하는 메소드와 프로퍼티들이 정의되어 있다.

ex.

 private Button btn;

 

      private void Btn_Click(object sendear, EventArgs e)
        {
            MessageBox.Show("실행 중에 만든 버튼을 클릭했습니다");
        }
        private void JohnForm_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && btn == null)
            {
                btn = new Button();
                btn.Location = new Point(400, 300);
                btn.Size = new Size(150, 25);
                btn.Name = "RunButton";
                btn.Text = "실쟁중에 만든 버튼";
                btn.Click += new EventHandler(Btn_Click);

                Controls.Add(btn);
            }
            else if (e.Button == MouseButtons.Right && btn != null)
            {
               
                //Controls.foreach(Control tmp in Controls.
                Controls.RemoveAt(0);

                btn = null;
            }

 

이 글은 스프링노트에서 작성되었습니다.

by 무위자연 2008. 9. 2. 17:32