鼠标左键按下时如何更改鼠标光标?
Posted
技术标签:
【中文标题】鼠标左键按下时如何更改鼠标光标?【英文标题】:How do I change the mouse cursor when the left mouse button is down? 【发布时间】:2010-09-27 11:40:43 【问题描述】:在 Delphi 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 之间来回改变。
【问题讨论】:
添加了更多信息,因此可以在鼠标移动时使用。 【参考方案1】:如果您在 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;
如果您希望鼠标光标在鼠标移动时做出反应,请使用以下命令:
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。
【讨论】:
【参考方案2】:有点离题,但可能对你有用。
我创建了一个全局堆栈以允许嵌套游标更改。它允许任何一段代码将鼠标光标设置为他们想要的,而不用担心他们的调用者或被调用者的设置。
例如:
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;
【讨论】:
以上是关于鼠标左键按下时如何更改鼠标光标?的主要内容,如果未能解决你的问题,请参考以下文章