레이블이 #시샵인 게시물을 표시합니다. 모든 게시물 표시
레이블이 #시샵인 게시물을 표시합니다. 모든 게시물 표시

2021년 11월 6일 토요일

C# 윈폼, Form클래스 속성

 C# 윈폼, Form클래스 속성

 

8-3. C# 윈폼(Form클래스)


C# 프로그램이 윈도우 응용프로그램이 되기 위해서는 Form 클래스를 상속받아서 정의되어야 한다. Form 클래스는 운영체제가 보내는 메시지 중 일부 메시지에 대해 이벤트를 구현하고 있는데 사용자가 윈도우 폼에서 왼쪽 마우스를 클릭하면 WM_LBUTTONDOWN 메시지가 Form객체로 전달되고 Form 객체는 이에 대해 MouseDown 이벤트를 발생시킨다.


윈폼 응용프로그램을 작성하는 경우 이전 예제처럼 직접 윈도우 메시지를 처리하는 경우는 드물다. 왜냐하면 Form을 비롯한 윈도우와 각종 컨트롤들이 윈도우 메시지를 포장하여 이벤트로 구현해 놓았기 때문이다. 프로그래머는 단지 정의되어 있는 이벤트에 이벤트처리 메소드를 등록시키기만 하면 된다.


class OnjForm : Form {

      //이벤트 처리 메서드, sender : 이벤트가 발생한 객체, 여기서는 Form, 

      //MouseEventArgs는 Button(마우스의 어떤 버튼인지), Clicks(클릭한 횟수)

      //Delta(휠위 회전방햔과 거리), X(X좌표), Y(Y좌표)값을 가진다.

      private void mousedown (Object sender, System.Windows.Forms.MouseEventArgs e) {

       MessageBox.Show (“안녕~”);

      }

      public OnjForm() {

             //Mousedown 이벤트에 MouseEventHandler 델리게이트를 통해 mousedown 메소드를 MouseDown 이벤트 처리 메소드로 등록한다.

             this.Mousedown += new System.Windows.Forms.MouseEventHandler(this.mousedown);

      }

}


//MouseDown 이벤트 선언

public event MouseEventHandler MouseDown;


//MouseEventHandler 델리게이트 선언

public delegate void MouseEventHandler (object sender, MouseEventArgs e);



 

using System;

using System.Windows.Forms;

 

class Program : Form

    {

        public void MouseHandler(object sender, MouseEventArgs e)

        {

            Console.WriteLine("Sender : " + ((Form)sender).Text);

            Console.WriteLine("Sender : " + ((Form)sender).Name);

            Console.WriteLine("X:{0}, Y:{1}", e.X, e.Y);

            Console.WriteLine("Button:{0}, Clicks:{1}", e.Button, e.Clicks);

        }

        public Program(String title)

        {

            this.Text = title;

            this.Name = "윈폼";

            //MouseDown 이벤트 처리기 등록

            this.MouseDown += new MouseEventHandler(MouseHandler);

        }

        static void Main(string[] args)

        {

            Application.Run( new Program("마우스 이벤트 예제"));            

        }

    }

 

[결과]

Sender : 마우스 이벤트 예제

Sender : 윈폼

X:122, Y:50

Button:Left, Clicks:1

 



8-4. C# 윈폼(Form클래스 – 속성)


Form 클래스는 윈도우 모양을 결정짓는 크기, 배경색, 전경색, 투명도, 제목, 이름, 폰트 등 여러 속성을 가지고 있다.


Width : 창의너비, Height : 창 높이, BackColor : 배경색, BackgroudImage : 윈도우 배경이미지

Opacity : 투명도(0.00~1.00, 1:완전불투명, 0 : 완전투명), MaxmizeBox : 최대화 버튼 표시 여부

MinimizeBox : 최소화 버튼 표시 여부

Text : 창의 제목, Name : 윈도우 이름


using System;

using System.Drawing;

using System.Windows.Forms;

 

namespace ConsoleApplication9

{   

    class Program : Form

    {

        Random r;

        public Program()

        {

            r = new Random();

            this.MouseWheel += new MouseEventHandler(OnjMouseWheel);

            this.MouseDown += new MouseEventHandler(OnjMouseDown);

        }

 

//마우스 다운 이벤트 처리 메소드

        void OnjMouseDown(object sender, MouseEventArgs e)

        {

            //촤측 마우스 버튼 클릭이면

            if (e.Button == MouseButtons.Left)

            {

                //최대화, 최소화 버튼 보이기

                this.MaximizeBox = true;

                this.MinimizeBox = true;

                Color oldcolor = this.BackColor;

                //배경색을 임의의 색으로 변경

                this.BackColor = Color.FromArgb(r.Next(0, 255),

                                                r.Next(0, 255),

                                                r.Next(0, 255));

            }

            //우측 마우스 버튼 클릭이면

            if (e.Button == MouseButtons.Right)

            {

                //최대화, 최소화 버튼 숨기기

                this.MaximizeBox = false;

                this.MinimizeBox = false;

            }

        }

 

//마우스 휠 이벤트 처리 메소드

        void OnjMouseWheel(object sender, MouseEventArgs e)

        {

            //마우스휠 움직이는 것에 따라 윈도우 투명도 조절

            this.Opacity = this.Opacity + (e.Delta > 0 ? 0.1 : -0.1);

            Console.WriteLine("Opacity : {0}", this.Opacity);

        }

        static void Main(string[] args)

        {

            Application.Run(new Program());

        }

    }

}

#FORM클래스, #속성, #시샵, #닷넷교육 

