2017-09-06 39 views
-1

私は一般的にはプログラミングに若干の経験がありますが、もっと学ぶことができて嬉しく思っています。C#PictureBoxの画像を拡大/縮小するアプリケーション

が主な目標

私はC#のWindowsから構成され、簡単なプログラムを作りたいが(6000x6000ピクセル寸法のプリセット画像を表示するフォームアプリケーションなので、全体画像をズームするように設定のSizeModeフォーム全体を実質的に占有するPictureBox内でフォーム上に一度に表示されます)フォームの下部にあるスペースを除いて、画像をズームイン/ズームアウトできるトラックバーを表示する場所を保存します。 PictureBoxの基底にある水平スクロールバー、ピクチャボックスの右側にある垂直スクロールバーを使用して、ズームしたときに地図をスクロールすることができます。これらのスクロールバーをクリックするか、ピクチャボックスの対応する方向にドラッギングすることができます(ただし可能かどうかは不明ですが)。またはマウスのスクロールホイールを使用します(おそらく簡単ですが、もう一度わかりません)。

参照

[ここでは私のフォームは、私は例として、のSizeModeズームを使用してのPictureBoxで6000x6000の配置ホルダーデモの質感と、説明したとおりに完了している - THIS HAS処理され、問題の次の部分は、以下に更新される:]

補遺

私が抱える唯一の問題は、コードです。私はその部門ではかなり茶色です。私はVisual Studioのワークフローを学ぶために働いていましたが、本当に役立つことがあります。

お手伝いできることがあれば、あらかじめありがとうございます。

UPDATE:

テーマに研究をして、いくつかの思考を行うために時間を取った後、私は以下に記載するコードが出ています。しかし私の問題は、私がイメージをあまりにも遠くにパンすると、イメージがあまりにも遠くに引っ張られることが許されているため、イメージが1つのコーナーにパン/また、ズームアウトしすぎると、画像がピクチャボックスよりも小さくなることが許されます。だから、

Panning issue, the grey parts of the panel are the problem

Zoom issue, the grey parts of the panel are the problem

、私の最後の質問:どのように私は「ロック」するために、次の私はパンとの外でパンやズームが許可されるからズームしていた画像を、コードを修正については行くだろうそのフレームとそれの後ろにパネルを公開?

public partial class ImageZoomMainForm : Form 
{ 
    Image img; 
    Point mouseDown; 
    int startx = 0; 
    int starty = 0; 
    int imgx = 0; 
    int imgy = 0; 

    bool mousepressed = false; 
    float zoom = 1; 

    public ImageZoomMainForm() 
    { 

     InitializeComponent(); 
     string imagefilename = @"..\..\ViewPort_MAIN.tif"; 
     img = Image.FromFile(imagefilename); 

     Graphics g = this.CreateGraphics(); 








     zoom = ((float)pictureBox.Width/(float)img.Width) * (img.HorizontalResolution/g.DpiX); 

     pictureBox.Paint += new PaintEventHandler(imageBox_Paint); 
    } 

    private void pictureBox_MouseMove(object sender, EventArgs e) 
    { 
     MouseEventArgs mouse = e as MouseEventArgs; 

     if (mouse.Button == MouseButtons.Left) 
     { 
      Point mousePosNow = mouse.Location; 

      int deltaX = mousePosNow.X - mouseDown.X; 
      int deltaY = mousePosNow.Y - mouseDown.Y; 

      imgx = (int)(startx + (deltaX/zoom)); 
      imgy = (int)(starty + (deltaY/zoom)); 

      pictureBox.Refresh(); 
     } 
    } 

    private void imageBox_MouseDown(object sender, EventArgs e) 
    { 
     MouseEventArgs mouse = e as MouseEventArgs; 

     if (mouse.Button == MouseButtons.Left) 
     { 
      if (!mousepressed) 
      { 
       mousepressed = true; 
       mouseDown = mouse.Location; 
       startx = imgx; 
       starty = imgy; 
      } 
     } 
    } 

    private void imageBox_MouseUp(object sender, EventArgs e) 
    { 
     mousepressed = false; 
    } 

    protected override void OnMouseWheel(MouseEventArgs e) 
    { 
     float oldzoom = zoom; 

     if (e.Delta > 0) 
     { 
      zoom += 0.1F; 
     } 

     else if (e.Delta < 0) 
     { 
      zoom = Math.Max(zoom - 0.1F, 0.01F); 
     } 

     MouseEventArgs mouse = e as MouseEventArgs; 
     Point mousePosNow = mouse.Location; 

     int x = mousePosNow.X - pictureBox.Location.X;  
     int y = mousePosNow.Y - pictureBox.Location.Y; 

     int oldimagex = (int)(x/oldzoom); 
     int oldimagey = (int)(y/oldzoom); 

     int newimagex = (int)(x/zoom);  
     int newimagey = (int)(y/zoom); 

     imgx = newimagex - oldimagex + imgx; 
     imgy = newimagey - oldimagey + imgy; 

     pictureBox.Refresh(); 


    } 

    private void imageBox_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     e.Graphics.ScaleTransform(zoom, zoom); 
     e.Graphics.DrawImage(img, imgx, imgy); 
    } 



    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     const int WM_KEYDOWN = 0x100; 
     const int WM_SYSKEYDOWN = 0x104; 

     if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN)) 
     { 
      switch (keyData) 
      { 
       case Keys.Right: 
        imgx -= (int)(pictureBox.Width * 0.1F/zoom); 
        pictureBox.Refresh(); 
        break; 

       case Keys.Left: 
        imgx += (int)(pictureBox.Width * 0.1F/zoom); 
        pictureBox.Refresh(); 
        break; 

       case Keys.Down: 
        imgy -= (int)(pictureBox.Height * 0.1F/zoom); 
        pictureBox.Refresh(); 
        break; 

       case Keys.Up: 
        imgy += (int)(pictureBox.Height * 0.1F/zoom); 
        pictureBox.Refresh(); 
        break; 

       case Keys.PageDown: 
        imgy -= (int)(pictureBox.Height * 0.90F/zoom); 
        pictureBox.Refresh(); 
        break; 

       case Keys.PageUp: 
        imgy += (int)(pictureBox.Height * 0.90F/zoom); 
        pictureBox.Refresh(); 
        break; 
      } 
     } 

     return base.ProcessCmdKey(ref msg, keyData); 
    } 

    private void ImageZoomMainForm_Load(object sender, EventArgs e) 
    { 

    } 
} 

}パネル内部

+1

あなたは、グラフィックスオブジェクトを 'using(...){}'ブロックに置くことで常にGraphicsオブジェクトを破棄します。 – Nyerguds

答えて

0

ピクチャは、 パネルは、のSizeModeと ピクチャが

トラックバー変化が増加することができるズームとの大きさを減少させるためにTrueにAutoSrollを設定しなければなりません外側のパネルにオートスクロールができるように、ピクチャボックス内のいくつかのマウスイベントを使用してドラッグすることも可能です。

+0

一晩中起床して調査をした後、次のコードを思いつきました。更新されたメインポストに反映される – Aspiring

関連する問題