delphi中 用Timage控件模拟按钮效果
delphi中 用Timage控件模拟按钮效果
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Math; type TForm1 = class(TForm) ImageBtn_Push: TImage; procedure ImageBtn_PushMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure ImageBtn_PushMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ImageBtn_PushMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } FOriginalBitmap: TBitmap; FIsMouseOver: Boolean; FIsMouseDown: Boolean; FOriginalTop: Integer; // 保存原始位置 FOriginalLeft: Integer; procedure ApplyBrightnessEffect(Brightness: Integer;Image:TImage); procedure RestoreOriginalImage(Image:TImage); function IsInImageArea(X, Y: Integer;Image:TImage): Boolean; // procedure SetImageBrightness(Brightness: Integer); procedure RestoreImagePosition(Image:TImage); // 恢复图像位置 public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // 初始化变量 FIsMouseOver := False; FIsMouseDown := False; // 保存原始图像和位置 FOriginalBitmap := TBitmap.Create; FOriginalBitmap.Assign(ImageBtn_Push.Picture.Bitmap); FOriginalTop := ImageBtn_Push.Top; FOriginalLeft := ImageBtn_Push.Left; // 设置图像属性 ImageBtn_Push.Stretch := True; ImageBtn_Push.Transparent := True; // 设置窗体也响应鼠标移动,用于检测离开图像 Self.OnMouseMove := FormMouseMove; end; function TForm1.IsInImageArea(X, Y: Integer;Image:TImage): Boolean; begin // 检查坐标是否在图像区域内 Result := (X >= Image.Left) and (X <= Image.Left + Image.Width) and (Y >= Image.Top) and (Y <= Image.Top + Image.Height); end; procedure TForm1.ApplyBrightnessEffect(Brightness: Integer;Image:TImage); var TempBitmap: TBitmap; I, J: Integer; P: PByteArray; R, G, B: Integer; begin if not Assigned(Image.Picture.Bitmap) then Exit; TempBitmap := TBitmap.Create; try TempBitmap.Assign(FOriginalBitmap); TempBitmap.PixelFormat := pf24bit; // 调整亮度 for J := 0 to TempBitmap.Height - 1 do begin P := TempBitmap.ScanLine[J]; for I := 0 to TempBitmap.Width - 1 do begin B := P[I * 3]; G := P[I * 3 + 1]; R := P[I * 3 + 2]; // 增加亮度(确保在0-255范围内) R := Min(255, Max(0, R + Brightness)); G := Min(255, Max(0, G + Brightness)); B := Min(255, Max(0, B + Brightness)); P[I * 3] := Byte(B); P[I * 3 + 1] := Byte(G); P[I * 3 + 2] := Byte(R); end; end; Image.Picture.Bitmap.Assign(TempBitmap); finally TempBitmap.Free; end; end; procedure TForm1.RestoreImagePosition(Image:TImage); begin // 恢复图像原始位置 Image.Top := FOriginalTop; Image.Left := FOriginalLeft; end; procedure TForm1.RestoreOriginalImage(Image:TImage); begin if Assigned(FOriginalBitmap) then begin Image.Picture.Bitmap.Assign(FOriginalBitmap); RestoreImagePosition(ImageBtn_Push); // 同时恢复位置 end; end; procedure TForm1.ImageBtn_PushMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // 鼠标在图像上移动 if not FIsMouseOver then begin FIsMouseOver := True; if not FIsMouseDown then begin ApplyBrightnessEffect(30,ImageBtn_Push); // 鼠标进入时变亮 RestoreImagePosition(ImageBtn_Push); // 确保位置正确 end; end; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // 鼠标在窗体上移动(检查是否离开图像) if FIsMouseOver and not IsInImageArea(X, Y,ImageBtn_Push) then begin FIsMouseOver := False; FIsMouseDown := False; RestoreOriginalImage(ImageBtn_Push); // 鼠标离开时恢复图像和位置 end; end; procedure TForm1.ImageBtn_PushMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin FIsMouseDown := True; ApplyBrightnessEffect(-20,ImageBtn_Push); // 按下时变暗 // 保存原始位置 FOriginalLeft := ImageBtn_Push.Left; FOriginalTop := ImageBtn_Push.Top; // 向右下移动1像素,模拟按下效果 ImageBtn_Push.Left := ImageBtn_Push.Left + 1; ImageBtn_Push.Top := ImageBtn_Push.Top + 1; end; end; procedure TForm1.ImageBtn_PushMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin FIsMouseDown := False; if FIsMouseOver then begin ApplyBrightnessEffect(30,ImageBtn_Push); // 仍在图像上,保持高亮 RestoreImagePosition(ImageBtn_Push); // 恢复位置但保持高亮 end else begin RestoreOriginalImage(ImageBtn_Push); // 已离开图像,完全恢复 end; end; end; end.