unit area_ctrl; //{$DEFINE DEBUG} //{$DEFINE OWNEDWINDOW} interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, myLabel, mySize, myZoomBox; type TApp_TOOLDskCaptAreaCtrl = class(TForm) Timer_Zoom : TTimer; Timer_CaptureMove: TTimer; Panel_Cmd: TPanel; Panel_ZoomDown: TPanel; SpeedButton_ZoomDownLeft: TSpeedButton; SpeedButton_ZoomDownRight: TSpeedButton; SpeedButton_ZoomDownTop: TSpeedButton; SpeedButton_ZoomDownBottom: TSpeedButton; SpeedButton_ZoomDown: TSpeedButton; Label_ZoomDown: TMyLabel; Shape_Info2: TShape; Panel_ZoomUp: TPanel; SpeedButton_ZoomUpLeft: TSpeedButton; SpeedButton_ZoomUpTop: TSpeedButton; SpeedButton_ZoomUpBottom: TSpeedButton; SpeedButton_ZoomUpRight: TSpeedButton; SpeedButton_ZoomUp: TSpeedButton; Label_ZoomUp: TMyLabel; Shape_Info3: TShape; Panel_Move: TPanel; Label_Zoom: TMyLabel; SpeedButton_MoveLeft: TSpeedButton; SpeedButton_MoveUp: TSpeedButton; SpeedButton_MoveDown: TSpeedButton; SpeedButton_MoveRight: TSpeedButton; SpeedButton_CaptureExecute: TSpeedButton; Label_Move: TMyLabel; shpInfo: TShape; procedure FormCreate (Sender: TObject); procedure FormClose (Sender: TObject; var Action: TCloseAction); procedure FormShow (Sender: TObject); procedure FormHide (Sender: TObject); procedure FormKeyDown (Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); procedure SpeedButton_MoveLeftMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure SpeedButton_MoveLeftMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure SpeedButton_CaptureExecuteClick (Sender: TObject); procedure btnCapture_ToolCloseClick (Sender: TObject); procedure Timer_CaptureMoveTimer (Sender: TObject); procedure Timer_ZoomTimer (Sender: TObject); private { Private 宣言 } FCapture_MoveButton : TSpeedButton; procedure WMEraseBkGnd (var Msg: TMessage); message WM_ERASEBKGND; //ディスプレイ設定の変更 procedure WMDisplayChange(var Msg: TMessage); message WM_DISPLAYCHANGE; protected {$IFDEF OWNEDWINDOW} procedure CreateParams(var Params: TCreateParams); override; {$ENDIF} public { Public 宣言 } Paint_Zoom : TZoomBox; end; var App_TOOLDskCaptAreaCtrl: TApp_TOOLDskCaptAreaCtrl; implementation uses {$IFDEF DEBUG} myDebug, {$ENDIF} System.Types, myControl, myGraphic, // myMultiMonitor, myNum, myWindow, area; {$R *.dfm} {$IFDEF OWNEDWINDOW} procedure TApp_TOOLDskCaptAreaCtrl.CreateParams(var Params: TCreateParams); //オウンドウィンドウ作成 begin inherited; Params.WndParent := App_TOOLDskCaptArea.Handle; end; {$ENDIF} procedure TApp_TOOLDskCaptAreaCtrl.WMEraseBkGnd(var Msg: TMessage); begin //http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+200504/05040066.txt Msg.Result:=0; end; procedure TApp_TOOLDskCaptAreaCtrl.WMDisplayChange(var Msg: TMessage); //TScreenのMonitorsプロパティがディスプレイの変更に追随しない不具合の回避のためだけ。 begin Self.Monitor; Paint_Zoom.DisplayChange(nil); end; procedure TApp_TOOLDskCaptAreaCtrl.FormCreate(Sender: TObject); begin Self.DoubleBuffered := True; Panel_Move.DoubleBuffered := True; Panel_ZoomUp.DoubleBuffered := True; Panel_ZoomDown.DoubleBuffered := True; Paint_Zoom := TZoomBox.Create(Self); Paint_Zoom.Name := 'Paint_Zoom'; Paint_Zoom.Align := alClient; Paint_Zoom.BGColor := clBlack; Paint_Zoom.Zoom := 2; Paint_Zoom.Max := 10; Paint_Zoom.IsCenter := True; // Paint_Zoom.IsCenter := False; Paint_Zoom.IsMouseCursor := False; Paint_Zoom.IsLayeredWindow := True; //マウスカーソルがチラチラしてしまう。 Paint_Zoom.IsDragPosition := True; with App_TOOLDskCaptArea do begin Paint_Zoom.Position := App_TOOLDskCaptArea.ClientToScreen(Point(Image_LeftTop.Width, Image_LeftTop.Height)); // Paint_Zoom.Position := App_TOOLDskCaptArea.ClientOrigin; end; // Form_MyMonitor.OnDisplayChange := Paint_Zoom.DisplayChange; end; procedure TApp_TOOLDskCaptAreaCtrl.FormShow(Sender: TObject); begin Timer_Zoom.Enabled := True; end; procedure TApp_TOOLDskCaptAreaCtrl.FormHide(Sender: TObject); begin Timer_Zoom.Enabled := False; end; procedure TApp_TOOLDskCaptAreaCtrl.SpeedButton_MoveLeftMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); //スピードボタンで連続拡大・縮小・移動 var li_Delay: DWORD; begin if not(Sender is TSpeedButton) then begin Exit; end; FCapture_MoveButton := TSpeedButton(Sender); Timer_CaptureMoveTimer(nil); //http://mrxray.on.coocan.jp/Delphi/plSamples/S04_SystemParametersInfo_Interface.htm#03 if not(SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, @li_Delay, 0))then begin li_Delay := 250; end; Timer_CaptureMove.Interval := (li_Delay +1) * 250; Timer_CaptureMove.Enabled := True; end; procedure TApp_TOOLDskCaptAreaCtrl.SpeedButton_MoveLeftMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); //連続拡大・縮小・移動の終了 begin Timer_CaptureMove.Enabled := False; end; procedure TApp_TOOLDskCaptAreaCtrl.Timer_CaptureMoveTimer(Sender: TObject); //タイマーを使って連続入力 var li_Value : Integer; li_KeySpeed : DWORD; begin if (gfnbKeyState(VK_SHIFT)) then begin li_Value := 10; end else begin li_Value := 1; end; //移動 if (FCapture_MoveButton = SpeedButton_MoveLeft) then begin App_TOOLDskCaptArea.Move(-li_Value, 0); end else if (FCapture_MoveButton = SpeedButton_MoveRight) then begin App_TOOLDskCaptArea.Move(li_Value, 0); end else if (FCapture_MoveButton = SpeedButton_MoveUp) then begin App_TOOLDskCaptArea.Move(0, -li_Value); end else if (FCapture_MoveButton = SpeedButton_MoveDown) then begin App_TOOLDskCaptArea.Move(0, li_Value); end else if (FCapture_MoveButton = SpeedButton_ZoomUp) then begin App_TOOLDskCaptArea.Zoom(li_Value); end else if (FCapture_MoveButton = SpeedButton_ZoomDown) then begin App_TOOLDskCaptArea.Zoom(-li_Value); end else //拡大 if (FCapture_MoveButton = SpeedButton_ZoomUpLeft) then begin App_TOOLDskCaptArea.Zoom(-1, 0, +1, 0); end else if (FCapture_MoveButton = SpeedButton_ZoomUpTop) then begin App_TOOLDskCaptArea.Zoom(0, -1, 0, +1); end else if (FCapture_MoveButton = SpeedButton_ZoomUpRight) then begin App_TOOLDskCaptArea.Zoom(0, 0, +1, 0); end else //縮小 if (FCapture_MoveButton = SpeedButton_ZoomUpBottom) then begin App_TOOLDskCaptArea.Zoom(0, 0, 0, +1); end else if (FCapture_MoveButton = SpeedButton_ZoomDownLeft) then begin App_TOOLDskCaptArea.Zoom(+1, 0, -1, 0); end else if (FCapture_MoveButton = SpeedButton_ZoomDownRight) then begin App_TOOLDskCaptArea.Zoom(0, 0, -1, 0); end else if (FCapture_MoveButton = SpeedButton_ZoomDownTop) then begin App_TOOLDskCaptArea.Zoom(0, +1, 0, -1); end else if (FCapture_MoveButton = SpeedButton_ZoomDownBottom) then begin App_TOOLDskCaptArea.Zoom(0, 0, 0, -1); end; //http://mrxray.on.coocan.jp/Delphi/plSamples/S04_SystemParametersInfo_Interface.htm#03 if not(SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, @li_KeySpeed, 0))then begin li_KeySpeed := 100; end; Timer_CaptureMove.Interval := 400 - (li_KeySpeed * 12); if not(gfnbKeyState(VK_LBUTTON)) then begin Timer_CaptureMove.Enabled := False; end; end; procedure TApp_TOOLDskCaptAreaCtrl.SpeedButton_CaptureExecuteClick(Sender: TObject); begin App_TOOLDskCaptArea.Action_Capture_ExecuteExecute(nil); end; procedure TApp_TOOLDskCaptAreaCtrl.Timer_ZoomTimer(Sender: TObject); begin Application.ProcessMessages; if (Timer_Zoom.Tag = 1) then begin Exit; end; Timer_Zoom.Tag := 1; Paint_Zoom.Capture; Timer_Zoom.Tag := 0; end; procedure TApp_TOOLDskCaptAreaCtrl.btnCapture_ToolCloseClick(Sender: TObject); begin App_TOOLDskCaptArea.MenuItem_PDisp_Info.Checked := False; App_TOOLDskCaptArea.MenuItem_PDisp_InfoClick(nil); end; procedure TApp_TOOLDskCaptAreaCtrl.FormClose(Sender: TObject; var Action: TCloseAction); begin if (Application.Terminated) then begin Action := caFree; end else begin Action := caHide; btnCapture_ToolCloseClick(nil); end; end; procedure TApp_TOOLDskCaptAreaCtrl.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin App_TOOLDskCaptArea.FormKeyDown(Sender, Key, Shift); end; procedure TApp_TOOLDskCaptAreaCtrl.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); //var // l_Pos : TPoint; begin if (WheelDelta < 0) then begin //ダウン Paint_Zoom.Zoom := gfniNumLimit(Paint_Zoom.Zoom -1, 1, Paint_Zoom.Max); end else begin //アップ Paint_Zoom.Zoom := gfniNumLimit(Paint_Zoom.Zoom +1, 1, Paint_Zoom.Max); end; { //ホイール操作時マウスポインタを中心に拡大させようとしたもののうまくいかない l_Pos := Self.ScreenToClient(MousePos); if (PtInRect(Rect(0, 0, ClientWidth, ClientHeight - Panel_Cmd.Height), l_Pos)) then begin Paint_Zoom.OriginPosition := l_Pos; end else begin Paint_Zoom.OriginPosition := Point(0, 0); end; } Label_Zoom.Caption := Format('%d倍', [Paint_Zoom.Zoom]); end; end.