在許多看圖軟體中,滑鼠游標所指位置的局部放大鏡功能是標準配備。本文將示範如何在 Delphi 中利用 StretchBlt API 函數,以極少量的程式碼快速實作這項功能。
在表單上放置兩個 TImage 元件:
完成佈局後的表單如下圖所示:
圖 1:元件佈局完成的表單
整個放大邏輯集中在 Image1 的 OnMouseMove 事件中:
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
// 以滑鼠為中心,取 40x40 區域放大至 Image2 尺寸
StretchBlt(Image2.Canvas.Handle, 0, 0, Image2.Width, Image2.Height,
Image1.Canvas.Handle, X - 20, Y - 20, 40, 40, SRCCOPY);
Image2.Refresh; // 強制重繪
// 切換滑鼠游標為放大鏡樣式
Screen.Cursors[1] := LoadCursorFromFile('MAGNIFY.CUR');
Self.Cursor := 1;
end;
搭配表單的 OnMouseMove 事件,當滑鼠移出 Image1 範圍時恢復預設游標:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Screen.Cursors[1] := crDefault;
Self.Cursor := 1;
end;
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
StretchBlt(Image2.Canvas.Handle, 0, 0, Image2.Width, Image2.Height,
Image1.Canvas.Handle, X - 20, Y - 20, 40, 40, SRCCOPY);
Image2.Refresh;
Screen.Cursors[1] := LoadCursorFromFile('MAGNIFY.CUR');
Self.Cursor := 1;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Screen.Cursors[1] := crDefault;
Self.Cursor := 1;
end;
end.
按 F9 執行專案,滑鼠在 Image1 上移動時,Image2 會即時顯示對應區域的放大影像,效果如下:
圖 2:程式執行畫面,放大鏡跟隨滑鼠移動
本範例展示了以 StretchBlt 實作高效能圖像局部放大的技巧。程式碼精簡、執行效率高,且易於整合至現有專案中,是開發看圖軟體或影像檢視工具的實用基礎。