我正在通过Control.DoDragDrop()使用C#的内置拖放功能。我使用图像列表和ImageList_DragMove和朋友来移动半透明图像,用鼠标跟踪。 (有关更多信息,请参阅this thread中的回复)。当在外面我的窗口时,如何使ImageList跟踪鼠标?我只在OnDragOver()中接收鼠标位置消息,并且仅当鼠标位于我的一个Windows上时才会收到。拖动将转到我的应用程序的另一个实例,我希望ImageList能够全面实现,包括在桌面上。我想基本问题是DoDragDrop运行自己的小消息循环。
Windows资源管理器完成此操作,因此我知道它是可行的。我想我可以启动一个线程来跟踪鼠标或编写我自己的拖放消息循环,但我希望有一个更简单的方法。
答案 0 :(得分:2)
你无法在自己的窗户外画画。这样做的方法是更改鼠标光标。这就是GiveFeedback事件可用的,将e.UseDefaultCursors设置为false并设置Cursor.Current。
只是为了让您了解这是什么样的,这是一个拖动可见文本的示例表单。改变它以你想要的方式绘制位图,例如从你的ImageList。请注意,Bitmap.GetHicon()不会创建出色的图标,颜色映射很差。
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
this.GiveFeedback += Form1_GiveFeedback;
}
void Form1_GiveFeedback(object sender, GiveFeedbackEventArgs e) {
string txt = "Dragging text";
SizeF sz;
using (var gr = this.CreateGraphics()) {
sz = gr.MeasureString(txt, this.Font);
}
using (var bmp = new Bitmap((int)sz.Width, (int)sz.Height)) {
using (var gr = Graphics.FromImage(bmp)) {
gr.Clear(Color.White);
gr.DrawString(txt, this.Font, Brushes.Black, 0, 0);
}
bmp.MakeTransparent(Color.White);
e.UseDefaultCursors = false;
IntPtr hIcon = bmp.GetHicon();
Cursor.Current = new Cursor(hIcon);
DestroyIcon(hIcon);
}
}
protected override void OnMouseDown(MouseEventArgs e) {
this.DoDragDrop("example", DragDropEffects.Copy);
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static bool DestroyIcon(IntPtr handle);
}
答案 1 :(得分:0)
我建议您创建一个特殊表单并拖动它而不是使用ImageList。我们已在我们的产品(例如,XtraGrid)中完成此操作,以允许最终用户安排列。