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!