[C# 윈폼] C# 화면 깜빡임, 버벅거림(렉걸림) 해결하는 방법, DoubleBuffer 사용


안녕하세요.

 

오늘은 C# 윈폼에서 화면 깜박임, 혹은 윈폼 프로젝트를 개발해서 실행시키시다 보면 버벅거림(렉걸림) 현상이 나타나게 되는데요.

 

이러한 현상을 조금이나마 완화? 시켜줄 수 있는 방법에 대해서 알려드리려고 합니다.


 

저는 테스트 시나리오를 다음과 같이 구성하였습니다.

 

1.   TableLayoutPanel 컨트롤을 제일 아랫단에 배치

2.   TableLayoutPanel 컨트롤 3개의 행 설정

3.   첫 번째 행에는 “Hide Condition” 버튼 컨트롤 추가

4.   두 번째 행에는 FlowLayoutPanel 배치 후, 그 안에 여러 개의 Button 배치

5.   마지막으로, Hide Condition 버튼을 클릭할 시, 2번째 행의 여러 버튼들이 사라지게 하고, 다시 Hide Condition 버튼을 클릭할 시 버튼들이 다시 보이게 끔

 

위와 같은 시나리오 대로 한번 예제 코드를 작성해 보도록 하겠습니다.

 

윈폼 프로젝트 생성 및 컨트롤 배치



이제 예제 코드를 작성해서 이 프로젝트에서 화면 컨트롤 바뀜에도 불구하고 최대한 버벅거림? 현상이 덜 되도록 예제 코드를 작성해 보도록 하겠습니다.

 

예제 코드


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

 

namespace DoubleBufferTest

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

 

            this.uiBtn_ShowMainCondition.Click += uiBtn_ShowMainCondition_Click;

        }

 

        /// <summary>

        /// 윈폼 모든 컨트롤 더블 버퍼링 핸들 

        /// 이로 인해화면 그려지는거 부드러워짐

        /// (정확한 이유는 모름...)

        /// </summary>

        protected override CreateParams CreateParams

        {

            get

            {

                var cp = base.CreateParams;

                cp.ExStyle |= 0x02000000// Turn on WS_EX_COMPOSITED

                return cp;

            }

        }

 

 

        /// <summary>

        /// 버튼 클릭 이벤트 핸들러

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        public void uiBtn_ShowMainCondition_Click(object sender, EventArgs e)

        {

            Button btn = sender as Button;

 

            if (btn.Text == "Show Condition")

            {

                HideSearchCondition(btn); //Search Option 숨기기

            }

            else

            {

                ShowSearchCondition(btn); //Search Option 보여주기

            }

        }

 

        /// <summary>

        /// Search Option 숨기기

        /// </summary>

        /// <param name="btn"></param>

        private void HideSearchCondition(Button btn)

        {

            uiTlp_Main.RowStyles[1].Height = 100

            btn.Text = "Hide Condition";

            btn.ForeColor = Color.Red;

        }

 

        /// <summary>

        /// Search Option 보여주기

        /// </summary>

        /// <param name="btn"></param>

        private void ShowSearchCondition(Button btn)

        {

            //uiTpl_Main_Height = uiTlp_Main.RowStyles[1].Height;

            uiTlp_Main.RowStyles[1].Height = 0;

            btn.Text = "Show Condition";

            btn.ForeColor = Color.Blue;

        }

    }

}

 

Colored by Color Scripter

cs

 

실행 결과



 

어떠신가요? 버튼 클릭을 하였을 때 화면들이 부드럽게 바뀐다는 느낌이 들지 않으신가요?ㅋㅋ

 

바로 CreateParams 를 이용해서 핸들을 다뤄서 윈폼에서 버벅거림 현상을 줄이도록 해보았습니다..

 

사실, 저도 이게 정확히 어떤 원리로 화면 버벅거림이 없어지는지는 모르겠으나..확실히 있고 없고의 차이는 크게 느껴지더라구요!ㅎㅎ

 

참고해 주시면 좋을 듯 합니다.^^

 

감사합니다.


728x90

이 글을 공유하기

댓글(4)

  • ㅇㅇㅇ
    2021.10.06 11:37

    내용복사 못하게 막아놓은거 극협이네요..
    어차피 퍼갈사람은 다 퍼가는데

    • 2021.10.06 11:39 신고

      복붙하면 실력 안느니까 한번씩 따라하세요ㅋㅋ

    • 2021.11.03 13:15

      남의 지식을 내용 복사만 해갈려고 하는 뻔뻔한 사람을 보니까 극협이네요..
      어차피 배우고자 할 사람은 복붙이 아니더라도 알아서 배울텐데

  • 조조범범
    2021.11.24 15:01

    어짜피 이글도 어느 책에서 배껴온것아닌가요?

Designed by JB FACTORY