更改光标形状以具有复制光标形状
本文关键字:光标 复制 | 更新日期: 2023-09-27 18:13:03
我知道在拖放的时候我可以这样做
private void Form_DragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
使光标具有加号图像,表示复制。我只是想知道,如果我可以做到这一点,当我不做拖放(例如,当用户单击一个特定的地方,光标改变到这种风格,直到用户单击其他地方)。我尝试使用Cursor = Cursors.<style>
,但它不包含这个。有什么想法吗?
这很难做到,除非您想显示等待游标。由应用程序处理的特殊情况。UseWaitCursor财产。问题在于,每个控件本身都会影响光标形状(由其cursor属性选择)。例如,TextBox将坚持将形状更改为I-bar。
如果您只希望在两次点击之间执行此操作,那么您在某种程度上领先了。在这种情况下可能会有一些技巧,您可以在单击按钮时捕获鼠标,以便光标形状完全由按钮控制。当用户再次单击鼠标时,需要一个hack,该单击将转到相同的按钮,而不是单击任何控件。这需要通过合成另一个点击来修复。下面的示例代码实现了这一点:
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);