(основная цель)
Я хочу создать простую программу, состоящую из приложения C# Windows Forms, которое отображает заданное изображение (размером 6000x6000 пикселей, для параметра SizeMode установлено значение Zoom, чтобы все изображение видно в форме сразу) в PictureBox, который практически займет всю форму, за исключением места внизу формы, где я хочу отобразить TrackBar, который позволит вам увеличивать и уменьшать масштаб изображения; а также горизонтальную полосу прокрутки в основании PictureBox и вертикальную полосу прокрутки в правой части PictureBox для прокрутки карты при ее масштабировании, и я хотел иметь возможность управлять этими полосами прокрутки, либо щелкая и перетаскивая в соответствующем направлении PictureBox (предпочтительно, но не уверен, возможно ли это), либо используя колесо прокрутки мыши (вероятно, проще, но опять же не уверен).
(ссылка)
[ Вот моя форма, заполненная точно так, как я описал, с демонстрационной текстурой держателя места размещения размером 6000x6000 в PictureBox с использованием SizeMode Zoom, в качестве примера - ЭТО БЫЛО ОБРАБОТАНО, СЛЕДУЮЩАЯ ЧАСТЬ ПРОБЛЕМЫ ОБНОВЛЕНА НИЖЕ:]
(дополнение)
Единственная проблема, с которой я столкнулся, — это код, поскольку я в значительной степени новичок в этом отделе. Я работал над изучением рабочего процесса Visual Studio, но мне действительно нужна была бы помощь.
Заранее большое спасибо за все, чем вы можете мне помочь.
ОБНОВЛЕНИЕ:
После исследования этой темы и поиска времени, чтобы немного подумать, я придумал код, указанный ниже; но моя проблема в том, что когда я панорамирую свое изображение слишком далеко, изображение может быть вытянуто слишком далеко, таким образом обнажая панель позади него, когда изображение панорамируется/передвигается слишком далеко в один угол. Кроме того, когда я слишком сильно уменьшаю масштаб, изображение может стать НАМНОГО меньше, чем Picturebox.
Проблема с панорамированием, проблема в серых частях панели
Проблема с масштабированием, проблема в серых частях панели
Итак, мой последний вопрос: как мне пересмотреть приведенный ниже код, чтобы «заблокировать» изображение, которое я панорамирую и масштабирую, от разрешения? панорамировать или масштабировать за пределами рамки и открывать панель за ней?
Код: Выделить всё
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)
{
}
}
Подробнее здесь: https://stackoverflow.com/questions/460 ... picturebox
Мобильная версия