0

C# の Windows フォームで作業していますが、Picturebox の画像を中央に移動するのに問題があります。

私がやろうとしているのは、モニターの解像度を見て、フォームを全画面表示に設定してから、フォーム内でピクチャボックスを全画面表示に設定することです。

Windowstate は Designer で Maximized に設定され、FormBorderstyle は Designer で None に設定されます。

    void Monitorresolution()
    {
        // grabs the resolution of the monitor
        Screen screen = Screen.PrimaryScreen;
        screenWidth = screen.Bounds.Width;
        screenHeight = screen.Bounds.Height;
        //MessageBox.Show("height = " + screenWidth + "/n" + "Width = " + screenHeight);
        // grabs the resolution of the monitor

        // sets the size of the window of Pictureviewer
        this.ClientSize = new Size(screenWidth, screenHeight);
        // sets the size of the window of Pictureviewer

        // sets the size of the picturebox
        pictureBox1.Size = new Size(screenWidth, screenHeight);
        // sets the size of the picturebox

        // sets the size of the image inside picturebox
        pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
        // sets the size of the image inside picturebox

        // center the image
        pictureBox1.Location = new Point((pictureBox1.Parent.ClientSize.Width / 2) - (pictureBox1.Width / 2), (pictureBox1.Parent.ClientSize.Height / 2) - (pictureBox1.Height / 2));
        // center the image


        // anchors the picturebox
        pictureBox1.Anchor = AnchorStyles.None;

        // MessageBox.Show("WTF");

        pictureBox1.Refresh();       
    }

メッセージボックスステートメントのコメントを削除しない限り、画像は中心から外れます。メッセージボックスをオンにすると、画像は完全に中央に配置されます。

なぜこれが起こっているのか、それを修正するために何ができるのか.

ありがとうアンディ


アップデート

私が何をしているのか、またなぜ pictureBox1.Dock = DockStyle.Fill; なのかをよりよく理解するために、さらに多くのコードを示しています。この場合、私にはうまくいきません。

コードを少し並べ替えて、サイズ変更コードを form_load コードに配置しました。


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 Image_Viewer
{
public partial class imageViewer : Form
{
    System.Drawing.Point mouseDown;

    int newWidth = 0;
    int newHeight = 0;
    int newX = 0;
    int newY = 0;

    int screenWidth;
    int screenHeight;


    public imageViewer()
    {
        InitializeComponent();

        var frm2 = new exitform();
        frm2.FormClosed += (o, e) => this.Close();
        frm2.Show();
    }

    private void imageViewer_FormClosed(object sender, FormClosedEventArgs e)
    {

    }

    private void imageViewer_Load(object sender, EventArgs e)
    {
        using (OpenFileDialog dlg = new OpenFileDialog())
        {
            dlg.Title = "Open Image";
            dlg.Filter = "JPG|*.jpg;*.jpeg|PNG|*.png|TIFF|*.tif;*.tiff|BMP|*.bmp|GIF|*.gif|" + "All Graphics Types|*.bmp;*.jpg;*.jpeg;*.png;*.tif;*.tiff";

            if (dlg.ShowDialog() == DialogResult.OK)
            {

                using (var fs = new System.IO.FileStream(dlg.FileName, System.IO.FileMode.Open))
                {
                    var bmp = new Bitmap(fs);
                    pictureBox1.Image = bmp;
                    Invalidate();
                }
            }
        }

        // grabs the resolution of the monitor
        Screen screen = Screen.PrimaryScreen;
        screenWidth = screen.Bounds.Width;
        screenHeight = screen.Bounds.Height;
        // MessageBox.Show("height = " + screenHeight + "\n" + "Width = " + screenWidth);
        // grabs the resolution of the monitor


        // sets the size of the window of Pictureviewer
        this.ClientSize = new Size(screenWidth, screenHeight);
        // sets the size of the window of Pictureviewer

        pictureBox1.Size = new Size(screenWidth, screenHeight);

        pictureBox1.Location = new Point((ClientSize.Width / 2) - (pictureBox1.Width / 2), (ClientSize.Height / 2) - (pictureBox1.Height / 2));

        // MessageBox.Show("When this message box pops, everything seems to work, no idea why though");
    }

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

        if (mouse.Button == MouseButtons.Left)
        {
            mouseDown = mouse.Location;
            pictureBox1.Dock = DockStyle.None;
        }

        else if (mouse.Button == MouseButtons.Right)
        {
            // Do something else, not important in this example
        }
    }

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

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

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

            int newX = pictureBox1.Location.X + deltaX;
            int newY = pictureBox1.Location.Y + deltaY;

            pictureBox1.Location = new Point(newX, newY);
        }

        else if (mouse.Button == MouseButtons.Right)
        {
            this.Close();
        }
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs 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;

            int newX = pictureBox1.Location.X + deltaX;
            int newY = pictureBox1.Location.Y + deltaY;

            pictureBox1.Location = new Point(newX, newY);
        }
    }

    protected override void OnMouseWheel(MouseEventArgs e)//zoom function
    {
        if (e.Delta > 0)
        {
            newWidth = pictureBox1.Size.Width + (pictureBox1.Size.Width / 10);
            newHeight = pictureBox1.Size.Height + (pictureBox1.Size.Height / 10);

            newX = pictureBox1.Location.X - ((pictureBox1.Size.Width / 10) / 2);
            newY = pictureBox1.Location.Y - ((pictureBox1.Size.Height / 10) / 2);
        }

        else if (e.Delta < 0)
        {
            newWidth = pictureBox1.Size.Width - (pictureBox1.Size.Width / 10);
            newHeight = pictureBox1.Size.Height - (pictureBox1.Size.Height / 10);
            newX = pictureBox1.Location.X + ((pictureBox1.Size.Width / 10) / 2);
            newY = pictureBox1.Location.Y + ((pictureBox1.Size.Height / 10) / 2);
        }

        pictureBox1.Size = new Size(newWidth, newHeight);
        pictureBox1.Location = new Point(newX, newY);
    }

}
}

