C# FontStyle Bold,Italic,Strikeout,Underline 보존된 채로 상태 변경

반응형

C#에서 FontStyle이 여러개 적용되어 있는 경우에

상태를 변경하려 할때

다양한 경우의 수가 발생하게 됩니다.


예를 들어 

다음과 같이 텍스트에 Bold와 Underline이 적용된 채로

글자 크기를 변경하려 할 때나

밑줄은 유지한 채로 굵기를 보통으로 바꾸려할 때와 같은 

다양한 경우를 고려해야 하는데요.


먼저 경우의 수를 살펴보면,

상태가 하나씩 적용된 

일반 상태(Regular), Bold(굵게), Italic(기울임), Strikeout(중심줄긋기), Underline(밑줄)

총 5가지 경우와


일반상태를 제외한 총 4가지 상태 중 2개가 섞인 경우

4C2 = 6가지


4가지 상태에서 3개가 섞인 경우

4C3 = 4가지


그리고 4가지 상태가 다 섞인 경우

4C4 =1가지

해서 5+6+4+1 총 16가지의 경우가 있습니다.



 if (richtextBox_content.SelectionFont.Bold && richtextBox.SelectionFont.Italic)

이렇게 조건문을 달아서 처리해도 되지만

코드가 너무 길어지는 것을 방지하기 위해

숫자의 소수(素數)를 이용하여 switch문으로 처리할 수 있습니다.


Bold를 적용/미적용 할 경우를 예로 들면,

숫자1은 Regular로, 소수 2,3,5,7은 각 4가지 Bold, Italic,Strikeout,Underline으로 보고

Bold일 경우 클릭 시 굵기가 보통이 되어야 하니

1을 number변수에 넣고 굵기가 보통일 경우 2를 변수에 넣어서

동시에 Italic일 경우 3을 곱해주고,

그다음에 Strikeout일 경우 5를 곱하고,

그다음에 Underline일 경우 7을 곱합니다.


소수들을 곱하였기 때문에 곱한 값이 다양한 경우의 수에도 유일하므로

16가지의 case에 따라 FontStyle을 결정지어 줄 수 있습니다.


코드는 아래와 같습니다.

  private void setbold_MouseClick(object sender, MouseEventArgs e)

        {

            int number = 1; 

            number = richtext.SelectionFont.Bold ? 1 : 2;

            number *= richtext.SelectionFont.Italic ? 3 : 1;

            number *= richtext.SelectionFont.Strikeout ? 5 : 1;

            number *= richtext.SelectionFont.Underline ? 7 : 1;


            switch (number)

            {

                case 1: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Regular); break;

                case 2: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Bold); break;

                case 3: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Italic); break;

                case 5: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Strikeout); break;

                case 7: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Underline); break;


                case 6: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Bold | FontStyle.Italic); break;

                case 10: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Bold | FontStyle.Strikeout); break;

                case 14: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Bold | FontStyle.Underline); break;

                case 15: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Italic | FontStyle.Strikeout); break;

                case 21: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Italic | FontStyle.Underline); break;

                case 35: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Strikeout | FontStyle.Underline); break;


                case 30: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Bold | FontStyle.Italic | FontStyle.Strikeout); break;

                case 42: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Bold | FontStyle.Italic | FontStyle.Underline); break;

                case 70: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Bold | FontStyle.Strikeout | FontStyle.Underline); break;

                case 105: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Italic | FontStyle.Strikeout | FontStyle.Underline); break;


                case 210: richtext.SelectionFont = new Font(richtext.SelectionFont, FontStyle.Bold | FontStyle.Italic | FontStyle.Strikeout | FontStyle.Underline); break;


            }


        }

반응형