unit child; //{$DEFINE DEBUG} interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Menus, ActnList, Buttons, ComCtrls, Grids, myFileDialog, myWallvideo; type TApp_TOOLWallpaperChild = class(TForm) Panel_ImageBase: TPanel; Panel_SourceBase: TPanel; Label_Source: TLabel; Shape_Source: TShape; Image_SourceIcon: TImage; Panel_Source: TPanel; Image_Source: TImage; Grid_Source: TDrawGrid; Panel_MonitorBase: TPanel; Shape_Monitor: TShape; Label_Monitor: TLabel; Image_MonitorIcon: TImage; Panel_Monitor: TPanel; Image_Monitor: TImage; Grid_Monitor: TDrawGrid; Label_SpcSource: TLabel; Label_SpcMonitor: TLabel; procedure FormCreate (Sender: TObject); procedure FormClose (Sender: TObject; var Action: TCloseAction); procedure Panel_ImageBaseResize (Sender: TObject); procedure Panel_SourceResize (Sender: TObject); procedure Panel_MonitorResize (Sender: TObject); procedure Image_MonitorMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Image_MonitorDblClick (Sender: TObject); procedure Image_SourceMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image_SourceMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Image_SourceMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Grid_SourceMouseWheelDown (Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); procedure Grid_SourceMouseWheelUp (Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); procedure Grid_SourceEnter(Sender: TObject); procedure Grid_SourceExit(Sender: TObject); procedure Image_MonitorIconDblClick(Sender: TObject); private { Private 宣言 } FsFileName : WideString; FiStyleIndex : Integer; FiOriginIndex : Integer; FiPosIndex : Integer; FiColorIndex : Integer; FclBGColor : TColor; FiMonitorIndex : Integer; function FGetGrid (AObject: TObject): TDrawGrid; function FGetImage(AObject: TObject): TImage; function FGetShape(AObject: TObject): TShape; procedure FSetSource(sFileName: WideString); public { Public 宣言 } function GetFocusGrid: TDrawGrid; function GetFocusImage: TImage; procedure SetStyle( iStyleIndex : Integer; iOriginIndex : Integer; iPosIndex : Integer; iColorIndex : Integer; clBGColor : TColor; iMonitorIndex : Integer ); property FileName : WideString read FsFileName; // write F_SetSource; property StyleIndex : Integer read FiStyleIndex write FiStyleIndex; property OriginIndex : Integer read FiOriginIndex write FiOriginIndex; property PosIndex : Integer read FiPosIndex write FiPosIndex; property ColorIndex : Integer read FiColorIndex write FiColorIndex; property BGColor : TColor read FclBGColor write FclBGColor; property MonitorIndex : Integer read FiMonitorIndex write FiMonitorIndex; end; //var // App_TOOLWallpaperChild: TApp_TOOLWallpaperChild; function G_fnCreateWallpaperChild( ATabSheet : TTabSheet; ABitmap : TBitmap; AStyle : TMyWallpaperStyle; clColor : TColor = clBackground; iX : Integer = 0; iY : Integer = 0 ) : TApp_TOOLWallpaperChild; overload; function G_fnCreateWallpaperChild( ATabSheet : TTabSheet; sFileName : WideString; AStyle : TMyWallpaperStyle; clColor : TColor = clBackground; iX : Integer = 0; iY : Integer = 0 ) : TApp_TOOLWallpaperChild; overload; function G_fnCreateWallpaperChild(ATabSheet: TTabSheet; ABitmap: TBitmap): TApp_TOOLWallpaperChild; overload; function G_fnCreateWallpaperChild(ATabSheet: TTabSheet; sFileName: WideString): TApp_TOOLWallpaperChild; overload; function G_fnCreateWallpaperChild(ATabSheet: TTabSheet): TApp_TOOLWallpaperChild; overload; implementation uses {$IFDEF DEBUG} myDebug, {$ENDIF} // Clipbrd, myClipbrd, myControl, myDragAndDrop, myFile, myGIFImage, myGraphic, myImage, myMenu, myMessageBox, myMonitor, myNum, mySize, myWindow, myWStrings, main, createwall; {$R *.dfm} //============================================================================== function G_fnCreateWallpaperChild( ATabSheet : TTabSheet; ABitmap : TBitmap; AStyle : TMyWallpaperStyle; clColor : TColor = clBackground; iX : Integer = 0; iY : Integer = 0 ): TApp_TOOLWallpaperChild; begin if (ABitmap.Width <= 0) or (ABitmap.Height <= 0) then begin Result := nil; // gpcShowMessage('画像がありません'); ATabSheet.Free; Exit; end; Result := TApp_TOOLWallpaperChild.Create(Application.MainForm); with Result do begin ManualDock(ATabSheet); Align := alClient; Image_Source.Hint := Label_Source.Hint; FiStyleIndex := Integer(AStyle); FiOriginIndex := 0; FiPosIndex := 0; // FiColorIndex := DWORD(ColorToRGB(clColor)); FclBGColor := DWORD(ColorToRGB(clColor)); Image_Source.Picture.Bitmap.Assign(ABitmap); Image_Source.Refresh; if (App_TOOLWallpaperCreate <> nil) then begin Result.Image_Source.PopupMenu := App_TOOLWallpaperCreate.PopupMenu_Source; Result.Image_Monitor.PopupMenu := App_TOOLWallpaperCreate.PopupMenu_Monitor; App_TOOLWallpaperCreate.ComboBox_SelStyleSelect(nil); end; Show; end; end; function G_fnCreateWallpaperChild( ATabSheet : TTabSheet; sFileName : WideString; AStyle : TMyWallpaperStyle; clColor : TColor = clBackground; iX : Integer = 0; iY : Integer = 0 ) : TApp_TOOLWallpaperChild; var l_Bitmap : TBitmap; begin Result := nil; l_Bitmap := TBitmap.Create; try if (sFileName = G_csBMPBKCOLOR) then begin gpcBmpSizeSet(l_Bitmap, 300, 300); gpcFillColor(l_Bitmap, clColor, False); end else begin if not(gfnbLoadFromFile(l_Bitmap, sFileName)) then begin if (sFileName <> '') then begin gpcShowMessage(WideFormat('%s'#13'読み込めませんでした', [sFileName])); end; ATabSheet.Free; Exit; end; end; Result := G_fnCreateWallpaperChild(ATabSheet, l_Bitmap, AStyle, clColor, iX, iY); Result.FSetSource(sFileName); finally l_Bitmap.Free; end; end; function G_fnCreateWallpaperChild(ATabSheet : TTabSheet; ABitmap : TBitmap) : TApp_TOOLWallpaperChild; overload; begin Result := G_fnCreateWallpaperChild(ATabSheet, ABitmap, G_wsDEFAULTSTYLE, clBackground); end; function G_fnCreateWallpaperChild(ATabSheet : TTabSheet; sFileName : WideString) : TApp_TOOLWallpaperChild; overload; begin Result := G_fnCreateWallpaperChild(ATabSheet, sFileName, G_wsDEFAULTSTYLE, clBackground); end; function G_fnCreateWallpaperChild(ATabSheet : TTabSheet) : TApp_TOOLWallpaperChild; //現在の壁紙を読み込む var lpt_Pos : TPoint; begin lpt_Pos := gfnptWallpaperOriginPosGet; Result := G_fnCreateWallpaperChild(ATabSheet, gfnsWallpaperFileNameGet, gfnWallpaperStyleGet, gfniDesktopColorGet, lpt_Pos.X, lpt_Pos.Y); end; //------------------------------------------------------------------------------ procedure TApp_TOOLWallpaperChild.FormCreate(Sender: TObject); procedure _InitImage( AImage : TImage; AGrid : TDrawGrid; APanelParent : TPanel; AShapeFrame : TShape; APanelBase : TPanel ); begin AImage.Parent := AGrid; AImage.Align := alClient; AGrid.Align := alClient; AGrid.DoubleBuffered := True; APanelParent.DoubleBuffered := True; APanelParent.ParentColor := True; APanelBase.DoubleBuffered := True; APanelBase.ParentColor := True; AShapeFrame.Pen.Color := APanelBase.Color; end; begin Self.ClientHeight := Panel_ImageBase.Height; Panel_MonitorBase.Align := alClient; _InitImage(Image_Source, Grid_Source, Panel_Source, Shape_Source, Panel_SourceBase); _InitImage(Image_Monitor, Grid_Monitor, Panel_Monitor, Shape_Monitor, Panel_MonitorBase); Panel_ImageBase.Align := alClient; end; procedure TApp_TOOLWallpaperChild.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; procedure TApp_TOOLWallpaperChild.Panel_ImageBaseResize(Sender: TObject); begin Panel_SourceBase.Width := Panel_ImageBase.Width div 2; //拡大・縮小後にパネルがサイズ変更した時に表示位置を調整させるため gpcImage_MoveDone(Image_Source, 0, 0); gpcImage_MoveDone(Image_Monitor, 0, 0); end; procedure TApp_TOOLWallpaperChild.SetStyle( iStyleIndex : Integer; iOriginIndex : Integer; iPosIndex : Integer; iColorIndex : Integer; clBGColor : TColor; iMonitorIndex : Integer ); //スタイル begin FiStyleIndex := iStyleIndex; FiOriginIndex := iOriginIndex; FiPosIndex := iPosIndex; FiColorIndex := iColorIndex; FclBGColor := clBGColor; FiMonitorIndex := iMonitorIndex; gpcDesktopBmpGet( Image_Monitor.Picture.Bitmap, Image_Source.Picture.Bitmap, TMyWallpaperStyle(FiStyleIndex), FclBGColor, TMyWallpaperPos(FiPosIndex), FiMonitorIndex - G_ciORIGIN_START ); Image_Monitor.Refresh; if (App_TOOLWallpaperCreate <> nil) then begin App_TOOLWallpaperCreate.SelectItem(nil); end; end; procedure TApp_TOOLWallpaperChild.FSetSource(sFileName : WideString); begin FsFileName := sFileName; Image_Source.Hint := Label_Source.Hint + ' ' + gfnsWideToAnsiEx(FsFileName); end; procedure TApp_TOOLWallpaperChild.Image_MonitorMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var l_Image : TImage; li_MonitorIndex : Integer; ls_Hint : String; begin l_Image := FGetImage(Sender); if (l_Image = nil) then begin Exit; end; if not(gfnbImage_Move(l_Image, X, Y)) then begin if (G_Screen.MonitorCount > 1) then begin li_MonitorIndex := myImage.gfniMonitorIndexGet(l_Image, X, Y); if (li_MonitorIndex < 0) then begin ls_Hint := 'ダブルクリックですべてのモニターの画像を適用'; end else begin //モニターインデックスではなくモニター番号で表示するので+1 ls_Hint := Format('ダブルクリックでモニター%dの画像を適用', [li_MonitorIndex +1]); end; end else begin ls_Hint := 'ダブルクリックで画像を適用'; end; if (l_Image.Hint <> ls_Hint) then begin l_Image.Hint := ls_Hint; end; end; end; procedure TApp_TOOLWallpaperChild.Panel_SourceResize(Sender: TObject); var l_Image : TImage; l_Label : TLabel; begin l_Image := Image_Source; l_Label := Label_Source; l_Label.Caption := Format('元画像 (%dx%d) [%s]', [l_Image.Picture.Bitmap.Width, l_Image.Picture.Bitmap.Height, gfnsZoomRatioGet(l_Image)]); end; procedure TApp_TOOLWallpaperChild.Panel_MonitorResize(Sender: TObject); var l_Image : TImage; l_Label : TLabel; begin l_Image := Image_Monitor; l_Label := Label_Monitor; l_Label.Caption := Format('モニター画像 (%dx%d) [%s]', [l_Image.Picture.Bitmap.Width, l_Image.Picture.Bitmap.Height, gfnsZoomRatioGet(l_Image)]); end; function TApp_TOOLWallpaperChild.FGetImage(AObject: TObject): TImage; var ls_Name : String; begin Result := nil; if not(AObject is TComponent) then begin Exit; end; //ex)Image_Source ls_Name := TComponent(AObject).Name; ls_Name := Format('Image_%s', [Copy(ls_Name, Pos('_', ls_Name) +1, MAXINT)]); Result := FindComponent(ls_Name) as TImage; end; function TApp_TOOLWallpaperChild.FGetGrid(AObject: TObject): TDrawGrid; var ls_Name : String; begin Result := nil; if not(AObject is TComponent) then begin Exit; end; //ex)Grid_Source ls_Name := TComponent(AObject).Name; ls_Name := Format('Grid_%s', [Copy(ls_Name, Pos('_', ls_Name) +1, MAXINT)]); Result := FindComponent(ls_Name) as TDrawGrid; end; function TApp_TOOLWallpaperChild.FGetShape(AObject: TObject): TShape; var ls_Name : String; begin Result := nil; if not(AObject is TComponent) then begin Exit; end; //ex)Image_Source ls_Name := TComponent(AObject).Name; ls_Name := Format('Shape_%s', [Copy(ls_Name, Pos('_', ls_Name) +1, MAXINT)]); Result := FindComponent(ls_Name) as TShape; end; procedure TApp_TOOLWallpaperChild.Image_MonitorDblClick(Sender: TObject); //実寸、縮小(拡大)表示切り替え var l_Image : TImage; lpt_Pos : TPoint; begin l_Image := FGetImage(Sender); if (l_Image = nil) then begin Exit; end; if (gfnbKeyState(VK_SHIFT)) then begin if (l_Image.Align = alClient) then begin App_TOOLWallpaperCreate.Action_Zoom100Execute(nil); end else begin App_TOOLWallpaperCreate.Action_ZoomAlwaysFitExecute(nil); end; end else begin //通常の処理 if (l_Image = Image_Monitor) then begin lpt_Pos := Image_Monitor.ScreenToClient(gfnptMousePosGet); //どのモニター上でクリックしたか // FSetMonitorWallpaper(gfniMonitorIndexGet(l_Image, lpt_Pos.X, lpt_Pos.Y)); App_TOOLWallpaperCreate.SetMonitorWallpaper(gfniMonitorIndexGet(l_Image, lpt_Pos.X, lpt_Pos.Y)); myImage.gpcImage_MoveInit; end else begin App_TOOLWallpaperCreate.Action_FileOpenBmpExecute(Self); end; end; end; procedure TApp_TOOLWallpaperChild.Grid_SourceMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); //縮小 begin App_TOOLWallpaperCreate.Action_ZoomDownExecute(nil); end; procedure TApp_TOOLWallpaperChild.Grid_SourceMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); //拡大 begin App_TOOLWallpaperCreate.Action_ZoomUpExecute(nil); end; procedure TApp_TOOLWallpaperChild.Image_SourceMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var l_Grid : TDrawGrid; l_Image : TImage; begin l_Grid := FGetGrid (Sender); l_Image := FGetImage(Sender); if (l_Grid = nil) or (l_Image = nil) then begin Exit; end; if (l_Grid.CanFocus) then begin l_Grid.SetFocus; end; if (Button = mbLeft) then begin gpcImage_MoveStart(X, Y); end; end; procedure TApp_TOOLWallpaperChild.Image_SourceMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var l_Image : TImage; begin l_Image := FGetImage(Sender); if (l_Image = nil) then begin Exit; end; gfnbImage_Move(l_Image, X, Y); end; procedure TApp_TOOLWallpaperChild.Image_SourceMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var l_Image : TImage; begin l_Image := FGetImage(Sender); if (l_Image = nil) then begin Exit; end; gpcImage_MoveDone(l_Image, X, Y); end; function TApp_TOOLWallpaperChild.GetFocusGrid : TDrawGrid; begin if (Grid_Source.Focused) then begin Result := Grid_Source; end else if (Grid_Monitor.Focused) then begin Result := Grid_Monitor; end else begin Result := nil; end; end; function TApp_TOOLWallpaperChild.GetFocusImage: TImage; var l_Grid : TDrawGrid; begin l_Grid := GetFocusGrid; if (l_Grid = Grid_Source) then begin Result := Image_Source; end else if (l_Grid = Grid_Monitor) then begin Result := Image_Monitor; end else begin Result := nil; end; end; procedure TApp_TOOLWallpaperChild.Grid_SourceEnter(Sender: TObject); var l_Shape : TShape; begin l_Shape := FGetShape(Sender); if (l_Shape = nil) then begin Exit; end; l_Shape.Pen.Color := clBtnShadow; App_TOOLWallpaperCreate.SetZoomActive(True); end; procedure TApp_TOOLWallpaperChild.Grid_SourceExit(Sender: TObject); var l_Shape : TShape; begin l_Shape := FGetShape(Sender); if (l_Shape = nil) then begin Exit; end; l_Shape.Pen.Color := clBtnFace; App_TOOLWallpaperCreate.SetZoomActive(False); end; procedure TApp_TOOLWallpaperChild.Image_MonitorIconDblClick(Sender: TObject); begin App_TOOLWallpaperCreate.Image_WallpaperIconDblClick(Sender); end; end.