0

Control.DoDragDrop()を介してC#の組み込みのドラッグアンドドロップを使用しています。Image ListとImageList_DragMoveとその仲間を使用して、半透明の画像を移動し、マウスで追跡します。(詳細については、このスレッドの私の返信を参照してください)。ImageListがウィンドウのにあるときに、マウスを追跡するにはどうすればよいですか?OnDragOver()でマウス位置メッセージを受信するのは、マウスがいずれかのWindows上にある場合のみです。ドラッグは私のアプリケーションの別のインスタンスに移動します。デスクトップを含め、ImageListを完全に移動させたいと思います。基本的な問題は、DoDragDropが独自の小さなメッセージループを実行することだと思います。

Windowsエクスプローラーはこれを実行するので、それが可能であることがわかります。マウスを追跡したり、独自のドラッグ/ドロップメッセージループを記述したりするためにスレッドを開始できると思いますが、もっと簡単な方法を望んでいます。

4

2 に答える 2

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);

}
于 2010-09-08T11:30:24.533 に答える
0

ImageListを使用する代わりに、特別なフォームを作成してドラッグすることをお勧めします。エンドユーザーが列を配置できるように、製品(XtraGridなど)でこれを実行しました。

于 2010-09-08T07:07:45.993 に答える