2022년 2월 26일 토요일

(동영상)C# 윈폼, Form 클래스 Form 이벤트 처리방법 Form에 컨트롤 올리기 원리

 

(C#동영상)C# 윈폼, Form 클래스  Form 이벤트 처리방법  Form에 컨트롤 올리기 원리, C#학원, WPF학원, 자바학원, 스프링학원

https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-iZCqT52CtVOhmaR6Nd-65M163g9u-&index=6 



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


(동영상)C# 윈폼, Form 클래스 Form 이벤트 처리방법 Form에 컨트롤 올리기 원리

(동영상)C# 윈폼, Form 클래스 Form 이벤트 처리방법 Form에 컨트롤 올리기 원리윈폼, Form 클래스Form 이벤트 처리방법Form에 컨트롤 올리기 원리C# 윈폼(Form클래스)C# 프로그램이 윈도우 응용프로그램이

ojc.asia

https://www.youtube.com/watch?v=xlu8n59OE5U&list=PLxU-iZCqT52CtVOhmaR6Nd-65M163g9u-&index=8 

윈폼, Form 클래스

Form 이벤트 처리방법

Form에 컨트롤 올리기 원리





C# 윈폼(Form클래스)


C# 프로그램이 윈도우 응용프로그램이 되기 위해서는 Form 클래스를 상속받아서 정의되어야 한다. 


또한 Form 클래스는 운영체제가 보내는 메시지 중 일부 메시지에 대해 이벤트를 구현하고 있는데 예를들면, 사용자가 윈도우 폼에서 왼쪽 마우스를 클릭하면 WM_LBUTTONDOWN 메시지가 Form 객체로 전달되고 Form 객체는 이에 대해 MouseDown 이벤트를 발생시킨다.



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


//MouseDown 이벤트 선언

public event MouseEventHandler MouseDown;


//MouseEventHandler 델리게이트 선언

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


class MyForm : Form {

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

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

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

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

       MessageBox.Show (“마우스클릭~”);

      }

      public MyForm() {

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

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

      }

}






[실습]


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





C# 윈폼(Form클래스 – 폼에 컨트롤 올리기)



윈도우 운영체제는 사용자 인터페이스를 위해 메뉴, 콤보 박스, 리스트 뷰, 버튼, 텍스트박스 등과 같은 표준 컨트롤을 제공한다. 닷넷의 윈폼은 이들 표준컨트롤을 윈도우 위에 쉽게 올릴 수 있도록 포장해 두었다.


이번에는 콘솔 프로그램 형태로 직접 컨트롤을 생성해서 폼 위에 올려보자. 다음과 같은 방법으로 하면 된다.


  •  컨트롤의 인스턴스 생성
  •  컨트롤의 프로퍼티(속성) 설정
  •  컨트롤의 이벤트에 이벤트 처리기 등록
  •  폼에 컨트롤 추가


1. 컨트롤의 인스턴스 생성


    WinForm의 모든 컨트롤은 System.Windows.Forms.Control을 상속받아 만든다. 이 형식이 

    모든 윈도우의 컨트롤이 지원해야 하는 그래픽이나, 동작, 이벤트 등을 제공하기 때문에 컨트롤을 상속받는 어떤 클래스라도 윈폼 위에 올려 윈도우 UI를 구성할 수 있다.


    Button button1 = new Button();


2. 컨트롤의 프로퍼티에 값 설정


    button1.Text = “메시지”;

    button1.Left = 50;  

    button1.Top = 50;


3. 컨트롤의 이벤트에 이벤트 처리 메소드 등록


    사용자가 버튼을 클릭하면 메시지 박스를 띄운다.


    button1.Click += (object sender, EventArgs e) =>

                         {

                               MessageBox.Show(“버튼 클릭~”);

                          };

4. 폼에 컨트롤 추가


    Program p = new Program();

    p.Controls.Add(button1);

    Application.Run(  p  );



using System;

using System.Windows.Forms;


namespace ConsoleApplication9

{

    class Program : Form

    {

        static void Main(string[] args)

        {

            Button button1 = new Button();

            button1.Text = "메시지";

            button1.Left = 50;

            button1.Top = 50;

            button1.Click += (object sender, EventArgs e) =>

                         {

                             MessageBox.Show("버튼 클릭~");

                         };

            Button button2 = new Button();

            button2.Text = "종료";

            button2.Left = 150;

            button2.Top = 50;



            button2.Click += (object sender, EventArgs e) =>

            {

                MessageBox.Show("종료됩니다.~");

                Application.Exit();

            };

            Program p = new Program();

            p.Text = "윈폼 버튼 예제";  //윈도우 타이틀

            p.Height = 150;

            p.Controls.Add(button1);

            p.Controls.Add(button2);

            Application.Run(p);

        }

    }

}




#시샵동영상, #윈폼, #Form클래스, #Form이벤트, #컨트롤, #시샵교육, #시샵동영상, #닷넷교육, #닷넷동영상, 시샵동영상, 윈폼, Form클래스, Form이벤트, 컨트롤, 시샵교육, 시샵동영상, 닷넷교육, 닷넷동영상,  

(동영상)C# Thread 쓰레드 동기화 lock구문, Monitor, Mutex, C#교육, WPF교육, C#학원, WPF학원

 (동영상)C# Thread 쓰레드 동기화 lock구문, Monitor, Mutex, C#교육, WPF교육, C#학원, WPF학원


https://www.youtube.com/watch?v=-0lJyIjwl3s&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=27 

https://www.youtube.com/watch?v=q-3lL_FtOgQ&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=28 

https://www.youtube.com/watch?v=0W2_2lKib-I&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=29 