フォーム 2 は次のコードを使用します

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 Image_Viewer
{
public partial class exitform : Form
{
    private const int CP_NOCLOSE_BUTTON = 0x200;

    public exitform()
    {
        InitializeComponent();
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams myCp = base.CreateParams;
            myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON;
            return myCp;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
    }
}
}

終了ボタンを表示するためだけに、フォーム 2 のコードのみを表示しています。フォーム 1 の上に表示し、両方から閉じるボタンを削除します。

AppDeveloper 投稿されたコードを試しましたが、私の場合はうまくいきませんでした。テスト目的で、より小さな形式で再試行します。私が奇妙だと思うのは、何らかの理由でメッセージボックスの後に機能することです。

ありがとうアンディ

4

4 に答える 4

2

ホストされている場所 (つまり、親コントロール/フォーム)pictureBox1に対して場所を中央に配置する必要があります。Form

なぜあなたが画像を中心に置いているのかわかりませんPrimaryScreen

pictureBox を中央に配置するより良い方法は、イベントをサブスクライブして場所を動的にForm.Resize調整することです。pixtureBox1

private void Form1_Load(object sender, EventArgs e)
{
    this.Resize += Form1_Resize;
}

private void Form1_Resize(object sender, EventArgs e)
{
    pictureBox1.Left = (this.Width - pictureBox1.Width)/2;
    pictureBox1.Top = (this.Height - pictureBox1.Height)/2;
}
于 2013-03-10T14:40:08.680 に答える
2

ご覧のとおり、ピクチャボックスのサイズ = フォームのサイズを設定しています。あなたの場合、設定するだけの方が良いです

pictureBox1.Dock = DockStyle.Fill;

サイズの設定/適切なサイズ変更を忘れてください:)

于 2013-03-10T14:43:17.040 に答える
0

私はついに問題が何であるかを見つけました

ドックスタイルが欠けていました。真下に挿入すると

pictureBox1.Location = new Point((ClientSize.Width / 2) - (pictureBox1.Width / 2), (ClientSize.Height / 2) - (pictureBox1.Height / 2));

pictureBox1.Dock = DockStyle.Top;

毎回完璧に動作するようです。

私のためにこれを見てくれたすべての人に感謝します。

アンディ

于 2013-03-11T02:09:56.523 に答える
0

私は C++ CLI の方が好きですが、次の例はわかりやすいはずです。

    Void MyForm::SetFullScreen(Boolean value)
    {
        if (value == FullScreen)
            return;

        if (value)
        {
            // DO NOT REORDER!!!
            this->LastWindowState = WindowState;                
            this->WindowState = FormWindowState::Normal;
            this->LastWindowBounds = Bounds;
            this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::None;                              
            this->Bounds = Screen::PrimaryScreen->Bounds;
        }
        else
        {
            // DO NOT REORDER!!!
            this->WindowState = LastWindowState;
            this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::Sizable;
            this->Bounds = LastWindowBounds;                    
        }

         Int32 NewX = (pictureBox1.Parent.ClientSize.Width / 2) - (pictureBox1.Width / 2);
         Int32 NewY = (pictureBox1.Parent.ClientSize.Height / 2) - (pictureBox1.Height / 2);
         pictureBox1.Location = new Point(NewX, NewY);
         pictureBox1.Anchor = AnchorStyles.None; 

        // finally save the actual state
        FullScreen = value;
    }
于 2013-03-10T14:50:16.513 に答える