2020년 7월 22일 수요일

1-6. C# 자료형(Value Type, Reference Type)

1-6. C# 자료형(Value Type, Reference Type)

http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=382

C#의 데이터 타입은 실제 그 값을 가지고 있는 Value-Type과 가지고 있는 것이 값이 아니고 무언가를 참조하는 변수(C언어의 포인터 변수)인 Reference-Type 두 가지로 구분한다.

CTS

CTS는 닷넷 프레임워크에서 동작하는 모든 프로그래밍 언어(C#, VB.Net, J#)들이 똑같은 데이터형식을 사용하도록 해주는 것이다. (System.Int32라는 클래스는 CTS에서 제공하는 int형인데 이것은 닷넷의 어떠한 개발언어에서도 사용이 가능하다.)

모든 데이터형식들은 기본적으로 객체에서 파생되었으며 Value-Type은 객체 형식을 포장 (sealing)해 놓은 개념이다.

Value-Type, Reference-Type

Value-Type

CTS 에서는 value type과 reference type 을 지원하는데 value type 변수들은 데이터를 직접 가지고 있다. 예를 들어 int i=10 이라고 쓰면 변수 i에는 10이 직접 들어 있는 것이다. int j=i 라고 하면 i의 값이 j에 복사되어 들어 가는 것이다. Value-Type은 Built-in Type과 User-Defined Type 두 가지가 있는데 int, long, float, double 등은 Built-in Type이고 struct, enum 등은 User-Defined ㅍValue Type이다.

기본 제공 데이터 형식 중 string 데이터 형식은 예외적으로 참조 형식이다.

Value-Type은 스택에 할당된 메모리에 값을 저장하는데 아래 경우에는 스택영역에 4바이트 공간을 확보 후 100이 저장된다.

void Sum {

int i = 100;

……

}

i 변수가 정의된 Sum메소드의 실행이 종료되어 변수가 범위를 벗어나면 값이 스택에서 삭제된다.

즉 스택을 사용하면 효율적이고 성능 상 장점도 있지만 값 형식의 수명이 제한되므로 서로 다른 클래스 간에 데이터를 공유하는 데는 적합하지 않다.

[정수형]

sbyte System.Sbyte 8 -128~127

byte System.Byte 8 0~255

short System.Int16 16 -32,768~32,767

ushort System.UInt16 16 0~65,535

int System.Int32 32 -2,147,483,648 ~2,147,483,647

uint Systen.UInt32 32 0~4,294,967,295

long System.Int64 64 -(2^63) ~ 2^63-1

ulong System.UInt64 64 0~ 2^64-1

[실수형]

float System.Single 32 1.5x10^-46 ~3.4x10^38

double System.Double 64 5.0x10^-324 ~1.7x10^308

decimal System.Decimal 128 1.0x10^-28 ~7.9x10^28

기타

char System.UInt16 16 유니코드 1 자

bool System.Int32 1 0 또는 1

[Boolean형]

boolean type이 가질 수 있는 값은 true와 false 예) bool b = true --> true 는 1 과는 다르며 마찬가지로 false는 0과는 다르다. (C 에서는 TRUE, FALSE를 #define을 통해 정의하여 사용했었는데 이는 정수를 암묵적으로 boolean형으로 사용한 것이다.) true와 false로 산술 연산을 할 수 없으며 오로지 논리 연산자를 가진 수식에 대해서만 사용 가능하다.

[Value Type의 초기화]

- 로컬변수는 반드시 초기화가 되어야 한다.

int onj; //로컬변수로 선언되었다면 이 변수는 사용 전 반드시 초기화 돼야 한다.

onj = new int(); // Invoke default constructor for int type.

onj = 0; // Assign an initial value, 0 in this example.

위 두 문장은 같은 결과를 나타내며 다음처럼 한 줄로 표시하면 된다.

int onj = 0;

Reference-Type

데이터를 직접 저장하는 것이 아니라 레퍼런스(참조값)를 저장한다.(Store references to their data) 그러므로 두 개의 레퍼런스형 변수는 같은 데이터(오브젝트)를 가리키는 것이 가능하다.( Two reference variables can reference same object). 물론 같은 것을 서로 참조할 수 있으므로 한 쪽에서 변경을 하면 다른 쪽에서 변경을 안 했더라도 나중에 값을 꺼내 보면 바뀌어져 있다.(Operations on one can affect another)

클래스 또는 배열의 인스턴스와 같은 참조 형식은 힙(Heap)이라는 다른 메모리 영역에 할당된다. 아래 예문에서는 배열을 구성하는 5개의 정수에 필요한 공간이 힙에 할당된다.

void Sum {

int[] numbers = new int[5];

……

}

이때 힙에 할당된 메모리는 메소드가 종료 되더라도 힙에 반환되지 않으며, C#의 가비지 수집 시스템에서 이 메모리가 더 이상 필요하지 않다고 판단할 때에만 회수된다. 참조 형식을 선언하면 오버헤드가 커지지만 참조 형식은 다른 클래스에서 액세스할 수 있다는 장점이 있다.

[Reference Type 예제]

using System;

namespace ConsoleApplication1

{

class Rtype

{

public object Value;

}

class Program

{

static void Main(string[] args)

{

Rtype a = new Rtype ();

Rtype b = new Rtype ();

a.Value = 1; b = a; //a가 참조하는 것을 b도 참조한다.

Console.WriteLine(a.Value); Console.WriteLine(b.Value);

b.Value = 2;

Console.WriteLine(a.Value); Console.WriteLine(b.Value);

}

}

}

[결과]

1

1

2

2

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...