螢幕截圖功能雖有 HyperSnap 等現成工具,但若能整合至自有程式中,將大幅擴展應用彈性。本文以 VC++ 在 Windows 95 環境下為例,逐步解析螢幕截圖的核心實作流程:從區域選取、裝置內容建立、位圖複製,到剪貼板存放與 BMP 檔案儲存。
此函數接受 LPRECT 結構定義的截圖區域,可針對特定視窗或整個螢幕進行截取。主要流程:
CreateDC("DISPLAY"))與相容記憶體裝置內容(CreateCompatibleDC)CreateCompatibleBitmap)並選入記憶體 DCBitBlt 將螢幕畫面複製至記憶體 DCHBITMAP)HBITMAP CopyScreenToBitmap(LPRECT lpRect) {
if (IsRectEmpty(lpRect)) return NULL;
HDC hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
HDC hMemDC = CreateCompatibleDC(hScrDC);
// ... 座標計算與邊界檢查 ...
HBITMAP hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
DeleteDC(hScrDC); DeleteDC(hMemDC);
return hBitmap;
}
if (OpenClipboard(hWnd)) {
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
}
SaveBitmapToFile 函數處理位圖檔案格式的完整寫入流程:計算像素位深、調色板大小、建立 BITMAPFILEHEADER、BITMAPINFOHEADER,透過 GetDIBits 取得像素資料,最後以 CreateFile 與 WriteFile 寫入磁碟。支援 1/4/8/24 位元色深,自動處理調色板與像素資料對齊。
int SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName) {
// 計算位深、調色板、建立 DIB、取得像素資料、寫入檔案頭與資料
// 完整程式碼請參考原文
}