📄 jvqjvclutils.pas
字号:
procedure PointChange(Sender: TObject);
function GetHeight: Integer;
function GetWidth: Integer;
procedure SetHeight(Value: Integer);
procedure SetWidth(Value: Integer);
protected
procedure DoChange;
public
constructor Create;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
property TopLeft: TJvPoint read FTopLeft write SetTopLeft;
property BottomRight: TJvPoint read FBottomRight write SetBottomRight;
property Width: Integer read GetWidth write SetWidth;
property Height: Integer read GetHeight write SetHeight;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
published
property Left: Integer read GetLeft write SetLeft;
property Top: Integer read GetTop write SetTop;
property Right: Integer read GetRight write SetRight;
property Bottom: Integer read GetBottom write SetBottom;
end;
{ begin JvCtrlUtils }
//------------------------------------------------------------------------------
// ToolBarMenu
//------------------------------------------------------------------------------
procedure JvCreateToolBarMenu(AForm: TForm; AToolBar: TToolBar;
AMenu: TMainMenu = nil);
//------------------------------------------------------------------------------
// ListView functions
//------------------------------------------------------------------------------
type
PJvLVItemStateData = ^TJvLVItemStateData;
TJvLVItemStateData = record
Caption: string;
Data: Pointer;
Focused: Boolean;
Selected: Boolean;
end;
{ listview functions }
function ConvertStates(const State: Integer): TItemStates;
function ChangeHasDeselect(const peOld, peNew: TItemStates): Boolean;
function ChangeHasSelect(const peOld, peNew: TItemStates): Boolean;
function ChangeHasDefocus(const peOld, peNew: TItemStates): Boolean;
function ChangeHasFocus(const peOld, peNew: TItemStates): Boolean;
function GetListItemColumn(const pcItem: TListItem; piIndex: Integer): string;
procedure JvListViewToStrings(ListView: TListView; Strings: TStrings;
SelectedOnly: Boolean = False; Headers: Boolean = True);
function JvListViewSafeSubItemString(Item: TListItem; SubItemIndex: Integer): string;
procedure JvListViewSortClick(Column: TListColumn;
AscendingSortImage: Integer = -1; DescendingSortImage: Integer = -1);
procedure JvListViewCompare(ListView: TListView; Item1, Item2: TListItem;
var Compare: Integer);
procedure JvListViewSelectAll(ListView: TListView; Deselect: Boolean = False);
function JvListViewSaveState(ListView: TListView): TJvLVItemStateData;
function JvListViewRestoreState(ListView: TListView; Data: TJvLVItemStateData;
MakeVisible: Boolean = True; FocusFirst: Boolean = False): Boolean;
//------------------------------------------------------------------------------
// MessageBox
//------------------------------------------------------------------------------
function JvMessageBox(const Text, Caption: string; Flags: DWORD): Integer; overload;
function JvMessageBox(const Text: string; Flags: DWORD): Integer; overload;
{ end JvCtrlUtils }
procedure UpdateTrackFont(TrackFont, Font: TFont; TrackOptions: TJvTrackFontOptions);
// Returns the size of the image
// used for checkboxes and radiobuttons.
// Originally from Mike Lischke
function GetDefaultCheckBoxSize: TSize;
function CanvasMaxTextHeight(Canvas: TCanvas): Integer;
{$IFDEF MSWINDOWS}
// AllocateHWndEx works like Classes.AllocateHWnd but does not use any virtual memory pages
function AllocateHWndEx(Method: Classes.TWndMethod; const AClassName: string = ''): Windows.HWND;
// DeallocateHWndEx works like Classes.DeallocateHWnd but does not use any virtual memory pages
procedure DeallocateHWndEx(Wnd: Windows.HWND);
function JvMakeObjectInstance(Method: Classes.TWndMethod): Pointer;
procedure JvFreeObjectInstance(ObjectInstance: Pointer);
{$ENDIF MSWINDOWS}
function GetAppHandle: HWND;
// DrawArrow draws a standard arrow in any of four directions and with the specifed color.
// Rect is the area to draw the arrow in and also defines the size of the arrow
// Note that this procedure might shrink Rect so that it's width and height is always
// the same and the width and height are always even, i.e calling with
// Rect(0,0,12,12) (odd) is the same as calling with Rect(0,0,11,11) (even)
// Direction defines the direction of the arrow. If Direction is akLeft, the arrow point is
// pointing to the left
procedure DrawArrow(Canvas: TCanvas; Rect: TRect; Color: TColor = clBlack; Direction: TAnchorKind = akBottom);
function IsPositiveResult(Value: TModalResult): Boolean;
function IsNegativeResult(Value: TModalResult): Boolean;
function IsAbortResult(const Value: TModalResult): Boolean;
function StripAllFromResult(const Value: TModalResult): TModalResult;
// returns either BrightColor or DarkColor depending on the luminance of AColor
// This function gives the same result (AFAIK) as the function used in Windows to
// calculate the desktop icon text color based on the desktop background color
function SelectColorByLuminance(AColor, DarkColor, BrightColor: TColor): TColor;
// (peter3) implementation moved from JvHTControls.
type
TJvHTMLCalcType = (htmlShow, htmlCalcWidth, htmlCalcHeight);
procedure HTMLDrawTextEx(Canvas: TCanvas; Rect: TRect;
const State: TOwnerDrawState; const Text: string; var Width: Integer;
CalcType: TJvHTMLCalcType; MouseX, MouseY: Integer; var MouseOnLink: Boolean;
var LinkName: string; Scale: Integer = 100);
function HTMLDrawText(Canvas: TCanvas; Rect: TRect;
const State: TOwnerDrawState; const Text: string; Scale: Integer = 100): string;
function HTMLTextWidth(Canvas: TCanvas; Rect: TRect;
const State: TOwnerDrawState; const Text: string; Scale: Integer = 100): Integer;
function HTMLPlainText(const Text: string): string;
function HTMLTextHeight(Canvas: TCanvas; const Text: string; Scale: Integer = 100): Integer;
function HTMLPrepareText(const Text: string): string;
implementation
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
SysConst,
{$IFDEF MSWINDOWS}
CommCtrl, MMSystem, ShlObj, ActiveX,
{$ENDIF MSWINDOWS}
QConsts,
Math,
JclSysInfo,
JvQConsts, JvQProgressUtils, JvQResources;
{$IFDEF MSWINDOWS}
{$R ..\Resources\JvConsts.res}
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
{$R ../Resources/JvConsts.res}
{$ENDIF UNIX}
{$IFDEF MSWINDOWS}
const
RC_ControlRegistry = 'Control Panel\Desktop';
RC_WallPaperStyle = 'WallpaperStyle';
RC_WallpaperRegistry = 'Wallpaper';
RC_TileWallpaper = 'TileWallpaper';
RC_RunCpl = 'rundll32.exe shell32,Control_RunDLL ';
{$ENDIF MSWINDOWS}
function GetAppHandle: HWND;
begin
Result := Application.AppWidget;
end;
type
TWaitCursor = class(TInterfacedObject, IInterface)
private
FCursor: TCursor;
public
constructor Create(ACursor: TCursor);
destructor Destroy; override;
end;
constructor TWaitCursor.Create(ACursor: TCursor);
begin
inherited Create;
FCursor := Screen.Cursor;
Screen.Cursor := ACursor;
end;
destructor TWaitCursor.Destroy;
begin
Screen.Cursor := FCursor;
inherited Destroy;
end;
type
TIconAccessProtected = class(TIcon);
function Icon2Bitmap(Ico: TIcon): TBitmap;
begin
Result := TBitmap.Create;
TIconAccessProtected(Ico).AssignTo(Result);
end;
function Bitmap2Icon(Bmp: TBitmap): TIcon;
begin
Result := TIcon.Create;
Result.Assign(Bmp);
end;
procedure RGBToHSV(R, G, B: Integer; var H, S, V: Integer);
var
QC: QColorH;
begin
QC := QColor_create(R, G, B);
QColor_getHsv(QC, @H, @S, @V);
QColor_destroy(QC);
end;
(* (rom) to be deleted. Use ScreenShot from JCL
{$IFDEF VCL}
function CaptureScreen(Rec: TRect): TBitmap;
const
NumColors = 256;
var
R: TRect;
C: TCanvas;
LP: PLogPalette;
TmpPalette: HPALETTE;
Size: Integer;
begin
Result := TBitmap.Create;
Result.Width := Rec.Right - Rec.Left;
Result.Height := Rec.Bottom - Rec.Top;
R := Rec;
C := TCanvas.Create;
try
C.Handle := GetDC(HWND_DESKTOP);
Result.Canvas.CopyRect(Rect(0, 0, Rec.Right - Rec.Left, Rec.Bottom -
Rec.Top), C, R);
Size := SizeOf(TLogPalette) + (Pred(NumColors) * SizeOf(TPaletteEntry));
LP := AllocMem(Size);
try
LP^.palVersion := $300;
LP^.palNumEntries := NumColors;
GetSystemPaletteEntries(C.Handle, 0, NumColors, LP^.palPalEntry);
TmpPalette := CreatePalette(LP^);
Result.Palette := TmpPalette;
DeleteObject(TmpPalette);
finally
FreeMem(LP, Size);
end
finally
ReleaseDC(HWND_DESKTOP, C.Handle);
C.Free;
end;
end;
function CaptureScreen(IncludeTaskBar: Boolean): TBitmap;
var
R: TRect;
begin
if IncludeTaskBar then
R := Rect(0, 0, Screen.Width, Screen.Height)
else
SystemParametersInfo(SPI_GETWORKAREA, 0, Pointer(@R), 0);
Result := CaptureScreen(R);
end;
function CaptureScreen(WndHandle: Longword): TBitmap;
var
R: TRect;
WP: TWindowPlacement;
begin
if GetWindowRect(WndHandle, R) then
begin
GetWindowPlacement(WndHandle, @WP);
if IsIconic(WndHandle) then
ShowWindow(WndHandle, SW_RESTORE);
BringWindowToTop(WndHandle);
Result := CaptureScreen(R);
SetWindowPlacement(WndHandle, @WP);
end
else
Result := nil;
end;
{$ENDIF VCL}
*)
{$IFDEF MSWINDOWS}
procedure SetWallpaper(const Path: string);
begin
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, PChar(Path), SPIF_UPDATEINIFILE);
end;
procedure SetWallpaper(const Path: string; Style: TJvWallpaperStyle);
begin
with TRegistry.Create do
begin
OpenKey(RC_ControlRegistry, False);
case Style of
wpTile:
begin
WriteString(RC_TileWallpaper, '1');
WriteString(RC_WallPaperStyle, '0');
end;
wpCenter:
begin
WriteString(RC_TileWallpaper, '0');
WriteString(RC_WallPaperStyle, '0');
end;
wpStretch:
begin
WriteString(RC_TileWallpaper, '0');
WriteString(RC_WallPaperStyle, '2');
end;
end;
WriteString(RC_WallpaperRegistry, Path);
Free;
end;
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, nil, SPIF_SENDWININICHANGE);
end;
{$ENDIF MSWINDOWS}
procedure GetRBitmap(var Dest: TBitmap; const Source: TBitmap);
var
I, J: Integer;
Line: PJvRGBArray;
begin
if not Assigned(Dest) then
Dest := TBitmap.Create;
Dest.Assign(Source);
Dest.PixelFormat := pf24bit;
for J := Dest.Height - 1 downto 0 do
begin
Line := Dest.ScanLine[J];
for I := Dest.Width - 1 downto 0 do
begin
Line[I].rgbGreen := 0;
Line[I].rgbBlue := 0;
end;
end;
Dest.PixelFormat := Source.PixelFormat;
end;
procedure GetBBitmap(var Dest: TBitmap; const Source: TBitmap);
var
I, J: Integer;
Line: PJvRGBArray;
begin
if not Assigned(Dest) then
Dest := TBitmap.Create;
Dest.Assign(Source);
Dest.PixelFormat := pf24bit;
for J := Dest.Height - 1 downto 0 do
begin
Line := Dest.ScanLine[J];
for I := Dest.Width - 1 downto 0 do
begin
Line[I].rgbRed := 0;
Line[I].rgbGreen := 0;
end;
end;
Dest.PixelFormat := Source.PixelFormat;
end;
procedure GetGBitmap(var Dest: TBitmap; const Source: TBitmap);
var
I, J: Integer;
Line: PJvRGBArray;
begin
if not Assigned(Dest) then
Dest := TBitmap.Create;
Dest.Assign(Source);
Dest.PixelFormat := pf24bit;
for J := Dest.Height - 1 downto 0 do
begin
Line := Dest.ScanLine[J];
for I := Dest.Width - 1 downto 0 do
begin
Line[I].rgbRed := 0;
Line[I].rgbBlue := 0;
end;
end;
Dest.PixelFormat := Source.PixelFormat;
end;
procedure GetMonochromeBitmap(var Dest: TBitmap; const Source: TBitmap);
begin
if not Assigned(Dest) then
Dest := TBitmap.Create;
Dest.Assign(Source);
Dest.Monochrome := True;
end;
procedure GetHueBitmap(var Dest: TBitmap; const Source: TBitmap);
var
I, J, H, S, V: Integer;
Line: PJvRGBArray;
begin
if not Assigned(Dest) then
Dest := TBitmap.Create;
Dest.Assign(Source);
Dest.PixelFormat := pf24bit;
for J := Dest.Height - 1 downto 0 do
begin
Line := Dest.ScanLine[J];
for I := Dest.Width - 1 downto 0 do
with Line[I] do
begin
RGBToHSV(rgbRed, rgbGreen, rgbBlue, H, S, V);
rgbRed := H;
rgbGreen := H;
rgbBlue := H;
end;
end;
Dest.PixelFormat := Source.PixelFormat;
end;
procedure GetSaturationBitmap(var Dest: TBitmap; const Source: TBitmap);
var
I, J, H, S, V: Integer;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -