첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.

728x90
반응형
728x170

TestProject.zip
다운로드

▶ MainForm.cs

using System;
using System.Drawing;
using System.Drawing.Text;
using System.Windows.Forms;

namespace TestProject
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : Form
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainForm()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            this.pictureBox.Resize += pictureBox_Resize;
            this.pictureBox.Paint  += pictureBox_Paint;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Private
        //////////////////////////////////////////////////////////////////////////////// Event

        #region 픽처 박스 크기 변경시 처리하기 - pictureBox_Resize(sender, e)

        /// <summary>
        /// 픽처 박스 크기 변경시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void pictureBox_Resize(object sender, EventArgs e)
        {
            this.pictureBox.Refresh();
        }

        #endregion
        #region 픽처 박스 페인트시 처리하기 - pictureBox_Paint(sender, e)

        /// <summary>
        /// 픽처 박스 페인트시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void pictureBox_Paint(object sender, PaintEventArgs e)
        {
            using(Font font = new Font("Times New Roman", 40, FontStyle.Bold))
            {
                DrawSplitText
                (
                    e.Graphics,
                    "C# Helper",
                    font,
                    this.pictureBox.ClientRectangle,
                    Brushes.Black,
                    Brushes.White
                );
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Function

        #region 분리된 텍스트 그리기 - DrawSplitText(graphics, text, font, rectangle, topForegroundBrush, bottomForegroundBrush)

        /// <summary>
        /// 분리된 텍스트 그리기
        /// </summary>
        /// <param name="graphics"></param>
        /// <param name="text"></param>
        /// <param name="font"></param>
        /// <param name="rectangle"></param>
        /// <param name="topForegroundBrush"></param>
        /// <param name="bottomForegroundBrush"></param>
        private void DrawSplitText
        (
            Graphics  graphics,
            string    text,
            Font      font,
            Rectangle rectangle,
            Brush     topForegroundBrush,
            Brush     bottomForegroundBrush
        )
        {
            Bitmap topBitmap    = new Bitmap(rectangle.Width, rectangle.Height);
            Bitmap bottomBitmap = new Bitmap(rectangle.Width, rectangle.Height);

            using(StringFormat stringFormat = new StringFormat())
            {
                stringFormat.Alignment     = StringAlignment.Center;
                stringFormat.LineAlignment = StringAlignment.Center;

                using(Graphics topGraphics = Graphics.FromImage(topBitmap))
                {
                    topGraphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;

                    topGraphics.FillRectangle(bottomForegroundBrush, rectangle);

                    topGraphics.DrawString(text, font, topForegroundBrush, rectangle, stringFormat);
                }

                using(Graphics bottomGraphics = Graphics.FromImage(bottomBitmap))
                {
                    bottomGraphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;

                    bottomGraphics.FillRectangle(topForegroundBrush, rectangle);

                    bottomGraphics.DrawString(text, font, bottomForegroundBrush, rectangle, stringFormat);
                }
            }

            RectangleF topRectangle = new RectangleF
            (
                rectangle.X,
                rectangle.Y,
                rectangle.Width,
                rectangle.Height / 2f
            );

            using(TextureBrush brush = new TextureBrush(topBitmap))
            {
                graphics.FillRectangle(brush, topRectangle);
            }

            RectangleF bottomRectangle = new RectangleF
            (
                rectangle.X,
                topRectangle.Bottom,
                rectangle.Width,
                rectangle.Height / 2f
            );

            using(TextureBrush brush = new TextureBrush(bottomBitmap))
            {
                graphics.FillRectangle(brush, bottomRectangle);
            }

            topBitmap.Dispose();

            bottomBitmap.Dispose();
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요