첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

■ 화면 돋보기를 사용하는 방법을 보여준다.

TestProject.zip
0.00MB

▶ MainForm.cs

namespace TestProject;

/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : Form
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Field
    ////////////////////////////////////////////////////////////////////////////////////////// Private

    #region Field

    /// <summary>
    /// 스케일 비율
    /// </summary>
    private double scaleRate = 2.0d;

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 생성자 - MainForm()

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

        KeyPreview = true;

        this.timer.Interval = 50;

        MouseWheel                     += Form_MouseWheel;
        this.timer.Tick                += timer_Tick;
        this.scaleInButton.MouseClick  += scaleInButton_MouseClick;
        this.scaleOutButton.MouseClick += scaleOutButton_MouseClick;

        this.timer.Start();
    }

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Private

    #region 폼 마우스 휠 처리하기 - Form_MouseWheel(sender, e)

    /// <summary>
    /// 폼 마우스 휠 처리하기
    /// </summary>
    /// <param name="sender">이벤트 발생자</param>
    /// <param name="e">이벤트 인자</param>
    private void Form_MouseWheel(object sender, MouseEventArgs e)
    {
        if(e.Delta < 0 && this.scaleRate > 0.2d)
        {
            this.scaleRate -= 0.1d;
        }
        else if(e.Delta > 0 && this.scaleRate < 5.0d)
        {
            this.scaleRate += 0.1d;
        }
    }

    #endregion
    #region 타이머 틱 처리하기 - timer_Tick(sender, e)

    /// <summary>
    /// 타이머 틱 처리하기
    /// </summary>
    /// <param name="sender">이벤트 발생자</param>
    /// <param name="e">이벤트 인자</param>
    private void timer_Tick(object sender, EventArgs e)
    {
        this.scaleLabel.Text = $"배율 : {this.scaleRate:#.00}";

        Size size = new Size(this.pictureBox.Width, this.pictureBox.Height);

        Bitmap bitmap = new Bitmap((int)(size.Width / this.scaleRate), (int)(size.Height / this.scaleRate));

        using Graphics graphics = Graphics.FromImage(bitmap);

        graphics.CopyFromScreen
        (
            (int)(MousePosition.X - size.Width  / (this.scaleRate * 2)),
            (int)(MousePosition.Y - size.Height / (this.scaleRate * 2)),
            0,
            0,
            size,
            CopyPixelOperation.SourceCopy
        );

        Bitmap temporaryBitmap = this.pictureBox.Image as Bitmap;

        this.pictureBox.Image = bitmap;

        if(temporaryBitmap != null)
        {
            temporaryBitmap.Dispose();
        }
    }

    #endregion
    #region 확대 버튼 클릭시 처리하기 - scaleInButton_MouseClick(sender, e)

    /// <summary>
    /// 확대 버튼 클릭시 처리하기
    /// </summary>
    /// <param name="sender">이벤트 발생자</param>
    /// <param name="e">이벤트 인자</param>
    private void scaleInButton_MouseClick(object sender, MouseEventArgs e)
    {
        if(e.Button == MouseButtons.Left && this.scaleRate < 5.0d)
        {
            this.scaleRate += 0.1d;
        }
    }

    #endregion
    #region 축소 버튼 클릭시 처리하기 - scaleOutButton_MouseClick(sender, e)

    /// <summary>
    /// 축소 버튼 클릭시 처리하기
    /// </summary>
    /// <param name="sender">이벤트 발생자</param>
    /// <param name="e">이벤트 인자</param>
    private void scaleOutButton_MouseClick(object sender, MouseEventArgs e)
    {
        if(e.Button == MouseButtons.Left && this.scaleRate > 0.2d)
        {
            this.scaleRate -= 0.1d;
        }
    }

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

댓글을 달아 주세요