cxcontrols.pas
来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,976 行 · 第 1/5 页
PAS
1,976 行
FPrevScreenCursor := Screen.Cursor;
Screen.Cursor := crHourglass;
end;
Inc(FHourglassCursorUseCount);
end;
{ popup menu routines }
function GetPopupMenuHeight(APopupMenu: TPopupMenu): Integer;
function IsOwnerDrawItem(AMenuItem: TMenuItem): Boolean;
begin
Result := APopupMenu.OwnerDraw or (AMenuItem.GetImageList <> nil) or
not AMenuItem.Bitmap.Empty;
end;
const
AMenuItemHeightCorrection = 4;
APopupMenuHeightCorrection = 4;
var
ACanvas: TcxScreenCanvas;
AMenuItemDefaultHeight, AMenuItemHeight, AMenuItemWidth, I: Integer;
begin
ACanvas := TcxScreenCanvas.Create;
try
ACanvas.Font.Assign(Screen.MenuFont);
AMenuItemDefaultHeight := ACanvas.TextHeight('Qg') + AMenuItemHeightCorrection;
Result := 0;
for I := 0 to APopupMenu.Items.Count - 1 do
if APopupMenu.Items[I].Visible then
begin
AMenuItemHeight := AMenuItemDefaultHeight;
if IsOwnerDrawItem(APopupMenu.Items[I]) then
TMenuItemAccess(APopupMenu.Items[I]).MeasureItem(ACanvas.Canvas,
AMenuItemWidth, AMenuItemHeight);
Inc(Result, AMenuItemHeight);
end;
Inc(Result, APopupMenuHeightCorrection);
finally
ACanvas.Free;
end;
end;
function IsPopupMenuShortCut(APopupMenu: TComponent;
var Message: TWMKey): Boolean;
var
AIcxPopupMenu: IcxPopupMenu;
begin
Result := False;
if APopupMenu = nil then
Exit;
if Supports(APopupMenu, IcxPopupMenu, AIcxPopupMenu) then
Result := AIcxPopupMenu.IsShortCutKey(Message)
else
Result := (APopupMenu is TPopupMenu) and (TPopupMenu(APopupMenu).WindowHandle <> 0) and
TPopupMenu(APopupMenu).IsShortCut(Message);
end;
function ShowPopupMenu(ACaller, AComponent: TComponent; X, Y: Integer): Boolean;
var
AIcxPopupMenu: IcxPopupMenu;
begin
Result := False;
if AComponent <> nil then
begin
Result := True;
if Supports(AComponent, IcxPopupMenu, AIcxPopupMenu) then
AIcxPopupMenu.Popup(X, Y)
else
if (AComponent is TPopupMenu) and TPopupMenu(AComponent).AutoPopup then
with TPopupMenu(AComponent) do
begin
PopupComponent := ACaller;
Popup(X, Y);
end
else
Result := False;
end;
end;
function ShowPopupMenuFromCursorPos(ACaller, AComponent: TComponent): Boolean;
var
P: TPoint;
begin
GetCursorPos(P);
Result := ShowPopupMenu(ACaller, AComponent, P.X, P.Y);
end;
function GetDragObject: TDragObject;
begin
Result := FDragObject;
end;
{ drag and drop arrow }
const
DragAndDropArrowWidth = 11;
DragAndDropArrowHeight = 9;
DragAndDropArrowBorderColor = clBlack;
DragAndDropArrowColor = clLime;
function GetDragAndDropArrowBounds(const AAreaBounds, AClientRect: TRect;
APlace: TcxArrowPlace): TRect;
procedure CheckResult;
begin
if IsRectEmpty(AClientRect) then Exit;
with AClientRect do
begin
Result.Left := Max(Result.Left, Left);
Result.Right := Max(Result.Right, Left);
Result.Left := Min(Result.Left, Right - 1);
Result.Right := Min(Result.Right, Right - 1);
Result.Top := Max(Result.Top, Top);
Result.Bottom := Max(Result.Bottom, Top);
Result.Top := Min(Result.Top, Bottom - 1);
Result.Bottom := Min(Result.Bottom, Bottom - 1);
end;
end;
procedure CalculateHorizontalArrowBounds;
begin
Result.Bottom := Result.Top + 1;
InflateRect(Result, 0, DragAndDropArrowWidth div 2);
if APlace = apLeft then
begin
Result.Right := Result.Left;
Dec(Result.Left, DragAndDropArrowHeight);
end
else
begin
Result.Left := Result.Right;
Inc(Result.Right, DragAndDropArrowHeight);
end;
end;
procedure CalculateVerticalArrowBounds;
begin
Result.Right := Result.Left + 1;
InflateRect(Result, DragAndDropArrowWidth div 2, 0);
if APlace = apTop then
begin
Result.Bottom := Result.Top;
Dec(Result.Top, DragAndDropArrowHeight);
end
else
begin
Result.Top := Result.Bottom;
Inc(Result.Bottom, DragAndDropArrowHeight);
end;
end;
begin
Result := AAreaBounds;
CheckResult;
if APlace in [apLeft, apRight] then
CalculateHorizontalArrowBounds
else
CalculateVerticalArrowBounds;
end;
procedure GetDragAndDropArrowPoints(const ABounds: TRect; APlace: TcxArrowPlace;
out P: TPointArray; AForRegion: Boolean);
procedure CalculatePointsForLeftArrow;
begin
with ABounds do
begin
P[0] := Point(Left + 3, Top - Ord(AForRegion));
P[1] := Point(Left + 3, Top + 3);
P[2] := Point(Left, Top + 3);
P[3] := Point(Left, Bottom - 4 + Ord(AForRegion));
P[4] := Point(Left + 3, Bottom - 4 + Ord(AForRegion));
P[5] := Point(Left + 3, Bottom - 1 + Ord(AForRegion));
P[6] := Point(Right - 1 + Ord(AForRegion), Top + 5);
end;
end;
procedure CalculatePointsForTopArrow;
begin
with ABounds do
begin
P[0] := Point(Left + 3, Top);
P[1] := Point(Right - 4 + Ord(AForRegion), Top);
P[2] := Point(Right - 4 + Ord(AForRegion), Top + 3);
P[3] := Point(Right - 1 + Ord(AForRegion), Top + 3);
P[4] := Point(Left + 5, Bottom - 1 + Ord(AForRegion));
P[5] := Point(Left, Top + 3);
P[6] := Point(Left + 3, Top + 3);
end;
end;
procedure CalculatePointsForRightArrow;
begin
with ABounds do
begin
P[0] := Point(Right - 4 + Ord(AForRegion), Top - Ord(AForRegion));
P[1] := Point(Right - 4 + Ord(AForRegion), Top + 3);
P[2] := Point(Right - 1 + Ord(AForRegion), Top + 3);
P[3] := Point(Right - 1 + Ord(AForRegion), Bottom - 4 + Ord(AForRegion));
P[4] := Point(Right - 4 + Ord(AForRegion), Bottom - 4 + Ord(AForRegion));
P[5] := Point(Right - 4 + Ord(AForRegion), Bottom - 1 + Ord(AForRegion));
P[6] := Point(Left, Top + 5);
end;
end;
procedure CalculatePointsForBottomArrow;
begin
with ABounds do
begin
P[0] := Point(Left + 3, Bottom - 1 + Ord(AForRegion));
P[1] := Point(Right - 4 + Ord(AForRegion), Bottom - 1 + Ord(AForRegion));
P[2] := Point(Right - 4 + Ord(AForRegion), Bottom - 4 + Ord(AForRegion));
P[3] := Point(Right - 1 + Ord(AForRegion), Bottom - 4 + Ord(AForRegion));
P[4] := Point(Left + 5, Top - Ord(AForRegion));
P[5] := Point(Left - Ord(AForRegion), Bottom - 4 + Ord(AForRegion));
P[6] := Point(Left + 3, Bottom - 4);
end;
end;
begin
SetLength(P, 7);
case APlace of
apLeft:
CalculatePointsForLeftArrow;
apTop:
CalculatePointsForTopArrow;
apRight:
CalculatePointsForRightArrow;
apBottom:
CalculatePointsForBottomArrow;
end;
end;
procedure DrawDragAndDropArrow(ACanvas: TcxCanvas; const ABounds: TRect;
APlace: TcxArrowPlace);
var
P: TPointArray;
begin
GetDragAndDropArrowPoints(ABounds, APlace, P, False);
ACanvas.Brush.Color := DragAndDropArrowColor;
ACanvas.Pen.Color := DragAndDropArrowBorderColor;
ACanvas.Polygon(P);
end;
{ other }
procedure DialogApplyFont(ADialog: TCustomForm; AFont: TFont);
function GetTextHeight: Integer;
begin
Result := ADialog.Canvas.TextHeight('Qq');
end;
var
AOldTextHeight, ANewTextHeight: Integer;
begin
with ADialog do
begin
AOldTextHeight := GetTextHeight;
Font := AFont;
ANewTextHeight := GetTextHeight;
TCustomFormAccess(ADialog).ScaleControls(ANewTextHeight, AOldTextHeight);
ClientWidth := MulDiv(ClientWidth, ANewTextHeight, AOldTextHeight);
ClientHeight := MulDiv(ClientHeight, ANewTextHeight, AOldTextHeight);
end;
end;
function DesignController: TcxDesignController;
begin
if (FDesignController = nil) and not FUnitIsFinalized then
FDesignController := TcxDesignController.Create;
Result := FDesignController;
end;
function GET_APPCOMMAND_LPARAM(lParam: LPARAM): Integer;
begin
Result := Short(HiWord(lParam) and not FAPPCOMMAND_MASK);
end;
{$IFNDEF DELPHI6}
function CheckWin32Version(AMajor: Integer; AMinor: Integer = 0): Boolean;
begin
Result := (Win32MajorVersion > AMajor) or
((Win32MajorVersion = AMajor) and (Win32MinorVersion >= AMinor));
end;
{$ENDIF}
{ TcxControlChildComponent }
constructor TcxControlChildComponent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Initialize;
end;
constructor TcxControlChildComponent.CreateEx(AControl: TcxControl; AAssignOwner: Boolean = True);
begin
//FControl := AControl;
if AAssignOwner then
Create(AControl.Owner)
else
Create(nil);
Control := AControl;
end;
destructor TcxControlChildComponent.Destroy;
begin
if FControl <> nil then
FControl.RemoveChildComponent(Self);
inherited;
end;
function TcxControlChildComponent.GetIsLoading: Boolean;
begin
Result := csLoading in ComponentState;
end;
function TcxControlChildComponent.GetIsDestroying: Boolean;
begin
Result := csDestroying in ComponentState;
end;
procedure TcxControlChildComponent.Initialize;
begin
end;
procedure TcxControlChildComponent.SetControl(Value: TcxControl);
begin
FControl := Value;
end;
procedure TcxControlChildComponent.SetParentComponent(Value: TComponent);
begin
inherited;
if Value is TcxControl then
TcxControl(Value).AddChildComponent(Self);
end;
function TcxControlChildComponent.GetParentComponent: TComponent;
begin
Result := FControl;
end;
function TcxControlChildComponent.HasParent: Boolean;
begin
Result := FControl <> nil;
end;
{ TcxControlScrollBar }
constructor TcxControlScrollBar.Create(AOwner: TComponent);
begin
inherited;
Color := clBtnFace;
ControlStyle := ControlStyle - [csFramed] + [csNoDesignVisible];
TabStop := False;
Visible := False;
end;
destructor TcxControlScrollBar.Destroy;
begin
cxClearObjectLinks(Self);
inherited Destroy;
end;
function TcxControlScrollBar.GetVisible: boolean;
begin
Result := inherited Visible;
end;
procedure TcxControlScrollBar.SetVisible(Value: boolean);
begin
inherited Visible := Value;
end;
procedure TcxControlScrollBar.CMDesignHitTest(var Message: TCMDesignHitTest);
begin
Message.Result := 1;
end;
procedure TcxControlScrollBar.WndProc(var Message: TMessage);
var
ALink: TcxObjectLink;
begin
ALink := cxAddObjectLink(Self);
try
if Message.Msg = WM_LBUTTONDOWN then
FocusParent;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?