aqdockingutils.pas

来自「AutomatedDocking Library 控件源代码修改 适合Delp」· PAS 代码 · 共 2,359 行 · 第 1/5 页

PAS
2,359
字号
  Canvas.FillRect(R);
  Canvas.Brush.Color := clDontMask;
  if ControlCount > 0 then
    for I := 0 to ControlCount - 1 do
    begin
      Canvas.Brush.Color := clDontMask;
      R := Controls[I].BoundsRect;
      Canvas.FillRect(R);
    end;
end;

function TaqCustomControl.EventFilter(Sender: QObjectH;
  Event: QEventH): Boolean;
begin
  Result := inherited EventFilter(Sender, Event);
  case QEvent_type(Event) of
    QEventType_Resize,
    QEventType_FocusIn,
    QEventType_FocusOut:
      UpdateMask;
  end;
end;

function TaqCustomControl.GetAlignDisabled: Boolean;
const
{$IFDEF LINUX}
  CAlignLevelOffset = $13C;
{$ELSE}
  CAlignLevelOffset = $12C;
{$ENDIF}
begin
   // Fix for TWidgetControl: CLX guys forgot to define AlignDisabled property,
   // and we have to hack the private field FAlignLevel.
   // NOTE: This should be removed as soon as TWdigetControl will be fixed.
  Result := PWord(Cardinal(Pointer(Self)) + CAlignLevelOffset)^ > 0;
end;

function TaqCustomControl.GetCanvas: TCanvas;
begin
  Assert(FCanvas <> nil);
  Result := FCanvas;
end;

procedure TaqCustomControl.Invalidate;
begin
  inherited Invalidate;
  UpdateMask;
end;

procedure TaqCustomControl.MaskChanged;
begin
  if Masked then
    UpdateMask
  else
    QWidget_clearMask(Handle);
end;

procedure TaqCustomControl.Paint;
begin
  // By default, fill client rect with default Brush.
  Canvas.Brush := Brush;
  Canvas.FillRect(ClientRect);
end;

procedure TaqCustomControl.Painting(Sender: QObjectH;
  EventRegion: QRegionH);
begin
  TaqControlCanvas(FCanvas).DoubleBuffered := DoubleBuffered;
  TaqControlCanvas(FCanvas).StartPaint;
  try
    QPainter_setClipRegion(FCanvas.Handle, EventRegion);
    Paint;
  finally
    TaqControlCanvas(FCanvas).StopPaint;
  end;
end;

procedure TaqCustomControl.PaletteChanged(Sender: TObject);
begin
  // We disable palette updating to perform all painting in
  // the Paint method.
end;

procedure TaqCustomControl.UpdateMask;
var
  QB: QBitmapH;
  QP: QPainterH;
  Canvas: TCanvas;
begin
  if not Masked or not HandleAllocated then Exit;
  QB := QBitmap_create(Width, Height, True, QPixmapOptimization_DefaultOptim);
  try
    QP := QPainter_create(QB, Handle);
    Canvas := TCanvas.Create;
    try
      Canvas.Start(False);
      Canvas.Handle := QP;
      DrawMask(Canvas);
      Canvas.Stop;
    finally
      // QP is destroying here and becomes invalid after
      Canvas.Free;
    end;
    QWidget_setMask(Handle, QB);
  finally
    QBitmap_destroy(QB);
  end;
end;
{$ENDIF}

{$IFNDEF VCL}

{ TaqControlCanvas }

procedure TaqControlCanvas.BeginPainting;
begin
  if not QPainter_isActive(Handle) then
    if FDoubleBuffered and (Control <> nil) then
    begin
      FBitmap := TBitmap.Create;
      FBitmap.Handle := QPixmap_create(Control.Width, Control.Height, -1,
        QPixmapOptimization_DefaultOptim);
      Assert(Control is TWidgetControl);
      if not QPainter_begin(Handle, FBitmap.Handle, TWidgetControl(Control).Handle) then
        raise EInvalidGraphicOperation.Create(SInvalidCanvasState);
    end;
  inherited;
end;

destructor TaqControlCanvas.Destroy;
begin
  FreeAndNil(FBitmap);
  inherited;
end;

procedure TaqControlCanvas.StopPaint;
begin
  if (StartCount = 1) and FDoubleBuffered and (Control <> nil) and
    QPainter_isActive(FHandle) then
    bitBlt(TControlFriend(Control).GetPaintDevice, 0, 0, FBitmap.Handle, 0, 0, FBitmap.Width,
      FBitmap.Height, RasterOp_CopyROP, False);
  inherited StopPaint;
  if (StartCount = 0) and FDoubleBuffered and (Control <> nil) then
    FreeAndNil(FBitmap);
