首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

VB6 記事本專案:頁面設置功能實作方案(非通用對話框)

     編輯:程式設計疑難解答

VB6 開發記事本時,發現「頁面設置」不在通用對話框 (CommonDialog) 範圍內。本文提供自製頁面設置表單的完整實作思路、關鍵 API 與列印整合方案。

為何無現成控制項?

  • VB6 CommonDialog 僅封裝 Windows 通用對話框:開啟/儲存檔案、列印、顏色、字型。
  • 頁面設置 屬於 PageSetupDlg (Windows API),VB6 未內建封裝。

方案一:自製表單 + Windows API (標準做法)

1. 表單設計

  • 邊距:四個 TextBox (上/下/左/右),單位:毫米或英吋,KeyPress 限制數字輸入。
  • 紙張大小:ComboBox 綁定標準尺寸 (A4, A5, Letter, Legal 等)。
  • 方向:OptionButton 群組 (縱向/橫向)。
  • 按鈕:確定、取消、預設值。

2. 核心 API 宣告

' 標準模組
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
' ... 相關結構體定義

3. 關鍵邏輯

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 → 修改 → 套用/儲存 → 列印時重載」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved