📄 jvqjvclutils.pas
字号:
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 := S;
rgbGreen := S;
rgbBlue := S;
end;
end;
Dest.PixelFormat := Source.PixelFormat;
end;
procedure GetValueBitmap(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 := V;
rgbGreen := V;
rgbBlue := V;
end;
end;
Dest.PixelFormat := Source.PixelFormat;
end;
// (rom) a thread to wait would be more elegant, also JCL function available
function Execute(const CommandLine, WorkingDirectory: string): Integer;
{$IFDEF MSWINDOWS}
var
R: Boolean;
ProcessInformation: TProcessInformation;
StartupInfo: TStartupInfo;
ExCode: Cardinal;
begin
Result := 0;
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
with StartupInfo do
begin
cb := SizeOf(TStartupInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_SHOW;
end;
R := CreateProcess(
nil, // Pointer to name of executable module
PChar(CommandLine), // Pointer to command line string
nil, // Pointer to process security attributes
nil, // Pointer to thread security attributes
False, // handle inheritance flag
0, // creation flags
nil, // Pointer to new environment block
PChar(WorkingDirectory), // Pointer to current directory name
StartupInfo, // Pointer to STARTUPINFO
ProcessInformation); // Pointer to PROCESS_INFORMATION
if R then
while (GetExitCodeProcess(ProcessInformation.hProcess, ExCode) and
(ExCode = STILL_ACTIVE)) do
Application.ProcessMessages
else
Result := GetLastError;
end;
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
begin
if WorkingDirectory = '' then
Result := Libc.system(PChar(Format('cd "%s" ; %s',
[GetCurrentDir, CommandLine])))
else
Result := Libc.system(PChar(Format('cd "%s" ; %s',
[WorkingDirectory, CommandLine])));
end;
{$ENDIF UNIX}
{ imported from VCLFunctions }
procedure CenterHeight(const pc, pcParent: TControl);
begin
pc.Top := //pcParent.Top +
((pcParent.Height - pc.Height) div 2);
end;
function ToRightOf(const pc: TControl; piSpace: Integer): Integer;
begin
if pc <> nil then
Result := pc.Left + pc.Width + piSpace
else
Result := piSpace;
end;
{ compiled from ComCtrls.pas's implmentation section }
function HasFlag(A, B: Integer): Boolean;
begin
Result := (A and B) <> 0;
end;
function ConvertStates(const State: Integer): TItemStates;
begin
Result := [];
end;
function ChangeHasSelect(const peOld, peNew: TItemStates): Boolean;
begin
Result := (not (isSelected in peOld)) and (isSelected in peNew);
end;
function ChangeHasDeselect(const peOld, peNew: TItemStates): Boolean;
begin
Result := (isSelected in peOld) and (not (isSelected in peNew));
end;
function ChangeHasFocus(const peOld, peNew: TItemStates): Boolean;
begin
Result := (not (IsFocused in peOld)) and (IsFocused in peNew);
end;
function ChangeHasDefocus(const peOld, peNew: TItemStates): Boolean;
begin
Result := (IsFocused in peOld) and (not (IsFocused in peNew));
end;
function GetListItemColumn(const pcItem: TListItem; piIndex: Integer): string;
begin
if pcItem = nil then
begin
Result := '';
Exit;
end;
if (piIndex < 0) or (piIndex > pcItem.SubItems.Count) then
begin
Result := '';
Exit;
end;
if piIndex = 0 then
Result := pcItem.Caption
else
Result := pcItem.SubItems[piIndex - 1];
end;
{from JvVCLUtils }
{ Bitmaps }
type
TPrivateControl = class(TComponent)
protected
FVisible: Boolean;
end;
procedure CopyParentImage(Control: TControl; Dest: TCanvas);
var
Pixmap: QPixmapH;
DestDev: QPaintDeviceH;
pdm: QPaintDeviceMetricsH;
OrigVisible: Boolean;
begin
if (Control = nil) or (Control.Parent = nil) then
Exit;
Dest.Start;
try
DestDev := QPainter_device(Dest.Handle);
with Control.Parent do
ControlState := ControlState + [csPaintCopy];
try
pdm := QPaintDeviceMetrics_create(DestDev);
try
Pixmap := QPixmap_create(Control.Width, Control.Height,
QPaintDeviceMetrics_depth(pdm), QPixmapOptimization_DefaultOptim);
finally
QPaintDeviceMetrics_destroy(pdm);
end;
OrigVisible := TPrivateControl(Control).FVisible;
TPrivateControl(Control).FVisible := False; // do not draw the Control itself
try
QPixmap_grabWidget(Pixmap, Control.Parent.Handle, Control.Left,
Control.Top, Control.Width, Control.Height);
Qt.bitBlt(DestDev, 0, 0, Pixmap, 0, 0, Control.Width,
Control.Height, Qt.RasterOp_CopyROP, True);
finally
TPrivateControl(Control).FVisible := OrigVisible;
QPixmap_destroy(Pixmap);
end;
finally
with Control.Parent do
ControlState := ControlState - [csPaintCopy];
end;
finally
Dest.Stop;
end;
end;
function MakeModuleBitmap(Module: THandle; ResID: PChar): TBitmap;
begin
Result := TBitmap.Create;
try
if Module <> 0 then
begin
if LongRec(ResID).Hi = 0 then
Result.LoadFromResourceID(Module, LongRec(ResID).Lo)
else
Result.LoadFromResourceName(Module, StrPas(ResID));
end
else
begin
ResourceNotFound(ResID);
end;
except
Result.Free;
Result := nil;
end;
end;
function MakeBitmap(ResID: PChar): TBitmap;
begin
Result := MakeModuleBitmap(HInstance, ResID);
end;
function MakeBitmapID(ResID: Word): TBitmap;
begin
Result := MakeModuleBitmap(HInstance, MakeIntResource(ResID));
end;
procedure AssignBitmapCell(Source: TGraphic; Dest: TBitmap;
Cols, Rows, Index: Integer);
var
CellWidth, CellHeight: Integer;
begin
if (Source <> nil) and (Dest <> nil) then
begin
if Cols <= 0 then
Cols := 1;
if Rows <= 0 then
Rows := 1;
if Index < 0 then
Index := 0;
CellWidth := Source.Width div Cols;
CellHeight := Source.Height div Rows;
with Dest do
begin
Width := CellWidth;
Height := CellHeight;
end;
if Source is TBitmap then
begin
Dest.Canvas.CopyRect(Bounds(0, 0, CellWidth, CellHeight),
TBitmap(Source).Canvas, Bounds((Index mod Cols) * CellWidth,
(Index div Cols) * CellHeight, CellWidth, CellHeight));
Dest.TransparentColor := TBitmap(Source).TransparentColor;
end
else
begin
Dest.Canvas.Brush.Color := clSilver;
Dest.Canvas.FillRect(Bounds(0, 0, CellWidth, CellHeight));
Dest.Canvas.Draw(-(Index mod Cols) * CellWidth,
-(Index div Cols) * CellHeight, Source);
end;
Dest.Transparent := Source.Transparent;
end;
end;
{ Transparent bitmap }
procedure StretchBltTransparent(DstDC: HDC; DstX, DstY, DstW, DstH: Integer;
SrcDC: HDC; SrcX, SrcY, SrcW, Srch: Integer; Dummy: Integer;
TransparentColor: TColorRef);
var
Color: TColorRef;
bmAndBack, bmAndObject, bmAndMem, bmSave: QPixmapH;
bmBackOld, bmObjectOld, bmMemOld, bmSaveOld: QPixmapH;
MemDC, BackDC, ObjectDC, SaveDC: QPainterH;
begin
{ Create some DCs to hold temporary data }
BackDC := CreateCompatibleDC(DstDC);
ObjectDC := CreateCompatibleDC(DstDC);
MemDC := CreateCompatibleDC(DstDC);
SaveDC := CreateCompatibleDC(DstDC);
{ Create a bitmap for each DC }
bmAndObject := CreateBitmap(SrcW, Srch, 1, 1, nil);
bmAndBack := CreateBitmap(SrcW, Srch, 1, 1, nil);
bmAndMem := CreateCompatibleBitmap(DstDC, DstW, DstH);
bmSave := CreateCompatibleBitmap(DstDC, SrcW, Srch);
{ Each DC must select a bitmap object to store pixel data }
bmBackOld := SelectObject(BackDC, bmAndBack);
bmObjectOld := SelectObject(ObjectDC, bmAndObject);
bmMemOld := SelectObject(MemDC, bmAndMem);
bmSaveOld := SelectObject(SaveDC, bmSave);
{ Save the bitmap sent here }
BitBlt(SaveDC, 0, 0, SrcW, Srch, SrcDC, SrcX, SrcY, SRCCOPY);
{ Set the background color of the source DC to the color, }
{ contained in the parts of the bitmap that should be transparent }
Color := SetBkColor(SaveDC, PaletteColor(TransparentColor));
{ Create the object mask for the bitmap by performing a BitBlt() }
{ from the source bitmap to a monochrome bitmap }
BitBlt(ObjectDC, 0, 0, SrcW, Srch, SaveDC, 0, 0, SRCCOPY);
{ Set the background color of the source DC back to the original }
SetBkColor(SaveDC, Color);
{ Create the inverse of the object mask }
BitBlt(BackDC, 0, 0, SrcW, Srch, ObjectDC, 0, 0, NOTSRCCOPY);
{ Copy the background of the main DC to the destination }
BitBlt(MemDC, 0, 0, DstW, DstH, DstDC, DstX, DstY, SRCCOPY);
{ Mask out the places where the bitmap will be placed }
StretchBlt(MemDC, 0, 0, DstW, DstH, ObjectDC, 0, 0, SrcW, Srch, SRCAND);
{ Mask out the transparent colored pixels on the bitmap }
BitBlt(SaveDC, 0, 0, SrcW, Srch, BackDC, 0, 0, SRCAND);
{ XOR the bitmap with the background on the destination DC }
StretchBlt(MemDC, 0, 0, DstW, DstH, SaveDC, 0, 0, SrcW, Srch, SRCPAINT);
{ Copy the destination to the screen }
BitBlt(DstDC, DstX, DstY, DstW, DstH, MemDC, 0, 0, SRCCOPY);
{ Delete the memory bitmaps }
DeleteObject(SelectObject(BackDC, bmBackOld));
DeleteObject(SelectObject(ObjectDC, bmObjectOld));
DeleteObject(SelectObject(MemDC, bmMemOld));
DeleteObject(SelectObject(SaveDC, bmSaveOld));
{ Delete the memory DCs }
DeleteDC(MemDC);
DeleteDC(BackDC);
DeleteDC(ObjectDC);
DeleteDC(SaveDC);
end;
procedure DrawTransparentBitmapRect(DC: HDC; Bitmap: HBITMAP; DstX, DstY,
DstW, DstH: Integer; SrcRect: TRect; TransparentColor: TColorRef);
var
hdcTemp: HDC;
begin
hdcTemp := CreateCompatibleDC(DC);
try
SelectObject(hdcTemp, Bitmap);
with SrcRect do
StretchBltTransparent(DC, DstX, DstY, DstW, DstH, hdcTemp,
Left, Top, Right - Left, Bottom - Top, 0, TransparentColor);
finally
DeleteDC(hdcTemp);
end;
end;
procedure DrawTransparentBitmap(DC: HDC; Bitmap: HBITMAP;
DstX, DstY: Integer; TransparentColor: TColorRef);
var
BM: tagBITMAP;
begin
GetObject(Bitmap, SizeOf(BM), @BM);
DrawTransparentBitmapRect(DC, Bitmap, DstX, DstY, BM.bmWidth, BM.bmHeight,
Rect(0, 0, BM.bmWidth, BM.bmHeight), TransparentColor);
end;
procedure StretchBitmapTransparent(Dest: TCanvas; Bitmap: TBitmap;
TransparentColor: TColor; DstX, DstY, DstW, DstH, SrcX, SrcY,
SrcW, Srch: Integer);
var
CanvasChanging: TNotifyEvent;
begin
if DstW <= 0 then
DstW := Bitmap.Width;
if DstH <= 0 then
DstH := Bitmap.Height;
if (SrcW <= 0) or (Srch <= 0) then
begin
SrcX := 0;
SrcY := 0;
SrcW := Bitmap.Width;
Srch := Bitmap.Height;
end;
Dest.Start;
if not Bitmap.Monochrome then
SetStretchBltMode(Dest.Handle, STRETCH_DELETESCANS);
CanvasChanging := Bitmap.Canvas.OnChanging;
Bitmap.Canvas.Lock;
try
Bitmap.Canvas.OnChanging := nil;
Bitmap.Canvas.Start;
if TransparentColor = clNone then
begin
StretchBlt(Dest.Handle, DstX, DstY, DstW, DstH, Bitmap.Canvas.Handle,
SrcX, SrcY, SrcW, Srch, Cardinal(Dest.CopyMode));
end
else
begin
if TransparentColor = clDefault then
TransparentColor := Bitmap.Canvas.Pixels[0, Bitmap.Height - 1];
if Bitmap.Monochrome then
TransparentColor := clWhite
else
TransparentColor := ColorToRGB(TransparentColor);
StretchBltTransparent(Dest.Handle, DstX, DstY, DstW, DstH,
Bitmap.Canvas.Handle, SrcX, SrcY, SrcW, Srch,
0, TransparentColor);
end;
Bitmap.Canvas.Stop;
finally
Bitmap.Canvas.OnChanging := CanvasChanging;
Bitmap.Canvas.Unlock;
Dest.Stop;
end;
end;
procedure StretchBitmapRectTransparent(Dest: TCanvas; DstX, DstY,
DstW, DstH: Integer; SrcRect: TRect; Bitmap: TBitmap;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -