You've already forked lazarus-ccr
251 lines
7.2 KiB
ObjectPascal
251 lines
7.2 KiB
ObjectPascal
![]() |
{******************************************************************
|
||
|
|
||
|
JEDI-VCL Demo
|
||
|
|
||
|
Copyright (C) 2002 Project JEDI
|
||
|
|
||
|
Original author:
|
||
|
|
||
|
Contributor(s):
|
||
|
|
||
|
You may retrieve the latest version of this file at the JEDI-JVCL
|
||
|
home page, located at http://jvcl.delphi-jedi.org
|
||
|
|
||
|
The contents of this file are used with permission, subject to
|
||
|
the Mozilla Public License Version 1.1 (the "License"); you may
|
||
|
not use this file except in compliance with the License. You may
|
||
|
obtain a copy of the License at
|
||
|
http://www.mozilla.org/MPL/MPL-1_1Final.html
|
||
|
|
||
|
Software distributed under the License is distributed on an
|
||
|
"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||
|
implied. See the License for the specific language governing
|
||
|
rights and limitations under the License.
|
||
|
|
||
|
******************************************************************}
|
||
|
|
||
|
unit ViewerFrm;
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
SysUtils, Classes, Graphics, Controls, Forms,
|
||
|
Dialogs, ExtCtrls, ComCtrls, ActnList, Menus;
|
||
|
|
||
|
type
|
||
|
TfrmImageViewer = class(TForm)
|
||
|
StatusBar1: TStatusBar;
|
||
|
ScrollBox1: TScrollBox;
|
||
|
Image1: TImage;
|
||
|
ActionList1: TActionList;
|
||
|
acFullScreen: TAction;
|
||
|
acClose: TAction;
|
||
|
PopupMenu1: TPopupMenu;
|
||
|
FullScreen1: TMenuItem;
|
||
|
Close1: TMenuItem;
|
||
|
procedure FormResize(Sender: TObject);
|
||
|
procedure FormCreate(Sender: TObject);
|
||
|
procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
|
||
|
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
|
||
|
procedure acFullScreenExecute(Sender: TObject);
|
||
|
procedure FormShow(Sender: TObject);
|
||
|
procedure acCloseExecute(Sender: TObject);
|
||
|
procedure FormKeyDown(Sender: TObject; var Key: Word;
|
||
|
Shift: TShiftState);
|
||
|
private
|
||
|
procedure AdjustFormSize;
|
||
|
public
|
||
|
class function View(const Filename: string; Transparent: Boolean; BackColor: TColor): Boolean; overload;
|
||
|
class function View(Picture: TPicture; Transparent: Boolean; BackColor: TColor): Boolean; overload;
|
||
|
end;
|
||
|
|
||
|
implementation
|
||
|
uses
|
||
|
Math, LCLType, LCLIntf;
|
||
|
|
||
|
{$R *.lfm}
|
||
|
|
||
|
class function TfrmImageViewer.View(const Filename: string; Transparent: Boolean; BackColor: TColor): Boolean;
|
||
|
var
|
||
|
frmImageViewer: TfrmImageViewer;
|
||
|
begin
|
||
|
frmImageViewer := Self.Create(Application);
|
||
|
try
|
||
|
frmImageViewer.Image1.Transparent := Transparent;
|
||
|
frmImageViewer.Image1.Picture.LoadFromFile(Filename);
|
||
|
frmImageViewer.Caption := Filename;
|
||
|
frmImageViewer.ScrollBox1.Color := BackColor;
|
||
|
with frmImageViewer.Image1 do
|
||
|
frmImageViewer.StatusBar1.Panels[0].Text := Format('(%s) - %d x %d',
|
||
|
[Picture.Graphic.ClassName, Picture.Width, Picture.Height]);
|
||
|
frmImageViewer.Left := (Screen.Width - frmImageViewer.Width) div 2;
|
||
|
frmImageViewer.Top := (Screen.Height - frmImageViewer.Height) div 2;
|
||
|
frmImageViewer.ShowModal;
|
||
|
Result := True;
|
||
|
finally
|
||
|
frmImageViewer.Free;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
class function TfrmImageViewer.View(Picture: TPicture; Transparent: Boolean; BackColor: TColor): Boolean;
|
||
|
var
|
||
|
frmImageViewer: TfrmImageViewer;
|
||
|
begin
|
||
|
frmImageViewer := Self.Create(Application);
|
||
|
try
|
||
|
frmImageViewer.Image1.Picture.Assign(Picture);
|
||
|
frmImageViewer.Image1.Transparent := Transparent;
|
||
|
frmImageViewer.Caption := Picture.Graphic.ClassName;
|
||
|
frmImageViewer.ScrollBox1.Color := BackColor;
|
||
|
frmImageViewer.StatusBar1.Panels[0].Text := Format(' (%s) - %d x %d',
|
||
|
[Picture.Graphic.ClassName, Picture.Width, Picture.Height]);
|
||
|
frmImageViewer.Left := (Screen.Width - frmImageViewer.Width) div 2;
|
||
|
frmImageViewer.Top := (Screen.Height - frmImageViewer.Height) div 2;
|
||
|
|
||
|
frmImageViewer.ShowModal;
|
||
|
Result := True;
|
||
|
finally
|
||
|
frmImageViewer.Free;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmImageViewer.FormResize(Sender: TObject);
|
||
|
begin
|
||
|
// make sure these are set correctly
|
||
|
// Image1.AutoSize := True;
|
||
|
// Image1.Center := True;
|
||
|
if ScrollBox1.ClientWidth < Image1.Width then
|
||
|
Image1.Left := -ScrollBox1.HorzScrollBar.Position
|
||
|
else
|
||
|
Image1.Left := (ScrollBox1.ClientWidth - Image1.Width) div 2;
|
||
|
if ScrollBox1.ClientHeight < Image1.Height then
|
||
|
Image1.Top := -ScrollBox1.VertScrollBar.Position
|
||
|
else
|
||
|
Image1.Top := (ScrollBox1.ClientHeight - Image1.Height) div 2;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmImageViewer.FormCreate(Sender: TObject);
|
||
|
begin
|
||
|
// minimize flicker
|
||
|
ScrollBox1.DoubleBuffered := True;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmImageViewer.FormMouseWheel(Sender: TObject;
|
||
|
Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
|
||
|
var Handled: Boolean);
|
||
|
begin
|
||
|
// handle wheel event in form so scrolbox doesn't have to be focused to scroll
|
||
|
Handled := True;
|
||
|
if ScrollBox1.VertScrollBar.IsScrollBarVisible and not (ssShift in Shift) then
|
||
|
ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position - WheelDelta
|
||
|
else
|
||
|
ScrollBox1.HorzScrollBar.Position := ScrollBox1.HorzScrollBar.Position - WheelDelta;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmImageViewer.acFullScreenExecute(Sender: TObject);
|
||
|
//var
|
||
|
// P: TWindowPlacement;
|
||
|
begin
|
||
|
acFullScreen.Checked := not acFullScreen.Checked;
|
||
|
//FillChar(P, SizeOf(P), 0);
|
||
|
//P.length := SizeOf(P);
|
||
|
// get default and current values
|
||
|
//GetWindowPlacement(Handle, @P);
|
||
|
// adjust UI
|
||
|
if acFullScreen.Checked then
|
||
|
begin
|
||
|
BorderStyle := bsNone;
|
||
|
StatusBar1.Visible := False;
|
||
|
//P.showCmd := SW_SHOWMAXIMIZED;
|
||
|
WindowState := wsFullScreen;
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
BorderStyle := bsSizeable;
|
||
|
StatusBar1.Visible := True;
|
||
|
//P.showCmd := SW_RESTORE;
|
||
|
WindowState := wsNormal;
|
||
|
end;
|
||
|
// set new size/position
|
||
|
//SetWindowPlacement(Handle, @P);
|
||
|
end;
|
||
|
|
||
|
procedure TfrmImageViewer.AdjustFormSize;
|
||
|
var
|
||
|
R: TRect;
|
||
|
W, H: Integer;
|
||
|
begin
|
||
|
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
|
||
|
W := R.Right - R.Left;
|
||
|
H := R.Bottom - R.Top;
|
||
|
with Image1 do
|
||
|
begin
|
||
|
if Picture.Width > Self.Width then
|
||
|
begin
|
||
|
if Picture.Width + 32 < W then
|
||
|
Self.Width := Picture.Width + 32
|
||
|
else
|
||
|
Self.Width := W;
|
||
|
Self.Left := R.Left + (W - Self.Width) div 2;
|
||
|
end;
|
||
|
if Picture.Height + StatusBar1.Height > Self.Height then
|
||
|
begin
|
||
|
if Picture.Height + 32 < H then
|
||
|
Self.Height := Picture.Height + StatusBar1.Height + 32
|
||
|
else
|
||
|
Self.Height := H;
|
||
|
Self.Top := R.Top + (H - Self.Height) div 2;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmImageViewer.FormShow(Sender: TObject);
|
||
|
begin
|
||
|
AdjustFormSize;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmImageViewer.acCloseExecute(Sender: TObject);
|
||
|
begin
|
||
|
if acFullScreen.Checked then
|
||
|
acFullScreen.Execute
|
||
|
else
|
||
|
Close;
|
||
|
end;
|
||
|
|
||
|
procedure TfrmImageViewer.FormKeyDown(Sender: TObject; var Key: Word;
|
||
|
Shift: TShiftState);
|
||
|
var
|
||
|
Value: Integer;
|
||
|
begin
|
||
|
if ssCtrl in Shift then
|
||
|
Value := 10
|
||
|
else
|
||
|
Value := 1;
|
||
|
case Key of
|
||
|
VK_LEFT:
|
||
|
with ScrollBox1.HorzScrollBar do
|
||
|
Position := Position - Increment * Value;
|
||
|
VK_RIGHT:
|
||
|
with ScrollBox1.HorzScrollBar do
|
||
|
Position := Position + Increment * Value;
|
||
|
VK_UP:
|
||
|
with ScrollBox1.VertScrollBar do
|
||
|
Position := Position - Increment * Value;
|
||
|
VK_DOWN:
|
||
|
with ScrollBox1.VertScrollBar do
|
||
|
Position := Position + Increment * Value;
|
||
|
VK_PRIOR:
|
||
|
ScrollBox1.VertScrollBar.Position := 0;
|
||
|
VK_NEXT:
|
||
|
with ScrollBox1.VertScrollBar do
|
||
|
Position := Range;
|
||
|
VK_HOME:
|
||
|
ScrollBox1.HorzScrollBar.Position := 0;
|
||
|
VK_END:
|
||
|
with ScrollBox1.HorzScrollBar do
|
||
|
Position := Range;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
end.
|