end;

{ TaqApplicationEvents }

procedure TaqApplicationEvents.Activate;
begin
  if Assigned(MultiCaster) then
    MultiCaster.Activate(Self);
end;

procedure TaqApplicationEvents.CancelDispatch;
begin
  if Assigned(MultiCaster) then
    MultiCaster.CancelDispatch;
end;

constructor TaqApplicationEvents.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  if Assigned(MultiCaster) then
    MultiCaster.AddAppEvent(Self);
end;

procedure TaqApplicationEvents.DoActionExecute(Action: TBasicAction;
  var Handled: Boolean);
begin
  if Assigned(FOnActionExecute) then FOnActionExecute(Action, Handled);
end;

procedure TaqApplicationEvents.DoActionUpdate(Action: TBasicAction;
  var Handled: Boolean);
begin
  if Assigned(FOnActionUpdate) then FOnActionUpdate(Action, Handled);
end;

procedure TaqApplicationEvents.DoActivate(Sender: TObject);
begin
  if Assigned(FOnActivate) then FOnActivate(Sender);
end;

procedure TaqApplicationEvents.DoDeactivate(Sender: TObject);
begin
  if Assigned(FOnDeactivate) then FOnDeactivate(Sender);
end;

procedure TaqApplicationEvents.DoException(Sender: TObject;
  E: Exception);
begin
  if not (E is EAbort) and Assigned(FOnException) then
    FOnException(Sender, E)
end;

function TaqApplicationEvents.DoHelp(HelpType: THelpType; HelpContext: THelpContext; 
 const HelpKeyword: String; const HelpFile: String; var Handled: Boolean): Boolean;
begin
  if Assigned(FOnHelp) then
    Result := FOnHelp(HelpType, HelpContext, HelpKeyword, HelpFile, Handled)
  else
    Result := False;
end;

procedure TaqApplicationEvents.DoHint(Sender: TObject);
begin
  if Assigned(FOnHint) then
    FOnHint(Sender)
  else
    with THintAction.Create(Self) do
    try
      Hint := Application.Hint;
      Execute;
    finally
      Free;
    end;
end;

procedure TaqApplicationEvents.DoIdle(Sender: TObject; var Done: Boolean);
begin
  if Assigned(FOnIdle) then FOnIdle(Sender, Done);
end;

procedure TaqApplicationEvents.DoMinimize(Sender: TObject);
begin
  if Assigned(FOnMinimize) then FOnMinimize(Sender);
end;

procedure TaqApplicationEvents.DoRestore(Sender: TObject);
begin
  if Assigned(FOnRestore) then FOnRestore(Sender);
end;

procedure TaqApplicationEvents.DoShortcut(Key: Integer; Shift: TShiftState;
  var Handled: Boolean);
begin
  if Assigned(FOnShortcut) then FOnShortcut(Key, Shift, Handled);
end;

procedure TaqApplicationEvents.DoShowHint(var HintStr: WideString;
  var CanShow: Boolean; var HintInfo: THintInfo);
begin
  if Assigned(FOnShowHint) then FOnShowHint(HintStr, CanShow, HintInfo);
end;

procedure TaqApplicationEvents.DoModalBegin(Sender: TObject);
begin
  if Assigned(FOnModalBegin) then FOnModalBegin(Sender);
end;

procedure TaqApplicationEvents.DoModalEnd(Sender: TObject);
begin
  if Assigned(FOnModalEnd) then FOnModalEnd(Sender);
end;

{ TMultiCaster }

procedure TMultiCaster.Activate(AppEvent: TaqApplicationEvents);
begin
  if CheckDispatching(AppEvent) and
    (FAppEvents.IndexOf(AppEvent) < FAppEvents.Count - 1) then
  begin
    FAppEvents.Remove(AppEvent);
    FAppEvents.Add(AppEvent);
  end;
end;

procedure TMultiCaster.AddAppEvent(AppEvent: TaqApplicationEvents);
begin
  if FAppEvents.IndexOf(AppEvent) = -1 then
    FAppEvents.Add(AppEvent);
end;

procedure TMultiCaster.BeginDispatch;
begin
  Inc(FDispatching);
end;

procedure TMultiCaster.CancelDispatch;
begin
  FCancelDispatching := True;
end;

function TMultiCaster.CheckDispatching(AppEvents: TaqApplicationEvents): Boolean;
begin
  Result := FDispatching = 0;
  if not Result then
    FCacheAppEvent := AppEvents;
