Hi,
I have managed to (on button click) create a label and get the label to be dragged and droped around the screen. But i need to have multiple labels on screen that can be individually dragged around, can any1 help me out with the code i would need for this, as i'm fairly new to C#, so my brain hasnt managed to figure this one out yet,
Thanks in advance :)
Julian
-------------------------
Here a summary of my current code...
// creating a label
lblDragger = new System.Windows.Forms.Label()
// drag and drop event handlers
lblDragger.MouseUp += new MouseEventHandler(this.lblDragger_MouseUp);
lblDragger.MouseMove += new MouseEventHandler(this.lblDragger_MouseMove);
lblDragger.MouseDown += new MouseEventHandler(this.lblDragger_MouseDown);
// the dragging and dropping
private void lblDragger_MouseDown(Object sender, MouseEventArgs e)
{
isDragging = true;
clickOffsetX = e.X;
clickOffsetY = e.Y;
}
private void lblDragger_MouseUp(Object sender, MouseEventArgs e)
{
isDragging = false;
this.groupBox1.Controls.Add(this.lblDragger);
}
private void lblDragger_MouseMove(Object sender,
System.Windows.Forms.MouseEventArgs e)
{
if (isDragging == true)
{
lblDragger.Left = e.X + lblDragger.Left - clickOffsetX;
lblDragger.Top = e.Y + lblDragger.Top - clickOffsetY;
}
Invalidate();
}
Loading
julz barrabPosted Jul 30, 2007, 5:19 PM
I've done it myself, JOYOUS!!
true is Point is in rectangle, else false
did it different...
for those who are intrested here how...
(using array of labels, then using a method which checks if the mouse point is inside the rectangle of the label)
Array of Labels and Rectangles...
Label[] label = new Label[100];
Rectangle[] rects = new Rectangle[100];
for each label...
label[newLabel] = new System.Windows.Forms.Label();
label[newLabel].Location = new System.Drawing.Point(9, 200);
label[newLabel].Size = new System.Drawing.Size(50, 50);
label[newLabel].name = "fred" ... etc for all label values
// create an associated rectangle (with the same points)
rects[newLabel] = new Rectangle(9, 200, 50, 50);
// IS point in label method...
/// Point to be Checked
/// Rectangle
///
public static bool isPointinLabel(Point p, Rectangle r)
{
bool flag = false;
if (p.X > r.X && p.X < (r.X + r.Width) && p.Y > r.Y && p.Y < (r.Y + r.Height))
{
flag = true;
}
return flag;
}
if (isPointinLabel(mousePt, rects[i]) == true)ON MOUSE DOWN
//loop throught all labels to find where mouse down was...
selectedLabel = -1;
for (int i = 0; i < rects.Length; i++)
{
// identify the true location of the mouse in relation to the form
Point mousePt = PointToClient(Cursor.Position);
{
selectedLabel = i; isDragging = true;clickOffsetX = e.X;
clickOffsetY = e.Y;
break;
}
}
etc you can see how it goes from here
Thanks to all who took intrest in this thread. Jules
julz barrabPosted Jul 30, 2007, 7:39 AM
I've simplified the associated code and put it in a text file here (now with resizing of labels)
http://www.freewebs.com/teamfeeble/dragdrop.txt
for those intrested - this code is currently a working drap drop interface + resizeable runtime controls + validation to keep on screen
if some1 could get it to work for me with arrays (so i can drag (and resize) many labels around the screen individually), i think i need to be using arrays for the labels, as later on i need to be able to write the different sizes of the labels to a text file. I could send a small contribution via paypal
Jules :)
AlanPosted Jul 29, 2007, 7:12 PM
To use those properties you need to cast to the Label type first which you can do as the 'sender' object parameter actually refers to a Label. So you need:
((Label)sender).Name rather than sender.Name
((Label)sender).Top rather than sender.Top
((Label)sender).Left rather than sender.Left
julz barrabPosted Jul 29, 2007, 6:37 PM
i cant get the GetLblbDraggerNumber working correctly, using the code provided in post 2...
i'm getting errors to do with sender... " 'object' does not contain a definition for 'Name' "
i get the same in lblDargger_MouseMove with sender.Left and sender.Top
i'm sure there something simple i need to change here, what is it?
Thanks all!!
Julian
AlanPosted Jul 24, 2007, 2:23 PM
You need to distinguish between the name of the variable which holds a reference to a control and the Name property of the control. It's the latter we're interested in here and the easiest way to set it is in the Properties Box for the label at design time.
However, you can set it in code with code such as this;
Label lblDragger1 = new System.Windows.Forms.Label();
lblDragger1.Name = "lblDragger1";
julz barrabPosted Jul 24, 2007, 12:19 PM
i got an error trying to use consecutive naming (it worked ok using an array but the identifier method didnt work), i tried doing this...
string lblDrag = "lblDragger" + labelCounter;
lblDrag = new System.Windows.Forms.Label();
....
labelCounter++;
but i got this err: " Cannot implicitly convert type 'System.Windows.Forms.Label' to 'string' "
how should i consecutivly name?
Thankyou, J
AlanPosted Jul 24, 2007, 9:49 AM
I'd suggest something like this (untested) for dealing with 3 draggable labels though, as you'll see, the code is easily generalized to deal with an arbitrary number of such labels added at design time.
There's no need to put the labels themselves into an array as long as they are named consecutively (lblDragger1, lbdDragger2 etc):
// creating 3 draggablelabels
lblDragger1 = new System.Windows.Forms.Label();
lblDragger2 = new System.Windows.Forms.Label();
lblDragger3 = new System.Windows.Forms.Label();
// make sure name property is set
lblDragger1.Name = "lblDragger1";
lblDragger2.Name = "lblDragger2";
lblDragger3.Name = "lblDragger3";
// drag and drop event handlers - all labels use same handlers
lblDragger1.MouseUp += new MouseEventHandler(this.lblDragger_MouseUp);
lblDragger1.MouseMove += new MouseEventHandler(this.lblDragger_MouseMove);
lblDragger1.MouseDown += new MouseEventHandler(this.lblDragger_MouseDown);
lblDragger2.MouseUp += new MouseEventHandler(this.lblDragger_MouseUp);
lblDragger2.MouseMove += new MouseEventHandler(this.lblDragger_MouseMove);
lblDragger2.MouseDown += new MouseEventHandler(this.lblDragger_MouseDown);
lblDragger3.MouseUp += new MouseEventHandler(this.lblDragger_MouseUp);
lblDragger3.MouseMove += new MouseEventHandler(this.lblDragger_MouseMove);
lblDragger3.MouseDown += new MouseEventHandler(this.lblDragger_MouseDown);
// create array variables
bool[] isDragging = new bool[3];
int[] clickOffsetX = new int[3];
int[] clickOffsetY = new int[3];
// helper method to identify label
int GetLblDraggerNumber(object sender)
{
string name = sender.Name;
if (name.Length > 10 && name.Substring(0, 10) == "lblDragger")
return int.Parse(name.Substring(10));
else
return 0;
}
// the dragging and dropping
private void lblDragger_MouseDown(Object sender, MouseEventArgs e)
{
int lblNumber = GetLblDraggerNumber(sender);
if (lblNumber > 0)
{
// remember arrays are zero based
lblNumber--;
isDragging[lblNumber]= true;
clickOffsetX[lblNumber] = e.X;
clickOffsetY[lblNumber] = e.Y;
}
}
private void lblDragger_MouseUp(Object sender, MouseEventArgs e)
{
int lblNumber = GetLblDraggerNumber(sender);
if (lblNumber > 0)
{
isDragging[--lblNumber] = false;
this.groupBox1.Controls.Add(sender);
}
}
private void lblDragger_MouseMove(Object sender, MouseEventArgs e)
{
int lblNumber = GetLblDraggerNumber(sender);
if (lblNumber > 0)
{
if (isDragging[--lblNumber])
{
sender.Left = e.X + sender.Left - clickOffsetX;
sender.Top = e.Y + sender.Top - clickOffsetY;
}
}
Invalidate();
}