cximage.pas
来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,762 行 · 第 1/4 页
PAS
1,762 行
procedure TcxCustomImage.CopyToClipboard;
begin
if (FPicture <> nil) and (FPicture.Graphic <> nil) then
Clipboard.Assign(FPicture);
end;
procedure TcxCustomImage.CutToClipboard;
begin
CopyToClipboard;
EditAndClear;
end;
function TcxCustomImage.Focused: Boolean;
begin
Result := FIsDialogShowed or inherited Focused;
end;
class function TcxCustomImage.GetPropertiesClass: TcxCustomEditPropertiesClass;
begin
Result := TcxCustomImageProperties;
end;
procedure TcxCustomImage.LoadFromFile;
function GetDialogFilter: string;
var
AGraphicClass: TGraphicClass;
begin
if ActiveProperties.CustomFilter <> '' then
Result := ActiveProperties.CustomFilter
else
begin
AGraphicClass := ActiveProperties.GraphicClass;
if AGraphicClass <> nil then
Result := GraphicFilter(AGraphicClass)
else
Result := GraphicFilter(TGraphic);
end;
end;
var
ADialog: TOpenPictureDialog;
begin
if not CanModify then
Exit;
ADialog := TOpenPictureDialog.Create(nil);
try
FIsDialogShowed := True;
ADialog.Filter := GetDialogFilter;
if ADialog.Execute and DoEditing then
begin
FPicture.LoadFromFile(ADialog.FileName);
DoClosePopup(crEnter);
end
else
DoClosePopup(crCancel);
Application.ProcessMessages;
finally
FIsDialogShowed := False;
ADialog.Free;
end;
end;
procedure TcxCustomImage.PasteFromClipboard;
{$IFDEF USEJPEGIMAGE}
var
AGraphicClass: TGraphicClass;
AGraphic: TJPEGImage;
{$ENDIF}
begin
if CanPasteFromClipboard and DoEditing then
if Clipboard.HasFormat(CF_BITMAP) then
begin
{$IFDEF USEJPEGIMAGE}
AGraphicClass := GetGraphicClass(True);
if (AGraphicClass = TJPEGImage) then
begin
AGraphic := TJPEGImage.Create;
try
TJPEGImageAccess(AGraphic).NewBitmap;
TJPEGImageAccess(AGraphic).Bitmap.Assign(Clipboard);
AGraphic.JPEGNeeded;
FPicture.Graphic := AGraphic;
finally
AGraphic.Free;
end;
end
else
{$ENDIF}
FPicture.Bitmap.Assign(Clipboard);
end
else
FPicture.Assign(Clipboard);
end;
procedure TcxCustomImage.SaveToFile;
var
ADialog: TSavePictureDialog;
begin
if (FPicture = nil) or (FPicture.Graphic = nil) then
Exit;
ADialog := TSavePictureDialog.Create(Application);
FIsDialogShowed := True;
try
if ActiveProperties.CustomFilter <> '' then
ADialog.Filter := ActiveProperties.CustomFilter
else
ADialog.Filter := GraphicFilter(TGraphicClass(FPicture.Graphic.ClassType));
ADialog.DefaultExt := GraphicExtension(TGraphicClass(FPicture.Graphic.ClassType));
if ADialog.Execute then
FPicture.SaveToFile(ADialog.FileName);
Application.ProcessMessages;
finally
FIsDialogShowed := False;
ADialog.Free;
end;
end;
{ TcxImage }
class function TcxImage.GetPropertiesClass: TcxCustomEditPropertiesClass;
begin
Result := TcxImageProperties;
end;
function TcxImage.GetActiveProperties: TcxImageProperties;
begin
Result := TcxImageProperties(InternalGetActiveProperties);
end;
function TcxImage.GetProperties: TcxImageProperties;
begin
Result := TcxImageProperties(FProperties);
end;
procedure TcxImage.SetProperties(Value: TcxImageProperties);
begin
FProperties.Assign(Value);
end;
{ TcxImageViewInfo }
destructor TcxImageViewInfo.Destroy;
begin
if FFreePicture then
Picture.Free;
FTempBitmap.Free;
inherited Destroy;
end;
procedure TcxImageViewInfo.DrawTransparentBackground(ACanvas: TcxCanvas; const R: TRect);
begin
ACanvas.SaveClipRegion;
try
ACanvas.SetClipRegion(TcxRegion.Create(R), roIntersect);
cxDrawTransparentControlBackground(Edit, ACanvas, Bounds);
finally
ACanvas.RestoreClipRegion;
end;
end;
procedure TcxImageViewInfo.InternalPaint(ACanvas: TcxCanvas);
procedure FocusRect(ACanvas: TCanvas; R: TRect);
begin
ACanvas.Brush.Style := bsClear;
ACanvas.Rectangle(R);
ACanvas.Brush.Style := bsSolid;
end;
var
CR, R, Temp: TRect;
NeedDrawBkg: Boolean;
SaveRgn: TcxRegion;
ARealStretch: Boolean;
begin
CR := ClientRect;
if Self.Transparent then
DrawTransparentBackground(ACanvas, Bounds);
with ACanvas do
begin
if not Assigned(Picture) or IsPictureEmpty(Picture) then
begin
inherited InternalPaint(ACanvas);
Brush.Color := BackgroundColor;
if Caption <> '' then
begin
Brush.Style := bsClear;
Canvas.Font.Assign(Self.Font);
Canvas.Font.Color := Self.TextColor;
ACanvas.DrawText(Caption, CR, cxAlignCenter + cxSingleLine);
Brush.Style := bsSolid;
end;
if ShowFocusRect then FocusRect(Canvas, CR);
Exit;
end;
with CR do
begin
ARealStretch := Stretch or (Proportional and
((Picture.Height > cxRectHeight(CR)) or (Picture.Width > cxRectWidth(CR))));
if ARealStretch then
begin
if Proportional then
CalcStretchRect(CR, Picture.Width, Picture.Height, R)
else
R := CR;
end
else
R := cxRectBounds(Left, Top, Picture.Width, Picture.Height);
if Center then
begin
OffsetRect(R, (Right - Left - cxRectWidth(R)) div 2, 0);
OffsetRect(R, 0, (Bottom - Top - cxRectHeight(R)) div 2);
end
else
OffsetRect(R, -Self.TopLeft.X, -Self.TopLeft.Y);
end;
SaveRgn := GetClipRegion; // for native mode
ExcludeClipRect(CR);
DrawCustomEdit(ACanvas, Self, False, bpsSolid);
SetClipRegion(SaveRgn, roSet);
if ShowFocusRect then
begin
FocusRect(Canvas, CR);
InflateRect(CR, -1, -1);
end;
SaveRgn := GetClipRegion;
IntersectClipRect(CR);
if ShowFocusRect then InflateRect(CR, 1, 1);
if not Self.Transparent and Picture.Graphic.Transparent then
begin
if FTempBitmap = nil then
begin
FTempBitmap := TBitmap.Create;
FTempBitmap.PixelFormat := pfDevice;
end;
try
FTempBitmap.Width := R.Right - R.Left;
FTempBitmap.Height := R.Bottom - R.Top;
FTempBitmap.Canvas.Brush.Color := BackgroundColor;
FTempBitmap.Canvas.FillRect(Rect(0, 0, FTempBitmap.Width, FTempBitmap.Height));
FTempBitmap.Canvas.StretchDraw(Rect(0, 0, FTempBitmap.Width, FTempBitmap.Height), Picture.Graphic);
Canvas.Draw(R.Left, R.Top, FTempBitmap);
except
on EOutOfResources do
begin
Canvas.Brush.Color := BackgroundColor;
Canvas.FillRect(ClientRect);
Canvas.StretchDraw(R, Picture.Graphic);
end;
end;
end
else
Canvas.StretchDraw(R, Picture.Graphic);
NeedDrawBkg := not (IntersectRect(Temp, R, CR) and EqualRect(Temp, CR)) and not Self.Transparent;
if NeedDrawBkg then
begin
ExcludeClipRect(R);
Brush.Color := BackgroundColor;
FillRect(CR);
end;
SetClipRegion(SaveRgn, roSet);
end;
end;
function TcxImageViewInfo.IsRepaintOnStateChangingNeeded: Boolean;
begin
Result := (not Assigned(Picture) or IsPictureEmpty(Picture)) and (Caption <> '');
end;
{ TcxImageViewData }
procedure TcxImageViewData.Calculate(ACanvas: TcxCanvas;
const ABounds: TRect; const P: TPoint; Button: TcxMouseButton;
Shift: TShiftState; AViewInfo: TcxCustomEditViewInfo; AIsMouseEvent: Boolean);
var
AProperties: TcxCustomImageProperties;
begin
inherited Calculate(ACanvas, ABounds, P, Button, Shift, AViewInfo, AIsMouseEvent);
if IsRectEmpty(ABounds) then
Exit;
AProperties := TcxCustomImageProperties(Properties);
with TcxImageViewInfo(AViewInfo) do
begin
Caption := AProperties.Caption;
Center := AProperties.Center;
ShowFocusRect := AProperties.ShowFocusRect and Focused and not IsInplace;
Stretch := AProperties.Stretch;
Proportional := AProperties.Proportional;
if Center or Stretch then
TopLeft := Point(0, 0);
end;
end;
procedure TcxImageViewData.EditValueToDrawValue(ACanvas: TcxCanvas;
const AEditValue: TcxEditValue; AViewInfo: TcxCustomEditViewInfo);
var
AGraphicClass: TGraphicClass;
begin
with TcxImageViewInfo(AViewInfo) do
if VarIsStr(AEditValue) and (AEditValue <> '') then
begin
if not Assigned(Picture) then
begin
Picture := TPicture.Create;
FFreePicture := True;
end;
AGraphicClass := TcxCustomImageProperties(Properties).GetGraphicClass(
InplaceEditParams.Position.Item, InplaceEditParams.Position.RecordIndex);
LoadPicture(Picture, AGraphicClass, AEditValue);
if TcxCustomImageProperties(Properties).GraphicTransparency <> gtDefault then
Picture.Graphic.Transparent :=
TcxCustomImageProperties(Properties).GraphicTransparency = gtTransparent;
end
else
if Assigned(Picture) then
Picture.Assign(nil);
end;
function TcxImageViewData.GetEditContentSize(ACanvas: TcxCanvas;
const AEditValue: TcxEditValue;
const AEditSizeProperties: TcxEditSizeProperties): TSize;
var
ABorderExtent: TRect;
AGraphicClass: TGraphicClass;
APicture: TPicture;
S: string;
begin
if IsInplace then
begin
if Edit <> nil then
begin
Result := Size(Edit.Width, Edit.Height);
ABorderExtent := GetBorderExtent;
Result.cx := Result.cx - (ABorderExtent.Left + ABorderExtent.Right);
Result.cy := Result.cy - (ABorderExtent.Top + ABorderExtent.Bottom);
end
else
with TcxCustomImageProperties(Properties) do
begin
Result := Size(0, DefaultHeight);
if VarIsStr(AEditValue) then
begin
AGraphicClass := GetGraphicClass(InplaceEditParams.Position.Item,
InplaceEditParams.Position.RecordIndex);
APicture := TPicture.Create;
try
S := AEditValue;
LoadPicture(APicture, AGraphicClass, S);
Result := Size(APicture.Width, APicture.Height);
finally
APicture.Free;
end;
if Stretch then
if (AEditSizeProperties.Width > 0) and (Result.cx > 0) then
Result := Size(AEditSizeProperties.Width, Round(Result.cy * AEditSizeProperties.Width / Result.cx))
else
if (AEditSizeProperties.Height > 0) and (Result.cy > 0) then
Result := Size(Round(Result.cx * AEditSizeProperties.Height / Result.cy), AEditSizeProperties.Height);
end
else
if Length(Caption) <> 0 then
begin
ACanvas.Font := Style.GetVisibleFont;
Result := ACanvas.TextExtent(Caption);
end;
end;
end
else
if Edit <> nil then
with TcxCustomImage(Edit) do
Result := Size(Picture.Width, Picture.Height)
else
Result := Size(0, 0);
end;
procedure LoadPopupMenuImages;
function GetResourceName(APopupMenuItem: TcxPopupMenuItem): string;
begin
case APopupMenuItem of
pmiCut:
Result := 'CXMENUIMAGE_CUT';
pmiCopy:
Result := 'CXMENUIMAGE_COPY';
pmiPaste:
Result := 'CXMENUIMAGE_PASTE';
pmiDelete:
Result := 'CXMENUIMAGE_DELETE';
pmiLoad:
Result := 'CXMENUIMAGE_LOAD';
pmiSave:
Result := 'CXMENUIMAGE_SAVE';
else
Result := '';
end;
end;
procedure LoadBitmapFromResource(ABitmap: TBitmap;
APopupMenuItem: TcxPopupMenuItem);
begin
ABitmap.LoadFromResourceName(HInstance, GetResourceName(APopupMenuItem));
end;
var
ABitmap: TBitmap;
APopupMenuItem: TcxPopupMenuItem;
begin
ABitmap := TBitmap.Create;
try
LoadBitmapFromResource(ABitmap, Low(TcxPopupMenuItem));
if cxGraphicPopupMenuImages = nil then
cxGraphicPopupMenuImages := TImageList.CreateSize(ABitmap.Width, ABitmap.Height);
cxGraphicPopupMenuImages.AddMasked(ABitmap, clDefault);
for APopupMenuItem := Succ(Low(TcxPopupMenuItem)) to High(TcxPopupMenuItem) do
begin
if APopupMenuItem = pmiCustom then
Continue;
LoadBitmapFromResource(ABitmap, APopupMenuItem);
cxGraphicPopupMenuImages.AddMasked(ABitmap, clDefault);
end;
finally
ABitmap.Free;
end;
end;
initialization
LoadPopupMenuImages;
GetRegisteredEditProperties.Register(TcxImageProperties, scxSEditRepositoryImageItem);
finalization
FreeAndNil(cxRegisteredGraphicClasses);
FreeAndNil(cxGraphicPopupMenuImages);
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?