VB6 開發記事本時,發現「頁面設置」不在通用對話框 (CommonDialog) 範圍內。本文提供自製頁面設置表單的完整實作思路、關鍵 API 與列印整合方案。
CommonDialog 僅封裝 Windows 通用對話框:開啟/儲存檔案、列印、顏色、字型。PageSetupDlg (Windows API),VB6 未內建封裝。TextBox (上/下/左/右),單位:毫米或英吋,KeyPress 限制數字輸入。ComboBox 綁定標準尺寸 (A4, A5, Letter, Legal 等)。OptionButton 群組 (縱向/橫向)。' 標準模組
Public Type DEVMODE
' ... 省略大量欄位,重點:
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmOrientation As Integer ' 1=縱向, 2=橫向
dmMargins As MARGINS ' 自定義結構
End Type
Public Declare Function PageSetupDlg Lib "comdlg32.dll" Alias "PageSetupDlgA" (lppsd As PAGESETUPDLG) As Long
Public Declare Function DocumentProperties Lib "winspool.drv" Alias "DocumentPropertiesA" (ByVal hwnd As Long, ByVal hPrinter As Long, ByVal pDeviceName As String, pDevModeOutput As DEVMODE, pDevModeInput As DEVMODE, ByVal fMode As Long) As Long
' ... 相關結構體定義
Private Sub cmdOK_Click()
Dim psd As PAGESETUPDLG
Dim dm As DEVMODE
' 1. 取得當前印表機預設 DEVMODE
DocumentProperties Me.hwnd, 0, Printer.DeviceName, dm, dm, DM_OUT_BUFFER
' 2. 套用使用者設定
dm.dmOrientation = IIf(optPortrait.Value, DMORIENT_PORTRAIT, DMORIENT_LANDSCAPE)
dm.dmPaperSize = cboPaperSize.ItemData(cboPaperSize.ListIndex)
' 邊距轉換:毫米 → 0.01 毫米 (DEVMODE 單位)
dm.dmMargins.left = Val(txtLeft.Text) * 100
' ... right, top, bottom
' 3. 開啟頁面設置對話框 (可選,或直接套用)
psd.lStructSize = Len(psd)
psd.hwndOwner = Me.hwnd
psd.hDevMode = 0 ' 我們手動管理 DEVMODE
psd.Flags = PSD_MARGINS Or PSD_INTHOUSANDTHSOFINCHES Or PSD_DISABLEMARGINS ' 視需求
psd.rtMargin = dm.dmMargins
If PageSetupDlg(psd) Then
' 用戶點確定,psd 回傳最終設定
' 更新 dm 並儲存至全域/列印模組
End If
Unload Me
End Sub
若不需自訂 UI,直接呼叫 PageSetupDlg 讓系統處理:
Private Sub mnuPageSetup_Click()
Dim psd As PAGESETUPDLG
Dim dm As DEVMODE
DocumentProperties Me.hwnd, 0, Printer.DeviceName, dm, dm, DM_OUT_BUFFER
psd.lStructSize = Len(psd)
psd.hwndOwner = Me.hwnd
psd.hDevMode = 0
psd.Flags = PSD_ENABLEPAGESETUPHOOK Or PSD_MARGINS
' 可選:psd.lpfnPageSetupHook = AddressOf PageSetupHook ' 自訂鉤子
If PageSetupDlg(psd) Then
' 解析 psd.rtMargin、psd.hDevMode 取得新設定
' 套用至 Printer 物件或列印邏輯
End If
End Sub
Private Sub PrintDocument()
' 1. 取得儲存的 DEVMODE (來自頁面設置)
Dim dm As DEVMODE
' ... 從全域變數/註冊表/INI 讀取
' 2. 套用至 Printer 物件 (VB6 原生)
' 注意:VB6 Printer 物件不直接支援 DEVMODE 寫入
' 需用 API 設定預設印表機屬性,或列印時用 API 直接控制
' 方案 A:設定系統預設印表機屬性 (影響所有程式)
DocumentProperties 0, 0, Printer.DeviceName, dm, dm, DM_IN_BUFFER Or DM_OUT_BUFFER
' 方案 B:使用 API 列印 (StartDoc/StartPage/TextOut/EndPage/EndDoc) 完全控制
' 推薦:參考 "VB6 純 API 列印" 範例
Printer.Print "內容..."
Printer.EndDoc
End Sub
App.Path & "\pagesetup.ini" (私有) 或註冊表 HKEY_CURRENT_USER\Software\YourApp\PageSetup。dmPaperSize, dmOrientation, dmMargins (left/right/top/bottom)。Printer 物件或列印邏輯。VB6 2008 年停止主流支援,2024 年仍在維護屬技術債。新專案建議遷移至 VB.NET (WinForms/WPF)、C# 或 Electron/Qt,
PageSetupDialog類別原生支援,無需手工 API。
掌握 PageSetupDlg API 與 DEVMODE 結構,即可在 VB6 實作完整頁面設置功能。核心在於「取得 DEVMODE → 修改 → 套用/儲存 → 列印時重載」。