https://www.youtube.com/watch?v=D0siTPkCx3M&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=30 


https://www.youtube.com/watch?v=OYzr_vGPqZc&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=31 

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


(동영상)C# Thread 쓰레드 동기화 lock구문, Monitor, Mutex

(동영상)C# Thread 쓰레드 동기화 lock구문, Monitor, MutexC# Thread쓰레드 동기화lock구문, Monitor, MutexC# 멀티 쓰레드(동기화, lock)멀티쓰레드 환경인 경우 여러 곳에서 같은 객체의 메소드/코드블록을 호출

ojc.asia



C# Thread

쓰레드 동기화

lock구문, Monitor, Mutex







C# 멀티 쓰레드(동기화, lock)


멀티쓰레드 환경인 경우 여러 곳에서 같은 객체의 메소드/코드블록을 호출하는 경우에 예기치 않은 결과가 나타날 수 있다. 어떤 메소드/코드블록의 사용을 한 쓰레드가 끝난 후 다른 쓰레드가 접근하게 하려면 lock 문을 사용 한다. 


lock으로 싼 코드는 한번에 하나의 쓰레드만 접근가능한 임계영역(Critical Section)이 된다.


using System;

using System.Threading;


public class ThreadTest3

{ private object obj = new object();

public void Print(string s) 

{

//lock을 걸어준 구문은 처음 쓰레드가 끝날때 까지 다른 쓰레드가 접근 금지

lock (obj) 

{

for(int i=0; i < 5; i++) 

{

for(int j=0; j < 5; j++) 

{

Thread.Sleep(100);

Console.Write(",");

}


Console.WriteLine("{0} ", s);

}

}

}


public void FirstWork() { Print("F"); }

public void SecondWork() { Print("S"); }

}


class TestMain 

{

[MTAThread]

public static void Main() 

{

ThreadTest3 t = new ThreadTest3();

Thread first = new Thread(new ThreadStart(t.FirstWork));

Thread second = new Thread(new ThreadStart(t.SecondWork));


first.Start();

second.Start();

}

}




C# 멀티 쓰레드(동기화, Monitor)


lock 문 이외에 System.Monitor라는 클래스가 있는데 특정 코드블럭을 배차적으로 락을 걸수 있다. 이 Monitor 클래스에는 임계구간을 진입시 Enter, 나갈때 사용하는 Exit 메소드가 있다. Enter 메소드는 잠금 상황으로, Exit 메소드는 잠금을 해제하는 역할을 한다. 


Monitor 클래스는 Wait(), Pulse() 메소드도 있는데 Wait는 쓰레드를 잠시 대기상태로 만들고 Pulse는 다시 활성화 한다.


앞에서 작성한 예제를 System.Monitor를 이용하는 예문으로 바꿔 보자.


using System;

using System.Threading;


public class ThreadTest3

{

        private object obj = new object();

public void Print(string s) 

{

//Monitor.Enter 구문은 처음 쓰레드가 끝날때 까지 다른 쓰레드가 접근 금지

Monitor.Enter(obj);

for(int i=0; i < 5; i++) 

{

for(int j=0; j < 5; j++) 

{

Thread.Sleep(100);

                                         Console.Write(",");

}

Console.WriteLine("{0} ", s);

}

Monitor.Exit(obj);

}


public void FirstWork() { Print("F"); }

public void SecondWork() { Print("S"); }

}


class TestMain 

{

[MTAThread]

public static void Main() 

{

ThreadTest3 t = new ThreadTest3();

Thread first = new Thread(new ThreadStart(t.FirstWork));

Thread second = new Thread(new ThreadStart(t.SecondWork));


first.Start(); second.Start();

}

}



C# 멀티 쓰레드(동기화, Mutex)


뮤텍스(Mutex) 클래스는 공유 리소스에 대해 하나의 쓰레드만이 사용 가능하도록 지원하는데 작동방식이 Monitor 클래스와 유사하고 특정 코드 블럭, 임계구간(Critiacal Section)을 서로 다른 프로세스간 배타적으로 Locking하는 기능을 가지고 있다. 이와는 달리 모니터(Monitor) 클래스는 하나의 프로세스 안에서만 사용할 수 있다.


using System;

using System.Threading;


public class ThreadTest3

{

     private static Mutex mutex = new Mutex();


    public void Print(string s)

    {

        //WaitOne을 걸어준 구문은 처음 쓰레드가 끝날때 까지 다른 쓰레드가 접근 금지

        mutex.WaitOne();

        for (int i = 0; i < 5; i++)

        {

            for (int j = 0; j < 5; j++)

            {

                Thread.Sleep(100); 

                Console.Write(",");

            }

            Console.WriteLine("{0} ", s);

        }

        mutex.ReleaseMutex();

    }


    public void FirstWork() { Print("F"); }

    public void SecondWork() { Print("S"); }

}


class TestMain

{

    [MTAThread]

    public static void Main()

    {

        ThreadTest3 t = new ThreadTest3();

        Thread first = new Thread(new ThreadStart(t.FirstWork));

        Thread second = new Thread(new ThreadStart(t.SecondWork));


        first.Start();   second.Start();

    }

}


#Thread, #시샵쓰레드, #시샵동영상, #쓰레드동기화, #lock, #Monitor, #Mutex, #시샵교육, #닷넷교육, #닷넷학원, #시샵학원, #시샵Thread, Thread, 시샵쓰레드, 시샵동영상, 쓰레드동기화, lock, Monitor, Mutex, 시샵교육, 닷넷교육, 닷넷학원, 시샵학원, 시샵Thread,  

(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...