如何在鼠标左键关闭时更改鼠标光标?
问题描述:
在德尔福2007年,在鼠标移动事件,我试图改变鼠标光标:如何在鼠标左键关闭时更改鼠标光标?
procedure TFr_Board_Display.PaintBox_Proxy_BoardMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if left_mouse_button_down then begin
if some_condition then begin
Cursor := crDrag;
end
else begin
Cursor := crNoDrop;
end;
end
else begin
if some_other_condition then begin
Cursor := crHandPoint;
end
else begin
Cursor := crDefault;
end;
end;
end;
例如。但是,当鼠标左键关闭时,我移动鼠标,光标不会更改为crDrag或crNoDrop。代码被执行(例如Cursor:= crDrag;),但游标不会改变。当鼠标左键弹起时,我移动鼠标,光标变化没有问题。
(我最初试图用一些拖放&丢弃事件和属性,但不能得到的一切工作,我想要的方式。)
编辑:澄清所需的行为,并格式化代码。
编辑:谢谢Gamecat,但我希望光标在鼠标左键移动时改变,鼠标移动时光标应该在crDrag和crNoDrop之间来回切换。
答
如果您在onmousedown事件设置鼠标光标在OnMouseUp复位,任何正常工作:
procedure TForm4.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Cursor := crCross;
end;
procedure TForm4.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Cursor := crDefault; // Or you can restore a saved cursor.
end;
如果你想在mousecursor在鼠标移动作出反应,使用以下命令:
procedure TForm4.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssLeft in Shift then begin
if X<100 then
Screen.Cursor := crCross
else
Screen.Cursor := crHourGlass;
end else
Screen.Cursor := crDefault; // Or you can restore a saved cursor.
end;
procedure TForm4.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Screen.Cursor := crDefault; // Or you can restore a saved cursor.
end;
需要MouseUp,否则如果光标悬停在控件上方,则光标不会变回。
一定要在任何地方使用Screen.Cursor。
答
稍有偏离主题,但可能对您有用。
我创建了一个全局堆栈以允许嵌套游标更改。它允许任何代码将鼠标指针设置为他们想要的,而不必担心它们的调用者或被调用者设置了它。
例如:
procedure AskUserWhatToDo;
begin
PushMouseCursor(crArrow);
try
if MessageDlg('Abort?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
SysUtils.Abort;
finally
PopMouseCursor;
end;
end;
procedure LongProcess;
begin
PushMouseCursor(crHourglass);
try
// do something
if QuestionableState then
AskUserWhatToDo;
// do something
finally
PopMouseCursor;
end;
end;
无论过程有担心什么状态等方面的需求或离开鼠标光标。
//===============================================================
// in a universal utility module (mine is called CraftWindows.pas)
function SetMouseCursor(ACursor : TCursor) : TCursor;
begin
Result := Screen.Cursor;
Screen.Cursor := ACursor;
end;
var
GlobalMouseCursorStack : TList = nil;
procedure PushMouseCursor(ACursor : TCursor);
begin
if GlobalMouseCursorStack = nil then
GlobalMouseCursorStack := TList.Create;
GlobalMouseCursorStack.Add(Pointer(SetMouseCursor(ACursor)));
end;
procedure PopMouseCursor;
begin
if (GlobalMouseCursorStack <> nil) and (GlobalMouseCursorStack.Count > 0) then
begin
SetMouseCursor(TCursor(GlobalMouseCursorStack.Last));
GlobalMouseCursorStack.Delete(GlobalMouseCursorStack.Count - 1);
end;
end;
...
finalization
GlobalMouseCursorStack.Free;
增加了更多信息,所以它在鼠标移动时可用。 – 2008-12-18 09:54:53