背景:
我正在从TCustomControl类派生出一个可以获得焦点的控件,其中包含一些内部元素.如果用户用光标悬停它们,那么内部元素将被突出显示,您可以选择它们,移动它们等等.现在问题…
问题:
如果用户持有CTRL,ALT或SHIFT修饰符,我正在使用(让我们说)关注的元素做不同的动作.我想要的是更改鼠标光标,如果用户悬停元素并保持为CTRL键.很简单,您只需覆盖KeyDown和KeyUp方法,并检查其Key参数是否等于VK_CONTROL.在这样的代码中:
procedure TMyCustomControl.KeyDown(var Key: Word; Shift: TShiftState); begin inherited; if Key = VK_CONTROL then Screen.Cursor := crSizeAll; end; procedure TMyCustomControl.KeyUp(var Key: Word; Shift: TShiftState); begin inherited; if Key = VK_CONTROL then Screen.Cursor := crDefault; end;@H_403_9@即使这不是检查CTRL键是否被按下并释放(例如由于现有的Shift状态参数)的最佳方法,它可以按照预期的方式工作,如果控件具有焦点,甚至可以得到,但…
我的目标是当用户将控件(或者确切地说,它内部的某个元素)移动时,更改鼠标光标,并保持即使我的控件没有焦点,CTRL键.可以这么说,所以只需覆盖MouseMove方法,并在那里要求修改器状态.这将是方式,但…
如果用户将鼠标光标停留在我的控件上,然后按下并释放该CTRL键怎么办?这不会为我的控制生成任何鼠标移动或按键事件,还是我错了?那么我的问题很明显
题:
如果控件没有焦点,用户不能用鼠标移动,我如何检测修改键更改?我在想这两个选项,但我希望有一些我错过的东西:
>键盘挂钩 – 可靠,但对我来说看起来相当吃惊
>定期检查修饰语状态 – 我不能忍受延迟那么,您如何检测目前尚未关注的控件的修改键更改?
解决方法
我将为
WM_SETCURSOR
消息编写一个消息处理程序来调用
GetKeyboardState
以获取键盘状态(在Delphi中,您可以调用
KeyboardStateToShiftState),并根据其结果(和命中测试)调用
SetCursor
使用适当的光标.
为了处理WM_SETCURSOR,在网格单元中的VCL:TCustomGrid.WMSetCursor中有一个例子.