end;

constructor TMultiCaster.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FAppEvents := TComponentList.Create(False);
  with Application do
  begin
    OnActionExecute := DoActionExecute;
    OnActionUpdate := DoActionUpdate;
    OnActivate := DoActivate;
    OnDeactivate := DoDeactivate;
    OnException := DoException;
    OnHelp := DoHelp;
    OnHint := DoHint;
    OnIdle := DoIdle;
    OnMinimize := DoMinimize;
    OnRestore := DoRestore;
    OnShowHint := DoShowHint;
    OnShortCut := DoShortcut;
    OnModalBegin := DoModalBegin;
    OnModalEnd := DoModalEnd;
  end;
end;

destructor TMultiCaster.Destroy;
begin
  MultiCaster := nil;
  with Application do
  begin
    OnActionExecute := nil;
    OnActionUpdate := nil;
    OnActivate := nil;
    OnDeactivate := nil;
    OnException := nil;
    OnHelp := nil;
    OnHint := nil;
    OnIdle := nil;
    OnMinimize := nil;
    OnRestore := nil;
    OnShowHint := nil;
    OnShortCut := nil;
    OnModalBegin := nil;
    OnModalEnd := nil;
  end;
  FAppEvents.Free;
  inherited Destroy;
end;

procedure TMultiCaster.DoActionExecute(Action: TBasicAction; var Handled: Boolean);
var
  I: Integer;
begin
  BeginDispatch;
  try
    for I := Count - 1 downto 0 do
    begin
      AppEvents[I].DoActionExecute(Action, Handled);
      if FCancelDispatching then Break;
    end;
  finally
    EndDispatch;
  end;
end;

procedure TMultiCaster.DoActionUpdate(Action: TBasicAction; var Handled: Boolean);
var
  I: Integer;
begin
  BeginDispatch;
  try
    for I := Count - 1 downto 0 do
    begin
      AppEvents[I].DoActionUpdate(Action, Handled);
      if FCancelDispatching then Break;
    end;
  finally
    EndDispatch;
  end;
end;

procedure TMultiCaster.DoActivate(Sender: TObject);
var
  I: Integer;
begin
  BeginDispatch;
  try
    for I := Count - 1 downto 0 do
    begin
      AppEvents[I].DoActivate(Sender);
      if FCancelDispatching then Break;
    end;
  finally
    EndDispatch;
  end;
end;

procedure TMultiCaster.DoDeactivate(Sender: TObject);
var
  I: Integer;
begin
  BeginDispatch;
  try
    for I := Count - 1 downto 0 do
    begin
      AppEvents[I].DoDeactivate(Sender);
      if FCancelDispatching then Break;
    end;
  finally
    EndDispatch;
  end;
end;

procedure TMultiCaster.DoException(Sender: TObject; E: Exception);
var
  I: Integer;
  FExceptionHandled: Boolean;
begin
  BeginDispatch;
  FExceptionHandled := False;
  try
    for I := Count - 1 downto 0 do
    begin
      if Assigned(AppEvents[I].OnException) then
      begin
        FExceptionHandled := True;
        AppEvents[I].DoException(Sender, E);
        if FCancelDispatching then Break;
      end;
    end;
  finally
    if not FExceptionHandled then
      if not (E is EAbort) then
        Application.ShowException(E);
    EndDispatch;
  end;
end;

function TMultiCaster.DoHelp(HelpType: THelpType; HelpContext: THelpContext;
  const HelpKeyword: String; const HelpFile: String; var Handled: Boolean): Boolean;
var
  I: Integer;
begin
  BeginDispatch;
  try
    Result := False;
    for I := Count - 1 downto 0 do
    begin
      Result := Result or AppEvents[I].DoHelp(HelpType, HelpContext, HelpKeyword, HelpFile, Handled);
      if FCancelDispatching then Break;
    end;
  finally
    EndDispatch;
  end;
end;

procedure TMultiCaster.DoHint(Sender: TObject);
var
  I: Integer;
begin
  BeginDispatch;
  try
    for I := Count - 1 downto 0 do
    begin
      AppEvents[I].DoHint(Sender);
      if FCancelDispatching then Break;
    end;
  finally
    EndDispatch;
  end;
end;

procedure TMultiCaster.DoIdle(Sender: TObject; var Done: Boolean);
var
  I: Integer;
begin
  BeginDispatch;
  try
    for I := Count - 1 downto 0 do
    begin
      AppEvents[I].DoIdle(Sender, Done);
      i

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?