代码之家  ›  专栏  ›  技术社区  ›  Oliver Bock

如何使用图像列表在自己的窗口外绘制C#拖动

  •  0
  • Oliver Bock  · 技术社区  · 14 年前

    我使用的是C#的内置拖放通过控件.DoDragDrop(). 我用图片列表和图片列表来移动一个半透明的图片,用鼠标跟踪。(见我的答复) this thread 外部 我的窗户?我只在OnDragOver()中接收鼠标位置消息,并且只在鼠标位于我的一个窗口上时接收。拖动将转到我的应用程序的另一个实例,我希望ImageList一直运行,包括桌面上。我想基本的问题是DoDragDrop运行自己的小消息循环。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Hans Passant    14 年前

    你不能在自己的窗外画画。方法是更改鼠标光标。这就是GiveFeedback事件的可用性,将e.UseDefaultCursors设置为false并将光标。当前.

    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);
    
    }
    
        2
  •  0
  •   DevExpress Team    14 年前

    推荐文章