17 Stimmen

Ziehen und Ablegen zwischen Instanzen der gleichen Windows Forms-Anwendung

Ich habe eine kleine Windows Forms-Testanwendung erstellt, um einen Drag/Drop-Code auszuprobieren. Das Formular besteht aus drei PictureBoxen. Meine Absicht war es, ein Bild aus einer PictureBox zu holen, es als benutzerdefinierten Cursor während des Ziehens anzuzeigen und es dann auf einem anderen PictureBox-Ziel abzulegen.

Dies funktioniert problemlos von einer PictureBox zur anderen solange sie auf demselben Formular stehen .

Wenn ich zwei Instanzen der gleichen Anwendung öffne und versuche, per Drag & Drop zwischen ihnen zu wechseln, erhalte ich die folgende kryptische Fehlermeldung:

Dieser Fernsteuerungs-Proxy h Senke, was bedeutet, dass der Server entweder keine registrierten Serverkanäle, die hören, oder diese Anwendung hat keine geeignete Server zu sprechen.

Aus irgendeinem Grund funktioniert jedoch das Ziehen und Ablegen in Wordpad (aber nicht in MS Word oder Paintbrush).

Die drei PictureBoxen erhalten ihre Ereignisse auf diese Weise:

foreach (Control pbx in this.Controls) {
    if (pbx is PictureBox) {
        pbx.AllowDrop = true;
        pbx.MouseDown    += new MouseEventHandler(pictureBox_MouseDown);
        pbx.GiveFeedback += new GiveFeedbackEventHandler(pictureBox_GiveFeedback);
        pbx.DragEnter    += new DragEventHandler(pictureBox_DragEnter);
        pbx.DragDrop     += new DragEventHandler(pictureBox_DragDrop);
    }
}

Dann gibt es noch die vier Ereignisse wie dieses:

void pictureBox_MouseDown(object sender, MouseEventArgs e) {
    int width = (sender as PictureBox).Image.Width;
    int height = (sender as PictureBox).Image.Height;

    Bitmap bmp = new Bitmap(width, height);
    Graphics g = Graphics.FromImage(bmp);
    g.DrawImage((sender as PictureBox).Image, 0, 0, width, height);
    g.Dispose();
    cursorCreatedFromControlBitmap = CustomCursors.CreateFormCursor(bmp, transparencyType);
    bmp.Dispose();

    Cursor.Current = this.cursorCreatedFromControlBitmap;

    (sender as PictureBox).DoDragDrop((sender as PictureBox).Image, DragDropEffects.All);
}

void pictureBox_GiveFeedback(object sender, GiveFeedbackEventArgs gfea) {
    gfea.UseDefaultCursors = false;
}

void pictureBox_DragEnter(object sender, DragEventArgs dea) {
    if ((dea.KeyState & 32) == 32) { // ALT is pressed
        dea.Effect = DragDropEffects.Link;
    }
    else if ((dea.KeyState & 8) == 8) { // CTRL is pressed
        dea.Effect = DragDropEffects.Copy;
    }
    else if ((dea.KeyState & 4) == 4) { // SHIFT is pressed
        dea.Effect = DragDropEffects.None;
    }
    else {
        dea.Effect = DragDropEffects.Move;
    }
}

void pictureBox_DragDrop(object sender, DragEventArgs dea) {
    if (((IDataObject)dea.Data).GetDataPresent(DataFormats.Bitmap))
        (sender as PictureBox).Image = (Image)((IDataObject)dea.Data).GetData(DataFormats.Bitmap);
}

Für jede Hilfe wären wir Ihnen dankbar!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X