秋·风

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

【aarch64-win64】修复aarch64 win64下lazarus不弹出SourceTabPopUpMenu及拖dock时出错的两个bug(2026-07-20更新)

lazarus IDE在win64 on arm64有2个明显的Bug,经跟踪发现TSmallPoint赋值给TPoint有问题。以下方法在没找出真正bug所在位置之前的临时解决方法,很可能是fpc的bug。
1、win64 on arm64下lazarus在Tab鼠标右键点击不会弹出菜单不会弹出菜单

QQ_1784380410329

2、拖dock窗时会出错:
屏幕截图 2026-07-19 102735

修复方法:
打开\lazarus\lcl\include\control.inc
添加红色代码
2366行:

{------------------------------------------------------------------------------
       TControl DoMouseUp  "Event Handler"
------------------------------------------------------------------------------}
procedure TControl.DoMouseUp(var Message: TLMMouse; Button: TMouseButton);
var
  P: TPoint;
  MP: TSmallPoint;
begin
  if not (csNoStdEvents in ControlStyle) then
  begin
    MP := TSmallPoint(GetMousePosFromMessage(Message.Pos));
    if (Button in [mbLeft, mbRight]) and DragManager.IsDragging then
    begin
      P := ClientToScreen(MP);
      DragManager.MouseUp(Button, KeysToShiftState(Message.Keys), P.X, P.Y);
      Message.Result := 1;
    end;
    MouseUp(Button, KeysToShiftState(Message.Keys), MP.X, MP.Y);
  end;
end;

4543行:

{------------------------------------------------------------------------------
  TControl WMMouseMove
------------------------------------------------------------------------------}
procedure TControl.WMMouseMove(var Message: TLMMouseMove);
var
  MP: TSmallPoint;
begin
  {$IFDEF VerboseMouseBugfix}
  DebugLn(['[TControl.WMMouseMove] ',Name,':',ClassName,' ',Message.XPos,',',Message.YPos]);
  {$ENDIF}
  MP :=TSmallPoint(GetMousePosFromMessage(Message.Pos));
  UpdateMouseCursor(MP.X,MP.Y);
  if not (csNoStdEvents in ControlStyle) then
    MouseMove(KeystoShiftState(Word(Message.Keys)), MP.X, MP.Y);
end;

重构lazarus就可以修复这2个Bug

posted on 2026-07-18 21:24  秋·风  阅读(25)  评论(0)    收藏  举报