none
마우스 컨트롤 질문입니다 RRS feed

  • 질문

  • 픽쳐박스안에 사진이 불려들여

    커서의 모양을 십자가 모양으로 바꾸고 마우스 포인터를 가운데 고정시킨다음 , 휠로 확대해서
    화면만
    왼쪽버튼을 눌렀을경우 마우스 드래그스크롤(패닝그)시키려고합니다.. 드래그 스크롤할때도 픽쳐박스상 마우스 포인터는 가운데 고정으로있게
    합니다..

    가능할까요??

    가능하다면 소스코드좀 부탁드리겠습니다


    • 편집됨 mataeo1877 2012년 8월 1일 수요일 오전 10:49
    2012년 8월 1일 수요일 오전 10:42

답변

  • 위 그림과 같이 스크롤시 확대되고, 스크롤시 마우스 포인터위치는 가운데로 설정했습니다.

    커서모양은 십자가로 설정했구요. [왼쪽버튼을 눌렀을 경우 드래그스크롤(패그닝)]은 무슨말인가요?

    아래 소스코드 첨부합니다.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication10
    {
        public partial class Form1 : Form
        {
    
    
    
            private Bitmap img;
            //확대배율
            private double ratio = 1F;
            //사진을 표시하게할 위치
            private Point imgPoint;
            //사진을 표시하게할 범위
            private Rectangle imgRect;
            private Rectangle imgRect2;
            //선택된 위치
            private Point clickPoint;
            public Form1()
            {
                InitializeComponent();
    
                //마우스 휠이벤트 추가 
                this.pictureBox1.MouseWheel
                += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseWheel);
                //표시할 사진 불러오기
                img = new Bitmap(WindowsFormsApplication10.Properties.Resources.Penguins);
                //초기화
                imgPoint = new Point(pictureBox1.Width / 2, pictureBox1.Height / 2);
                imgRect = new Rectangle(0, 0, img.Width, img.Height);
                ratio = 1.0;
                clickPoint = imgPoint;
                //사진을 표시한다
                pictureBox1.Invalidate();
            }
            private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
            {
                //스크롤값을 읽어온다.
                int lines = e.Delta * SystemInformation.MouseWheelScrollLines / 120;
                PictureBox pb = (PictureBox)sender;
                //확대 배율을 변경한다
                if (lines > 0)
                {
                    ratio *= 2F;
                    if (ratio > 100.0) ratio = 100.0;
                }
                else if (lines < 0)
                {
                    ratio *= 0.5F;
                    if (ratio < 0.01) ratio = 0.01;
                }
                //사진 표시범위를 변경한다
                imgRect.Width = (int)Math.Round(img.Width * ratio);
                imgRect.Height = (int)Math.Round(img.Height * ratio);
                imgRect.X = (int)Math.Round(pb.Width / 2 - imgPoint.X * ratio);
                imgRect.Y = (int)Math.Round(pb.Height / 2 - imgPoint.Y * ratio);
                //스크롤바
                hScrollBar1.Minimum = 0;
                hScrollBar1.Maximum = imgRect.Width - pb.Width;
                if (hScrollBar1.Minimum >= hScrollBar1.Maximum)
                {
                    hScrollBar1.Value = hScrollBar1.Maximum;
                }
                else
                {
                    hScrollBar1.Value = imgRect.X * (-1);
                }
                vScrollBar1.Minimum = 0;
                vScrollBar1.Maximum = imgRect.Height - pb.Height;
                if (vScrollBar1.Minimum >= vScrollBar1.Maximum)
                {
                    vScrollBar1.Value = vScrollBar1.Maximum;
                }
                else
                {
                    vScrollBar1.Value = imgRect.Y * (-1);
                }
                pictureBox1.Invalidate();
    
                // 마우스 좌표를 폼의 가운데로 강제설정
                int x = this.Left + (int)(this.Width / 2);
                int y = this.Top + (int)(this.Height / 2);
                Cursor.Position = new Point(x, y);
            }
    
            private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                if (img != null)
                {
                    e.Graphics.InterpolationMode =
                    System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    e.Graphics.DrawImage(img, imgRect);
                    pictureBox1.Focus();
                }
            }
    
            private void Form1_MouseMove(object sender, MouseEventArgs e)
            {
                
            }
    
            private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                // 마우스 좌표를 폼의 가운데로 강제설정
                //int x = this.Left + (int)(this.Width / 2);
                //int y = this.Top + (int)(this.Height / 2);
                //Cursor.Position = new Point(x,y );
            }
    
            private void pictureBox1_MouseLeave(object sender, EventArgs e)
            {
                Cursor = Cursors.Default;
            }
    
            private void pictureBox1_MouseEnter(object sender, EventArgs e)
            {
                Cursor = Cursors.Cross;
            }
    
            private void Form1_KeyUp(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Escape)
                    Application.Exit();//ESC 누르면 종료
            }
        }
    }

    • 답변으로 제안됨 mataeo187 2012년 8월 7일 화요일 오전 4:57
    • 답변으로 표시됨 Jina LeeModerator 2012년 9월 3일 월요일 오전 6:53
    2012년 8월 2일 목요일 오전 12:29