PDA

View Full Version : سوال: تغییر موقعیت یک کنترل با حرکت موس در سی شارپ



mohammd_df
یک شنبه 28 مهر 1398, 17:25 عصر
سلام. می خوام یه پیکچرباکس روی فرم ایجاد کنم و با حرکت موس ، موقعیت اون هم تغیر کنه.موقعیت پیکچرباکس نسبت به موس توی عکس مشخص شده.
مشکم اینه که وقتی موقعیت موس داخل یک کنترل یا خود پیکچرباکس قرار میگیره، دیگه پیکچرباکس حرکت نمیکنه. چون موقعیت موس رو گم میکنه

ASHKANLAEI
یک شنبه 28 مهر 1398, 17:36 عصر
سلام. درست متوجه سوالتون نشدم، اما برای ساخت یک کنترل قابل حرکت میتونید از این لینک استفاده کنید: https://stackoverflow.com/a/1592899/11955706
فقط در استفاده از SendMessage باید Handle رو با Handle.<اسم کنترل> تعویض کنید

mohammd_df
دوشنبه 29 مهر 1398, 20:52 عصر
خیلی ممنون دوست گرامی .مشکلم حل شد. البته چیزی که من می خوایستم این بود که با یه راست کلیک یه پیکچرباکس نمایش داده بشه و مدام همراه موس حرکت کنه و با کلیک چپ پیکچرباکس رو نمایش نده.سورس کدش رو اینجا میذارم هرکی خواست استفاده کنه

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace test1
{
class dragcontrol
{
public enum direction
{
any,
horizental,
vertical
}


public static void init(Control control, Control container, direction direction=direction.any)
{

bool dragging = false;
Point dragstart = Point.Empty;



{ control.MouseDown += delegate (object sender, MouseEventArgs e)
{


dragging = true;
dragstart = new Point(e.X, e.Y);
control.Capture = true;
};
}
control.MouseUp += delegate (object sender, MouseEventArgs e)
{
if(dragging)
{
dragging = false;

control.Capture = false;


}

};
control.MouseMove += delegate (object sender, MouseEventArgs e)
{
if (true)
{
if (direction != direction.vertical)
container.Left = Math.Max(0, e.X + container.Left - dragstart.X);
if (direction != direction.horizental)
container.Top = Math.Max(0, e.Y + container.Top - dragstart.Y);




}


};


}
}
}
///////////////////////////////////////
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;




namespace test1
{
public partial class Form1 : Form
{
private bool mouseDown;
public Form1()
{
InitializeComponent();
test1.dragcontrol.init(this.tt,this.tt);
}


private void Form1_Load(object sender, EventArgs e)
{


}


private void Form1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
mouseDown = true;
tt.Location = new Point(e.X, e.Y);
tt.Visible = true;
}
else
{
mouseDown = false;
tt.Visible = false;
}


}


private void tt_MouseClick(object sender, MouseEventArgs e)
{
tt.Visible = false;
}


private void Form1_MouseMove_1(object sender, MouseEventArgs e)
{
if (mouseDown)
{
tt.Location = e.Location;

}


}


private void tt_Click(object sender, EventArgs e)
{
tt.Visible = false;
}


private void Form1_Click(object sender, EventArgs e)
{
tt.Visible = false;
}


private void button1_Click(object sender, EventArgs e)
{


}


private void button1_MouseMove(object sender, MouseEventArgs e)
{
if(tt.Visible)
{
tt.BringToFront();
}

}
}
}

خیلی ممنون دوست عزیز بابت راهنمایی. مشکل حل شد.
البته اون چیزی که من میخواستم این بود که با یه راست کلیک یه پیکچرباکس نمایش داده بشه و مدام با حرکت موس حرکت کنه.سرس کدش رو هم گذاشتم برای هرکسی که لازمش شد