danyolgiax
danyolgiax

Reputation: 13106

Graphic user interface with c#

I have to create a graphic interface for a c# winform project. There is a background image and a set of small transparent pictures. The user must be able to put those little images over the backgroud, select them and move them freely (I have also to calculate distance between them but this is another step!).

I know I can do somthing like this:

Flicker free drawing using GDI+ and C#

I also found this:

http://cs-sdl.sourceforge.net/

My question is: is there a better or simplest solution to achieve this?

update

Now images are rectangular. There are no problems if images overlaps!

If small images are a problem I can switch with simple circles (DrawEllipse). The important point is that user can always click on and move them.

Upvotes: 2

Views: 947

Answers (4)

David
David

Reputation: 475

If you would use WPF then you should use a Canvas as your container control. To the images you have to add these event handlers in you code behind file:

private bool IsDragging = false;
private System.Windows.Point LastPosition;

private void MyImage_MouseDown(object sender, MouseButtonEventArgs e)
{
    // Get the right MyImage
    Image MyImage = sender as Image;

    // Capture the mouse
    if (!MyImage.IsMouseCaptured)
    {
        MyImage.CaptureMouse();
    }

    // Turn the drag mode on
    IsDragging = true;

    // Set the current mouse position to the last position before the mouse was moved
    LastPosition = e.GetPosition(SelectionCanvas);

    // Set this event to handled
    e.Handled = true;
}

private void MyImage_MouseUp(object sender, MouseButtonEventArgs e)
{
    // Get the right MyImage
    Image MyImage = sender as Image;

    // Release the mouse
    if (MyImage.IsMouseCaptured)
    {
        MyImage.ReleaseMouseCapture();
    }

    // Turn the drag mode off
    IsDragging = false;

    // Set this event to handled
    e.Handled = true;
}

private void MyImage_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
    // Get the right MyImage
    Image MyImage = sender as Image;
    // Move the MyImage only when the drag move mode is on
    if (IsDragging)
    {
        // Calculate the offset of the mouse movement
        double xOffset = LastPosition.X - e.GetPosition(SelectionCanvas).X;
        double yOffset = LastPosition.Y - e.GetPosition(SelectionCanvas).Y;

        // Move the MyImage
        Canvas.SetLeft(MyImage, (Canvas.GetLeft(MyImage) - xOffset >= 0.0) && (Canvas.GetLeft(MyImage) + MyImage.Width - xOffset <= SelectionCanvas.ActualWidth) ? Canvas.GetLeft(MyImage) - xOffset : Canvas.GetLeft(MyImage));
        Canvas.SetTop(MyImage, (Canvas.GetTop(MyImage) - yOffset >= 0.0) && (Canvas.GetTop(MyImage) + MyImage.Height - yOffset <= SelectionCanvas.ActualHeight) ? Canvas.GetTop(MyImage) - yOffset : Canvas.GetTop(MyImage));

        // Set the current mouse position as the last position for next mouse movement
        LastPosition = e.GetPosition(SelectionCanvas);
    }
}

I hope that helps, David.

Upvotes: 0

Olle89
Olle89

Reputation: 678

I have searched for a solution on how to remove flickering from pictureboxs, without finding something satisfying ... i ended up using some 2DVector from the XNA framework and spirits. it worked fine :)

http://www.xnadevelopment.com/ gives a good explanation for how to use it, it is explained in a game context.

Upvotes: 2

Daniel
Daniel

Reputation: 31589

If you don't want flickr your best option is DirectX/XNA/OpenGL. Try to find a 2d framework with sprites for your application.

Upvotes: 0

foxy
foxy

Reputation: 7672

The Windows Presentation Fo Foundation (WPF) may be a better solution for this. It is more graphically inclined than GDI+, and is also much faster, as its powered by DirectX.

Upvotes: 1

Related Questions