TImage 無捲動條、無焦點、無法直接顯示超出視窗範圍的大圖。
TScrollBox (或 TScrollingWinControl 衍生類),調整大小。ScrollBox->AutoScroll = true。TImage,設定:Image->Align = alNoneImage->AutoSize = trueImage->Left = 0; Image->Top = 0;Image 自動撐大,ScrollBox 自動顯示捲動條。優點:零代碼、標準 UI、鍵盤/滑鼠滾輪原生支援。
缺點:捲動條佔空間、不適合全螢幕漫遊體驗。
TPanel (或 TPaintBox) 作為視口,Align = alClient 或固定大小。TImage,設定:Image->AutoSize = trueImage->Left = 0; Image->Top = 0;int FDragX, FDragY;void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if (Button == mbLeft) {
FDragX = X;
FDragY = Y;
}
}
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if (Shift.Contains(ssLeft)) {
int dx = X - FDragX;
int dy = Y - FDragY;
Image1->Left += dx;
Image1->Top += dy;
}
}
int minLeft = Panel1->Width - Image1->Width;
int minTop = Panel1->Height - Image1->Height;
Image1->Left = Max(Min(Image1->Left, 0), minLeft);
Image1->Top = Max(Min(Image1->Top, 0), minTop);
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
const int STEP = 20;
switch (Key) {
case VK_LEFT: Image1->Left += STEP; break;
case VK_RIGHT: Image1->Left -= STEP; break;
case VK_UP: Image1->Top += STEP; break;
case VK_DOWN: Image1->Top -= STEP; break;
}
// 邊界限制同方法二
}
注意:表單 KeyPreview = true 以接收按鍵。
TImage,改用 TPaintBox + OnPaint。TBitmap (或分塊載入)。OnPaint 中計算可視區域對應源矩形,BitBlt/StretchBlt 繪製。InvalidateRect 部分重繪。| 場景 | 推薦方法 |
|---|---|
| 一般文檔/圖紙檢視 | TScrollBox + TImage |
| 地圖/衛星圖/全景漫遊 | 滑鼠拖曳 + 邊界限制 |
| 醫療影像/巨幅掃描圖 (>50MP) | 分塊載入 + 雙緩衝 PaintBox |