C# Timer를 이용한 Image 업데이트 picturebox image버퍼

안녕하세요. C# 프로젝트를 실행하여 실시간 화면이 갱신되는 프로그램을 만들어 보겠어요. 

간단히 텍스트를 그려주는데 picturebox의 image에 그림을 그려 업데이트를 해줄 예정이에요. 

 

도구상자 timer

도구 상자에서 Timer를 추가합니다. 

윈도우폼

picturebox를 추가하고 흰색으로 변경해 놓았어요. 

배경색

소스로 가서 아래 내용을 추가합니다. 

  public Form1()
        {
            InitializeComponent();
            this.StartPosition = FormStartPosition.Manual;
            Rectangle fullScrenn_bounds = Rectangle.Empty;
            foreach (var screen in Screen.AllScreens)
            {
                fullScrenn_bounds = Rectangle.Union(fullScrenn_bounds, screen.Bounds);
            }
            this.ClientSize = new Size(fullScrenn_bounds.Width, fullScrenn_bounds.Height);
            this.Location = new Point(fullScrenn_bounds.Left, fullScrenn_bounds.Top);

           pictureBox1.Size = new System.Drawing.Size(ClientSize.Width, ClientSize.Height);
           this.timer1.Start();
           this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
           pictureBox1.Image = new Bitmap(ClientSize.Width, ClientSize.Height);
           switch_time = 0;
        }

그럼 전체 화면으로 실행되는 그림박스를 만날 수 있어요. 

String draw_text="가동준비중";        
long switch_time=1;

두변수는 전역으로 일단 선언해 놓을게요. 

 private void timer1_Tick(object sender, EventArgs e)
        {
            switch_time = switch_time - my_util.gaptime();
            
            if (switch_time<0)
            {
                draw_text = "가동준비중";
            }
            else 
            {

            }
            
            draw_screen();
        }

timer1_tick 함수를 하나 만들어 두세요. myutil_.gaptime이 필요한데 내용은 별 내용 없습니다. 밀리세컨드를 이용해서 이전 그리기와 현재 그리기의 시간차를 구해오는 함수인데요. 내용은 아래와 같아요. 

public long gaptime()
        {
            DateTime TimeNow = DateTime.Now;
            long currenttime = TimeNow.Ticks/ TimeSpan.TicksPerMillisecond;
            if (oldtime==0)
            {
                oldtime = currenttime;
                return 0;
            }
            gapTime = currenttime - oldtime;
            Console.WriteLine("gapTime>" + gapTime);
            Console.WriteLine("oldtime>" + oldtime);
            Console.WriteLine("currenttime>" + currenttime);
            oldtime = currenttime;
            return gapTime;
        }

그리고 아래 변수를 보세요.

 long gapTime;
 long oldtime=0;

이걸 클래스내 전역으로 선언해 놓았어요. 

그리고 그리기 함수인데요.

private void draw_screen()
        {
            BufferedGraphicsContext currentContext;
            BufferedGraphics myBuffer;
            currentContext = BufferedGraphicsManager.Current;
            if (pictureBox1.Image == null)
            {
                return;
            }
            myBuffer = currentContext.Allocate(Graphics.FromImage(pictureBox1.Image), pictureBox1.DisplayRectangle);
            Rectangle ee = pictureBox1.ClientRectangle;
            //배경색 정리
            System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.White);
            myBuffer.Graphics.FillRectangle(ee, myBrush);
            Font drawFont = new Font("Arial", 150);
            SolidBrush drawBrush = new SolidBrush(Color.Black);
            StringFormat drawFormat = new StringFormat();
            float x = 150.0F;
            float y = 50.0F;
            //텍스트 출력
           myBuffer.Graphics.DrawString(draw_text, drawFont, drawBrush, x, y, drawFormat);
            myBuffer.Render();
            myBuffer.Dispose();
            pictureBox1.Invalidate();
        }

