expertcad/POWERCAD30/UNITS/PCPanel.pas
2025-05-12 10:07:51 +03:00

484 lines
12 KiB
ObjectPascal

unit PCPanel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls,CanvasPanel,buttons,PCScrollBar,Menus,
PCTypesUtils;
type
TRulerType = (rtDeciMilim , rtHalfMilim, rtMilim, rtHalfCMeter, rtCentiMeter,
rtDeciMeter);
TRulerPanel = class(TCanvasPanel)
end;
(*vbclassexport begin*)
TPCPanel = class(TCustomPanel)
private
{ Private declarations }
FRulerVisible : Boolean;
FPanelVisible : Boolean;
FRulerStart : TPoint;
HStart : integer;
VStart : integer;
Fdpm: Double;
FPosition : TPoint;
FRType : TRulerType;
FOnZoomIn : TNotifyEvent;
FOnZoomOut : TNotifyEvent;
FOnZoomArea : TNotifyEvent;
FOnActualSize : TNotifyEvent;
FOnFitToWindow : TNotifyEvent;
FVertZero: TVertZero;
FHorzZero: THorzZero;
fLock: Boolean;
fUpdated: Boolean;
FAutoRefresh: Boolean;
procedure setVertZero(const Value: TVertZero);
procedure setHorzZero(const Value: THorzZero);
procedure CNKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN;
function IsMenuKey(var Message: TWMKey): Boolean;
procedure SetAutoRefresh(const Value: Boolean);
protected
{ Protected declarations }
FEventEngines: TList;
Procedure DoZoomIn;virtual;
Procedure DoZoomOut;virtual;
Procedure DoZoomArea;virtual;
Procedure DoZoomActualSize;virtual;
Procedure DoZoomFitToWindow;virtual;
Procedure WhenResize(sender: TObject);
Procedure WhenDOver(Sender, Source: TObject; X, Y: Integer; State: TDragState;var Accept: Boolean);
Procedure raiseEvent(sender: TObject);
Procedure setRuler(Value: TPoint);
Procedure setRulerType(value : TRulerType);
Procedure setDpm(value: Extended);
Procedure setPosition(value: TPoint);
Procedure setRulerVisible(value: boolean);
Procedure SyncEnv;virtual;
Procedure ROChanged;virtual;
Function DoKeyEvents( Message: TWMKey): Boolean;virtual;
Function GetBackColor:Tcolor;virtual;
public
{ Public declarations }
evRulers : TEventEngine;
evRulerSys : TEventEngine;
Container : TScrollBox;
CustomSurface:TCanvas;
CustomWnd: HWND;
Procedure PrintMessage(Mes:String);Virtual;(*vb*)
Procedure Refresh;virtual; (*vb*)
Function ClientToScreen(const Point: TPoint): TPoint;(*vb*)
function ScreenToClient(const Point: TPoint): TPoint;(*vb*)
Function RegisterEvent(EventId:Integer;Client: TObject;CallBackProc:TEventCallBack):Pointer;overload;
Function RegisterEvent(EventId:Integer;Client: Integer;CallBackProc:TEventCallBack):Pointer;overload;
Procedure UnRegisterEvent(EventId:Integer;EventHandle:Pointer);
Function FindEventEngine(EventId: Integer):TEventEngine;
Function EventEngine(EventId: Integer;NumVal:Integer;StrVal:String;DblVal:Double):TEventEngine;
Constructor create(aowner: Tcomponent);override;
Destructor Destroy;override;
Procedure SetCustomSurface(CWindow:HWnD; CDC:HDC);virtual;(*vb*)
Procedure DoResize;(*vb*)
Property TracePosition: TPoint read FPosition write setPosition;
Property DotsPerMil: Double read Fdpm;(*vb*)
Property RulerStart: TPoint read FRulerStart write setRuler;
Property RulerType : TRulerType read FRType write setRulerType;
Property Locked: Boolean read fLock write fLock;(*vb*)
Property Updated: Boolean read fUpdated write fUpdated; (*vb*)
Property AutoRefresh : Boolean read FAutoRefresh write SetAutoRefresh; (*vb*)
property DockManager;
published
{ Published declarations }
Property RulerVisible : Boolean read FRulerVisible write setRulerVisible;(*vb*)
Property VerticalZero : TVertZero read FVertZero write setVertZero;(*vb*)
Property HorizontalZero : THorzZero read FHorzZero write setHorzZero;(*vb*)
property Align;
property BevelInner;
property BevelOuter;
property BorderWidth;
property BorderStyle;
property Visible;
Property OnKeyDown;
Property OnKeyUp;
Property OnZoomIn: TnotifyEvent read FOnZoomIn write FOnZoomIn;(*vb*)
Property OnZoomOut: TnotifyEvent read FOnZoomOut write FOnZoomOut;(*vb*)
Property OnZoomArea: TnotifyEvent read FOnZoomArea write FOnZoomArea;(*vb*)
Property OnZoomActualSize: TnotifyEvent read FOnActualSize write FOnActualSize; (*vb*)
Property OnZoomFitToWindow: TNotifyEvent read FOnFitToWindow write FOnFitToWindow; (*vb*)
end;
(*vbclassexport end*)
implementation
uses U_Common, U_BaseCommon;
{$R *.RES}
{$R *.DCR}
Constructor TPCPanel.create(aowner: Tcomponent);
begin
inherited create(aowner);
Container := TScrollBox.create(self);
Container.DoubleBuffered := True;
caption := '';
Onresize := WhenResize;
Container.align := alclient;
Container.parent := self;
Container.visible := true;
Container.color := clwhite;
FvertZero := vzTop;
FHorzZero := vzLeft;
Fdpm := 4;
FRulerStart.x := - 5000;
FRulerStart.y := - 5000;
FRType := rtMilim;
FPosition.x := -5000;
FPosition.y := -5000;
FRulerVisible := True;
FPanelVisible := True;
FEventEngines := TList.Create;
evRulers := EventEngine(cRulers,1,'',0);
end;
Procedure TPCPanel.setDpm(value: extended);
begin
Fdpm := value;
end;
Procedure TPCPanel.setRulerVisible(value: Boolean);
begin
FRulerVisible := value;
evRulers.RaiseEvent(value);
Refresh;
SyncEnv;
end;
Procedure TPCPAnel.raiseEvent(sender: TObject);
Var Button : TSpeedButton;
Idx : Integer;
Begin
if not (sender is TSpeedButton) then exit;
Button := (sender as TSpeedButton);
Idx := Button.Tag;
case Idx Of
1: begin
DoZoomIn;
end;
2: begin
DoZoomOut;
end;
3: begin
DoZoomArea;
end;
4: begin
DoZoomActualSize;
end;
5: begin
DoZoomFitToWindow;
end;
end;
End;
Procedure TPCPAnel.WhenResize(sender: TObject);
Var p: TPoint;
begin
if FrulerStart.x = -5000 then
begin
p.x:= 0; p.y:=0;
setruler(ClientToScreen(p));
end;
end;
Procedure TPCPAnel.setRuler(value: TPoint);
begin
FRulerStart.x := Value.x;
FRulerStart.y := Value.y;
end;
Procedure TPCPAnel.setPosition(value: TPoint);
var HPos,vpos : integer;
cPoint : TPoint;
begin
If (not RulerVisible) then
begin
FPosition := value;
exit;
end;
(*
FrulerH.canvas.pen.mode := PmXor;
FrulerH.canvas.pen.color := clSilver xor clred;
FrulerH.canvas.pen.style := psDot;
FrulerV.canvas.pen.mode := PmXor;
FrulerV.canvas.pen.color := clSilver xor ClRed;
FrulerV.canvas.pen.style := psDot;
cPoint := FRulerH.screentoclient(FPosition);
HPos := cpoint.x;
cPoint := FRulerV.screentoclient(FPosition);
VPos := cpoint.y;
FRulerH.Canvas.moveto(HPos,0);
FRulerH.Canvas.lineto(HPos,FrulerH.Height);
FRulerV.Canvas.moveto(0,VPos);
FRulerV.Canvas.lineto(FrulerV.Width,VPos);
FPosition := value;
cPoint := FRulerH.screentoclient(FPosition);
HPos := cpoint.x;
cPoint := FRulerV.screentoclient(FPosition);
VPos := cpoint.y;
FRulerH.Canvas.moveto(HPos,0);
FRulerH.Canvas.lineto(HPos,FrulerH.Height);
FRulerV.Canvas.moveto(0,VPos);
FRulerV.Canvas.lineto(FrulerV.Width,VPos);
FrulerH.canvas.pen.mode := PmCopy;
FrulerH.canvas.pen.color := ClBlack;
FrulerH.canvas.pen.style := psSolid;
FrulerV.canvas.pen.mode := PmCopy;
FrulerV.canvas.pen.color := ClBlack;
FrulerV.canvas.pen.style := psSolid;
*)
end;
Procedure TPCPAnel.setRulerType(value: TRulerType);
begin
if Value <> FRtype then //07.08.2012
begin
FRtype := Value;
Refresh;
end;
end;
Procedure TPCPanel.WhenDOver(Sender, Source: TObject; X, Y: Integer; State: TDragState;var Accept: Boolean);
var cp : TcanvasPanel;
begin
if not(sender is TCanvasPanel) then exit;
cp := sender as TCanvasPanel;
end;
Procedure TPCPanel.SyncEnv;
Begin
End;
Procedure TPCPanel.DoZoomIn;
begin
if assigned(FOnZoomIn) then FOnZoomIn(self);
end;
Procedure TPCPanel.DoZoomOut;
begin
if assigned(FOnZoomOut) then FOnZoomOut(self);
end;
Procedure TPCPanel.DoZoomArea;
begin
if assigned(FOnZoomArea) then FOnZoomArea(self);
end;
Procedure TPCPanel.DoZoomActualSize;
begin
if assigned(FOnActualSize) then FOnActualSize(self);
end;
Procedure TPCPanel.DoZoomFitToWindow;
begin
if assigned(FOnFitToWindow) then FOnFitToWindow(self);
end;
procedure TPCPanel.setHorzZero(const Value: THorzZero);
begin
FHorzZero := Value;
Refresh;
ROChanged;
end;
procedure TPCPanel.setVertZero(const Value: TVertZero);
begin
FVertZero := Value;
Refresh;
ROChanged;
end;
Procedure TPCPanel.ROChanged;
begin
end;
procedure TPCPanel.CNKeyDown(var Message: TWMKeyDown);
begin
Message.Result := 1;
if DoKeyEvents(Message) then exit;
if IsMenuKey(Message) then Exit;
// GetParentForm(Self).Perform(CM_DIALOGKEY, CharCode, KeyData) <> 0) then Exit
inherited;
// Message.Result := 0;
end;
function TPCPanel.IsMenuKey(var Message: TWMKey): Boolean;
var
Form: TCustomForm;
LocalPopupMenu: TPopupMenu;
begin
Result := True;
if not (csDesigning in ComponentState) then
begin
LocalPopupMenu := PopupMenu;
if Assigned(LocalPopupMenu) and (LocalPopupMenu.WindowHandle <> 0) and
LocalPopupMenu.IsShortCut(Message) then Exit;
Form := GetParentForm(Self);
if (Form <> nil) and Form.IsShortCut(Message) then Exit;
end;
Result := False;
end;
function TPCPanel.DoKeyEvents(Message: TWMKey): Boolean;
begin
result := false;
end;
Function TPCPanel.FindEventEngine(EventId: Integer):TEventEngine;
var i: Integer;
Engine: TEventEngine;
Begin
Result := nil;
For i := 0 to FeventEngines.Count - 1 do
begin
Engine := TEventEngine(FeventEngines[i]);
if Engine.EventId = EventId then begin
Result := Engine;
Exit;
end;
end;
End;
Function TPCPanel.RegisterEvent(EventId: Integer;
Client: TObject;CallBackProc: TEventCallBack):Pointer;
Var Engine: TEventEngine;
begin
Result := nil;
Engine := FindEventEngine(EventId);
if Assigned(Engine) then
Result := Engine.RegisterClient(Client,CallbackProc);
end;
procedure TPCPanel.UnRegisterEvent(EventId: Integer;
Eventhandle: Pointer);
Var Engine: TEventEngine;
begin
Engine := FindEventEngine(EventId);
if Assigned(Engine) then
Engine.UnRegisterClient(EventHandle);
end;
Function TPCPanel.EventEngine(EventId: Integer;NumVal:Integer;StrVal:String;DblVal:Double):TEventEngine;
begin
Result := TEventEngine.Create(EventId,NumVal,StrVal,DblVal);
FEventEngines.Add(Result);
end;
procedure TPCPanel.SetCustomSurface(CWindow: HWnD; CDC:HDC);
var xCanvas:TCanvas;
begin
if CWindow = 0 then begin
CustomSurface := nil;
CustomWnd := 0;
end else begin
CustomWnd := CWindow;
xCanvas := TControlCanvas.Create;
if CDC = 0 then cdc := GetDc(CWindow);
xCanvas.Handle := cdc;
CustomSurface := xCanvas;
end;
end;
function TPCPanel.GetBackColor: Tcolor;
begin
result := clSilver;
end;
procedure TPCPanel.DoResize;
begin
WhenResize(nil);
end;
function TPCPanel.ClientToScreen(const Point: TPoint): TPoint;
begin
if CustomWnd = 0 then
result := inherited ClientToScreen(point)
else begin
Result := Classes.Point(point.x,point.y);
Windows.ClientToScreen(CustomWnd, Result);
end;
end;
function TPCPanel.ScreenToClient(const Point: TPoint): TPoint;
begin
if CustomWnd = 0 then
result := inherited ScreenToClient(point)
else begin
Result := Classes.Point(point.x,point.y);
Windows.ScreenToClient(CustomWnd, Result);
end;
end;
procedure TPCPanel.Refresh;
begin
end;
destructor TPCPanel.Destroy;
var
i: Integer;
begin
try
for i := 0 to FEVentEngines.Count-1 do
begin
TeventEngine(FEVentEngines[i]).Free;
end;
FEventEngines.Free;
inherited destroy;
except
// on E: Exception do AddExceptionToLog(CPowerCadMessage + 'TPCPanel.Destroy' + E.Message);
end;
end;
procedure TPCPanel.PrintMessage(Mes: String);
begin
end;
procedure TPCPanel.SetAutoRefresh(const Value: Boolean);
begin
FAutoRefresh := Value;
end;
function TPCPanel.RegisterEvent(EventId: Integer; Client: Integer;
CallBackProc: TEventCallBack): Pointer;
Var Engine: TEventEngine;
begin
Result := nil;
Engine := FindEventEngine(EventId);
if Assigned(Engine) then
Result := Engine.RegisterClient(TObject(Client),CallbackProc);
end;
end.