[英]Auto re-size windows form dynamically according to the control visibility, C#.Net
[英]How To Re-size An Image C#.net Windows Forms
我想知道,一旦我將圖像加載到窗體中,有沒有辦法允許用戶拖動該圖像的角落並重新調整大小?
目前,我知道PictureBox.Scale方法(但不推薦使用)。 我也知道PictureBox.Image.Size。 這是否意味着每次重新調整大小時我都需要使用PictureBox.Image.Size? 另外,我如何允許他們抓取圖像以重新調整大小? 我想我正在考慮繪畫以及它如何允許用戶選擇圖像,然后通過拖動角來重新調整大小......
我不是在尋找一個完整的解決方案 - 只是在正確方向上的一些指針(偽代碼或一般描述來幫助我的思維過程會很好)。 我不太確定如何解決這個問題。
到目前為止,這是我的代碼:
using (OpenFileDialog ofd = new OpenFileDialog())
{
ofd.Title = "Load Image";
if (ofd.ShowDialog() == DialogResult.OK)
{
PictureBox pictureBox = new PictureBox();
pictureBox.Image = new Bitmap(ofd.FileName);
pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox.Size = pictureBox.Image.Size;
panelArea.Controls.Add(pictureBox);
}
}
Winforms中已經有一個控件可以顯示位圖並支持使用鼠標調整大小:表單。 你只需要一點手術就可以把它變成一個控制:
using (OpenFileDialog ofd = new OpenFileDialog()) {
ofd.Title = "Load Image";
if (ofd.ShowDialog() == DialogResult.OK) {
var box = new Form();
box.TopLevel = box.ControlBox = false;
box.Visible = true;
box.BackgroundImage = new Bitmap(ofd.FileName);
panelArea.Controls.Add(box);
box.Size = box.BackgroundImage.Size;
}
}
編輯 :在你的情況下,Hans Passant的方法是最好的。 我會保留我的答案,以防你最終有更復雜的編輯要求(例如,拖動多個形狀)
有趣的是讓鼠標交互起作用。 現在,讓我們假設您只想通過拖動圖像的右下角來調整大小。 我會做這樣的事情:
創建一個名為的UserControl,例如ImageCanvas
。 在此控件內,執行以下操作:
添加一個字段以跟蹤圖像的大小/位置,可能是Rectangle imageRect
覆蓋OnPaint
方法以顯示圖像:
protected override void OnPaint(PaintEventArgs e) { e.Graphics.DrawImage(image, imageRect); }
添加一個字段以跟蹤用戶何時調整圖像大小,例如bool isDraggingSize
覆蓋OnMouseDown
和OnMouseUp
。 當鼠標按鈕分別向下或向上時,設置或清除isDraggingSize
。
覆蓋OnMouseMove
以執行以下操作:
設置光標:如果isDraggingSize
或鼠標指針靠近圖像的右下角,則設置Cursor = Cursors.SizeNWSE
; 否則,設置Cursor = Cursors.Default
。
如果是isDraggingSize
,請根據鼠標位置更改imageSize
字段。 如有必要,調用Invalidate()
或Refresh()
來更新顯示。
玩它,並修復所有的小細節 - 比如決定當用戶試圖調整大於控件的圖像時會發生什么,以及如何擺脫閃爍。
public Bitmap _currentBitmap;
public void Resize(int newWidth, int newHeight)
{
if (newWidth != 0 && newHeight != 0)
{
Bitmap temp = (Bitmap)_currentBitmap;
Bitmap bmap = new Bitmap(newWidth, newHeight, temp.PixelFormat);
double nWidthFactor = (double)temp.Width / (double)newWidth;
double nHeightFactor = (double)temp.Height / (double)newHeight;
double fx, fy, nx, ny;
int cx, cy, fr_x, fr_y;
Color color1 = new Color();
Color color2 = new Color();
Color color3 = new Color();
Color color4 = new Color();
byte nRed, nGreen, nBlue;
byte bp1, bp2;
for (int x = 0; x < bmap.Width; ++x)
{
for (int y = 0; y < bmap.Height; ++y)
{
fr_x = (int)Math.Floor(x * nWidthFactor);
fr_y = (int)Math.Floor(y * nHeightFactor);
cx = fr_x + 1;
if (cx >= temp.Width) cx = fr_x;
cy = fr_y + 1;
if (cy >= temp.Height) cy = fr_y;
fx = x * nWidthFactor - fr_x;
fy = y * nHeightFactor - fr_y;
nx = 1.0 - fx;
ny = 1.0 - fy;
color1 = temp.GetPixel(fr_x, fr_y);
color2 = temp.GetPixel(cx, fr_y);
color3 = temp.GetPixel(fr_x, cy);
color4 = temp.GetPixel(cx, cy);
// Blue
bp1 = (byte)(nx * color1.B + fx * color2.B);
bp2 = (byte)(nx * color3.B + fx * color4.B);
nBlue = (byte)(ny * (double)(bp1) + fy * (double)(bp2));
// Green
bp1 = (byte)(nx * color1.G + fx * color2.G);
bp2 = (byte)(nx * color3.G + fx * color4.G);
nGreen = (byte)(ny * (double)(bp1) + fy * (double)(bp2));
// Red
bp1 = (byte)(nx * color1.R + fx * color2.R);
bp2 = (byte)(nx * color3.R + fx * color4.R);
nRed = (byte)(ny * (double)(bp1) + fy * (double)(bp2));
bmap.SetPixel(x, y, System.Drawing.Color.FromArgb(255, nRed, nGreen, nBlue));
}
}
_currentBitmap = (Bitmap)bmap.Clone();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.