0

ドラッグドロップを行うと、次のようなことができることを知っています

private void Form_DragOver(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Copy;
}

カーソルにコピーを意味するプラスのイメージを持たせる。ドラッグドロップを行っていないときにこれを実行できるかどうか疑問に思っています(たとえば、ユーザーが特定の場所をクリックすると、ユーザーが別の場所をクリックするまでカーソルがこのスタイルに変わります)。使ってみCursor = Cursors.<style>ましたが入っていません。何か案は ?

4

1 に答える 1

2

これは、待機カーソルを表示する必要がない限り、非常に困難です。Application.UseWaitCursor プロパティによって処理される特殊なケース。問題は、Cursor プロパティによって選択されるように、すべてのコントロール自体がカーソルの形状に影響を与えることです。たとえば、TextBox は形状を I バーに変更することを要求します。

これを 2 回のクリックの間に実行したいだけで、いくらか先を行っています。その場合、いくつかのトリックが可能です。ボタンがクリックされたときにマウスをキャプチャして、カーソルの形状がボタンによってのみ制御されるようにすることができます。ユーザーがマウスをもう一度クリックすると、ハックが必要になります。そのクリックは、クリックされたコントロールではなく、同じボタンに移動します。これは、別のクリックを合成して修正する必要があります。このサンプル コードはこれを行います。

    bool CustomCursorShown;

    private void button1_MouseUp(object sender, MouseEventArgs e) {
        if (button1.DisplayRectangle.Contains(e.Location)) {
            this.BeginInvoke(new Action(() => {
                CustomCursorShown = true;
                button1.Cursor = Cursors.Help;   // Change this to the cursor you want
                button1.Capture = true;
            }));
        }
    }

    private void button1_MouseDown(object sender, MouseEventArgs e) {
        if (CustomCursorShown) {
            var pos = this.PointToClient(button1.PointToScreen(e.Location));
            var ctl = this.GetChildAtPoint(pos);
            if (ctl != null && e.Button == MouseButtons.Left) {
                // You may want to alter this if a special action is required
                // I'm just synthesizing a MouseDown event here...
                pos = ctl.PointToClient(button1.PointToScreen(e.Location));
                var lp = new IntPtr(pos.X + pos.Y << 16);
                // NOTE: taking a shortcut on wparam here...
                PostMessage(ctl.Handle, 0x201, (IntPtr)1, lp);
            }                 
        }
        button1.Capture = false;
    }

    private void button1_MouseCaptureChanged(object sender, EventArgs e) {
        if (!button1.Capture) {
            CustomCursorShown = false;
            button1.Cursor = Cursors.Default;
        }
    }

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private extern static IntPtr PostMessage(IntPtr hwnd, int msg, IntPtr wp, IntPtr lp);
于 2013-05-10T11:13:23.250 に答える