マウスカーソルの動きをコントロール内でのみロックします
-
28-10-2019 - |
質問
ビットマップを使用して(ビットマップを描画の変更後にピクチャボックスイメージとしてロードする)ピクチャーボックスがあります。これで、「メモを追加」ボタンがあります。このボタンはメインフォームのどこかにあります。ユーザーがこのボタンをクリックすると、マウスポインターが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;
}
所属していません StackOverflow