質問

ビットマップを使用して(ビットマップを描画の変更後にピクチャボックスイメージとしてロードする)ピクチャーボックスがあります。これで、「メモを追加」ボタンがあります。このボタンはメインフォームのどこかにあります。ユーザーがこのボタンをクリックすると、マウスポインターがPictureBoxコントロールにジャンプし、ユーザーがコントロール内でクリックしたり、エスケープキーを押したりしない限り、外に移動しません。これは可能ですか?

私は現時点でこのコードを使用しています:

    private void buttonAddNote_Click(object sender, EventArgs e)
    {
        Cursor = Cursors.Cross;
    }

または、ユーザーが[メモ]ボタンをクリックしたときに、より良いアプローチがあります。マウスクリックはPictureBoxコンポーネント内でのみ動作します(つまり、ユーザーはプログラムの他の場所をクリックできません)

役に立ちましたか?

解決

ユーザーインターフェイスのそのようなモダリティは、かなり悪い考えです。しかし、WinFormsはそれを可能にします。 cursor.clipプロパティを使用して、モーションを制限できます。たとえば、キーボードショートカットを備えたスタートメニューにユーザーがまだアクセスできないようにすることはできません。キャプチャプロパティを使用して、失ったものを検出する必要があります。

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        pictureBox1.MouseCaptureChanged += new EventHandler(pictureBox1_MouseCaptureChanged);
        pictureBox1.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
        button1.Click += new EventHandler(button1_Click);
    }

    private void button1_Click(object sender, EventArgs e) {
        var rc = pictureBox1.RectangleToScreen(new Rectangle(Point.Empty, pictureBox1.ClientSize));
        Cursor.Position = new Point(rc.Left + rc.Width / 2, rc.Top + rc.Height / 2);
        Cursor.Clip = rc;
        pictureBox1.Capture = true;
        pictureBox1.Cursor = Cursors.Cross;
    }

    void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
        pictureBox1.Capture = false;
    }

    void pictureBox1_MouseCaptureChanged(object sender, EventArgs e) {
        if (!pictureBox1.Capture) {
            pictureBox1.Cursor = Cursors.Default;
            Cursor.Clip = new Rectangle(0, 0, 0, 0);
        }
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == Keys.Escape) pictureBox1.Capture = false;
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

他のヒント

2番目には、ユーザーの制限について正しいので、このアイデアを思いつきました。しかし、ユーザーのマウスをロックする方法を教えてくれてありがとう!!!バツ)

    public addNote = false;

    private void buttonAddNote_Click(object sender, EventArgs e)
    {
        if (!addNote)
            addNote = true;
        else addNote = false;
    }

    private void curveBox_MouseMove(object sender, MouseEventArgs e)
    {
        if (addNote)
        {
            Cursor = Cursors.Cross;
        }
    }

    private void curveBox_MouseLeave(object sender, EventArgs e)
    {
        Cursor = Cursors.Default;
        addNote = false;
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top