最近工作需要,要做一個矩形框,並且 用鼠標左鍵拖動矩形框移動其位置。網上查了一些感覺他們做的挺復雜的。我自己研究一天,做了一個比較簡單的,發表出來供大家參考一下。如覺得簡單,可路過,謝謝。哈哈。
先大概介紹一下原因,GDI畫矩形框就不說了,很簡單的。這里面最主要的就是滾輪放大和左鍵移動兩個事件,要計算矩形框的坐標位置。下面將代碼貼出如下:
先是定義需要的變量,就四個變量。
//矩形框坐標
private Rectangle DrawRect = new Rectangle(0, 0, 100, 100);
//鼠標按下時坐標
private Point MouseDownP = new Point();
//放大倍數
private int zoom = 0;
//鼠標移動矩形框次數,如果移動過矩形框則不從中心放大,以移動后的位置放大縮小,縮小為原大小,縮放數為0時,重置此數
private int MoveCount = 0;
然后編寫鼠標事件
private void this_MouseWheel(object sender, MouseEventArgs e)
{
if (e.Delta > 0)
{
if (zoom < 80)// 最大放大80倍
zoom++;
}
else
{
if (zoom > 0)
zoom--;
if (zoom == 0) //放大倍數=0,不放大,鼠標拖動標記歸0
MoveCount = 0;
}
//放大原理
//1、先獲取放大倍數
//2、根據放大倍數,計算矩形框高度,高度=控件高度-倍數×2;
//3、根據高度,提取矩形寬度,寬度=高度×(控件寬度/控件高度),為保證矩形和原控件縱橫比例,所以要乘以比例
//4、根據矩形框大小,和控件大小,計算矩形框在控件中的位置,即X,Y坐標
//1)如果沒有拖動過矩形,則按默認中間位置取值,X=(控件寬度-矩形寬度)/2,Y=(控件高度-矩形高度)/2
//2)如果拖動過矩形框,則原X,Y坐標不變化
//5、根據得到的新矩形框的坐標和范圍,判斷是否超界,判斷XY坐標
//滾輪放大事件
//矩形區域高度=控件高度-放大縮小倍數*2
DrawRect.Height = this.Height - zoom * 2;
//按比例計算寬度
DrawRect.Width = (int)(Convert.ToSingle(DrawRect.Height) * (Convert.ToSingle(this.Width) / Convert.ToSingle(this.Height)));
if (MoveCount == 0)//沒有拖動過,滾動滾輪才按中間放大縮小
{
DrawRect.X = (this.Width - DrawRect.Width) / 2;
DrawRect.Y = (this.Height - DrawRect.Height) / 2;
}
//===============判斷是否超界===============
//如果Right超過控件寬度
if (DrawRect.Right > this.Width)
{
DrawRect.X = DrawRect.X - (DrawRect.Right - this.Width) - 1;
DrawRect.X = DrawRect.X > 1 ? DrawRect.X : 1;
}
//如果Bottom超過控件高度
if (DrawRect.Bottom > this.Height)
{
DrawRect.Y = DrawRect.Y - (DrawRect.Bottom - this.Height) - 1;
DrawRect.Y = DrawRect.Y > 1 ? DrawRect.Y : 1;
}
DrawImg();
}
private void this_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (DrawRect.Contains(MouseDownP))//判斷鼠標按下的坐標是否在紅框中,確定是否拖動的紅框
{
//拖動鼠標位置,矩形框新X=矩形框原X+(當前鼠標X-按下時X),原X+偏移量
//Y軸一樣變化
DrawRect.X = DrawRect.X + (e.X - MouseDownP.X); //.Location = ClienP;
DrawRect.Y = DrawRect.Y + (e.Y - MouseDownP.Y); // ClienP.Y;
//判斷是否超過左上角
if (DrawRect.X < 0)
DrawRect.X = 0;
if (DrawRect.Y < 0)
DrawRect.Y = 0;
//判斷是否超過右下 角
if (DrawRect.X > (this.Width - DrawRect.Width - 1))
DrawRect.X = this.Width - DrawRect.Width - 1;
if (DrawRect.Y > (this.Height - DrawRect.Height - 1))
DrawRect.Y = this.Height - DrawRect.Height - 1;
//畫圖
DrawImg();
//計算完坐標系,鼠標按下坐標轉換成當前鼠標坐標,以重新計算偏移
MouseDownP.X = e.X;
MouseDownP.Y = e.Y;
//拖動過鼠標,鼠標拖動標記累加
MoveCount++;
}
}
}
private void this_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
MouseDownP = new Point(e.X, e.Y);
}
void DrawImg()
{
using (Graphics g = this.CreateGraphics())
{
//重繪背景
g.FillRectangle(new SolidBrush(Color.LightGray), 0, 0, this.Width, this.Height);
g.DrawString("滾輪放大,左鍵拖動矩形框" + zoom, new Font("黑體", 12f), new SolidBrush(Color.Green), 5, 5);
g.DrawString("放大" + zoom, new Font("黑體", 12f), new SolidBrush(Color.Red), 5, 20);
//重繪矩形
g.DrawRectangle(new Pen(Color.Red), DrawRect);
}
}
主要就是這么幾個事件。有需要的可以參考參考。