텍스트가 입력이 없을 때 가동 준비 중이라는 기본 텍스트가 화면에 출력됩니다.

텍스트가 입력이 될 때 코드에 

switch_time = 10000L; 스위치 타임에 10초의 시간을 넣었어요.

그럼 입력된 텍스트를 draw_text에 넣어서 출력을 해주고 10초 뒤 다시 준비 중이라는 글씨를 화면에 출력하게 되고요.

버퍼는 더블 버퍼를 이용한 방법인데요 이방식을 하는 건 화면 떨림 현상을 없애기 위해서 이렇게 처리해요. 

픽처 박스 image에 바로 그리게 되면 수정이 될 때마다 invalidate이벤트가 발생되어 눈이 엄청 피곤한 갱신 화면을 볼 수 있어요. 

 

'C#' 카테고리의 다른 글

ChromeDriver Chrome 용 WebDriver  (0) 2020.06.01
c# mysql maria db connect 연동  (0) 2020.04.22
c# hello word c# 시작 MessageBox.Show  (1) 2020.03.09
C# String 문자열 자르기 Substring 사용법  (0) 2020.03.05
c# EXCEL 파일 읽기  (2) 2020.02.25
블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

c# hello word c# 시작 MessageBox.Show

새 프로젝트를 만들기

프로그래밍의 시작 HELLO WORLD를 출력해볼게요.

콘솔창에 찍을수도 있지만 메세지 박스를 이용해 출력하는 형태로 만들어 볼게요.

일단 새프로젝트 만들기를 선택하세요.

WINDOWS FORMS 앱

선택 항목에 윈도우 폼 앱 이라고 보일거에요. 

FORM1

폼이 보일거에요. 

왼쪽에 보시면 도구상자 라고 보일거에요. 도구상자를 눌러서 BUTTON을 추가 해요. 

BUTTON

버턴을 추가하고 적당한 위치시켜요. 오른쪽 하단 속성에 보면 Text 라고 보여요 화면에 보이는 text를 수정하는 화면이에요.

저는 hello_world라고 수정했어요. 

그리고 버튼을 더블 클릭해요. 

헬로우월드 소스

버튼클릭으로 소스가 넘어오는데 아무것도 입력이 안되어 있어요. 

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello world","설명척척");
        }

MessageBox.Show("hello world", "설명척척");

이라고 입력하고 실행을 해요. 

그럼 폼에서 디자인한 모습 그대로 화면에 나오는데요. 

버튼을 누르면 이렇게 화면창에 떠요. 

hello world

이렇게 hello world에 대해서 정리해 보았습니다. 

MessageBox에 대해서 아래의 레퍼런스를 참고 하시면 다양하게 활용가능합니다. 

https://docs.microsoft.com/ko-kr/dotnet/api/system.windows.forms.messagebox?view=netframework-4.8

 

MessageBox 클래스 (System.Windows.Forms)

 

사용자에게 메시지를 보여 주는 메시지 창을 표시합니다. 이 창을 대화 상자라고도 합니다.Displays a me

docs.microsoft.com

이상입니다.

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

문자열 준비합니다. 

String m_value = "0123456789";

순서를 직관적으로 보기 위해서 숫자로 준비했습니다. 

            Console.WriteLine("(0, 1) " + m_value.Substring(0, 1));
            Console.WriteLine("(0, 0) " + m_value.Substring(0, 0));
            Console.WriteLine("(1, 2) " + m_value.Substring(1, 2));
            Console.WriteLine("(1, 1) " + m_value.Substring(1, 1));
            Console.WriteLine("(2, 3) " + m_value.Substring(2, 3));
            Console.WriteLine("(2, 1) " + m_value.Substring(2, 1));

결과는 순서대로 입니다. 

(0, 1) 0
(0, 0) 
(1, 2) 12
(1, 1) 1
(2, 3) 234
(2, 1) 2

이상입니다.

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,