List 7-58 PrintSetupプロシージャ
1: Public vPrintDlg As PRINTDLG
2: Public vDevMode As DEVMODE
3: Public vDevNames As DEVNAMES
4:
5: Public Function PrintSetup(ByVal Flags As Long, ByVal FormHwnd As Long) As Boolean
6: ' プリンタを設定する
7: ' ユーザーがプリンタの設定を変更したならばTrue,そうでなければFalseを返す
8: Dim pWidth As Long, pHeight As Long
9: Dim lpDevMode As Long, lpDevNames As Long
10: Dim hDevMode As Long, hDevNames As Long
11: Dim NewDriverName As String, NewDeviceName As String, NewPortName As String
12:
13: ' その時点のプリンタの情報をvDevModeに格納する
14:
15: ' 構造体の大きさを設定
16: vDevMode.dmSize = Len(vDevMode)
17: vDevMode.dmSpecVersion = 0
18: vDevMode.dmDriverVersion = 0
19: vDevMode.dmDriverExtra = 0
20: vDevMode.dmFields = 0
21:
22: ' 設定中にいくつかのエラーが出ることがあるので,
23: ' エラーをトラップするようにしておく
24: On Error Resume Next
25:
26: ' プリンタ名
27: vDevMode.dmDeviceName = Printer.DeviceName
28:
29: ' wDriverOffset,wDeviceOffset,wOutputOffset,wDefaultのサイズの和
30: vDevNames.wDriverOffset = 8
31: ' デフォルト名
32: vDevNames.wDefault = 0
33: ' デバイス名
34: vDevNames.wDeviceOffset = vDevNames.wDriverOffset + 1 + Len(Printer.DriverName)
35: ' ポート名
36: vDevNames.wOutputOffset = vDevNames.wDeviceOffset + 1 + Len(Printer.DeviceName)
37: ' 実際のデータ
38: vDevNames.extData = Printer.DriverName & Chr(0) & _
39: Printer.DeviceName & Chr(0) & Printer.Port & Chr(0)
40:
41: MsgBox Printer.DriverName
42: MsgBox Printer.DeviceName
43: MsgBox Printer.Port
44:
45: MsgBox vDevNames.wDriverOffset
46: MsgBox vDevNames.wDeviceOffset
47: MsgBox vDevNames.wOutputOffset
48:
49: ' 用紙
50: If Printer.PaperSize <> vbPRPSUser Then
51: ' 定型用紙
52: vDevMode.dmFields = vDevMode.dmFields Or DM_PAPERSIZE
53: vDevMode.dmPaperSize = Printer.PaperSize
54: vDevMode.dmPaperWidth = 0
55: vDevMode.dmPaperLength = 0
56: Else
57: ' 不定形用紙
58: vDevMode.dmFields = vDevMode.dmFields Or DM_PAPERSIZE Or _
DM_PAPERLENGTH Or DM_PAPERWIDTH
59: vDevMode.dmPaperSize = vbPRPSUser
60: vDevMode.dmPaperWidth = Printer.ScaleX(Printer.Width, _
Printer.ScaleMode, vbHimetric)
61: vDevMode.dmPaperLength = Printer.ScaleY(Printer.Height, _
Printer.ScaleMode, vbHimetric)
62: End If
63:
64: ' 給紙トレイ
65: vDevMode.dmDefaultSource = Printer.PaperBin
66: If Err.Number = 0 Then
67: vDevMode.dmFields = vDevMode.dmFields Or DM_DEFAULTSOURCE
68: Else
69: Err.Clear
70: End If
71:
72: ' 印字品質
73: vDevMode.dmPrintQuality = Printer.PrintQuality
74: If Err.Number = 0 Then
75: vDevMode.dmFields = vDevMode.dmFields Or DM_PRINTQUALITY
76: Else
77: Err.Clear
78: End If
79:
80: ' カラー
81: vDevMode.dmColor = Printer.ColorMode
82: If Err.Number = 0 Then
83: vDevMode.dmFields = vDevMode.dmFields Or DM_COLOR
84: Else
85: Err.Clear
86: End If
87:
88: ' 両面印刷
89: vDevMode.dmDuplex = Printer.Duplex
90: If Err.Number = 0 Then
91: vDevMode.dmFields = vDevMode.dmFields Or DM_DUPLEX
92: Else
93: Err.Clear
94: End If
95:
96: ' 用紙の向き
97: vDevMode.dmOrientation = Printer.Orientation
98: If Err.Number = 0 Then
99: vDevMode.dmFields = vDevMode.dmFields Or DM_ORIENTATION
100: Else
101: Err.Clear
102: End If
103:
104: ' 拡大率
105: vDevMode.dmScale = Printer.Zoom
106: If Err.Number = 0 Then
107: vDevMode.dmFields = vDevMode.dmFields Or DM_SCALE
108: Else
109: Err.Clear
110: End If
111:
112: ' エラーハンドラの解除
113: On Error GoTo 0
114:
115: ' vDevModeの内容をグローバルメモリに保存
116: hDevMode = GlobalAlloc(GHND, Len(vDevMode))
117: lpDevMode = GlobalLock(hDevMode)
118: CopyMemory ByVal lpDevMode, vDevMode, Len(vDevMode)
119: GlobalUnlock hDevMode
120:
121: ' vDevNamesの内容をグローバルメモリに保存
123: lpDevNames = GlobalLock(hDevNames)
124: CopyMemory ByVal lpDevNames, vDevNames, Len(vDevNames)
125: GlobalUnlock hDevNames
126:
127: ' vPrintDlgの内容を初期化する
128: vPrintDlg.lStructSize = Len(vPrintDlg)
129: vPrintDlg.hwndOwner = FormHwnd
130: vPrintDlg.hDevMode = hDevMode
131: vPrintDlg.hDevNames = hDevNames
132: vPrintDlg.Flags = Flags
133:
134: ' [プリンタの設定]ダイアログボックスの表示
135: If PRINTDLG(vPrintDlg) <> 0 Then
136: ' ユーザーが[OK]ボタンを押した
137: ' hDevModeメンバの値をvDevModeにコピーする
138: If vPrintDlg.hDevMode <> 0 Then
139: lpDevMode = GlobalLock(vPrintDlg.hDevMode)
140: CopyMemory vDevMode, ByVal lpDevMode, Len(vDevMode)
141: GlobalUnlock lpDevMode
142: GlobalFree vPrintDlg.hDevMode
143: End If
144:
145: ' hDevNamesメンバの値をvDevNamesにコピーする
146: If vPrintDlg.hDevNames <> 0 Then
147: lpDevNames = GlobalLock(vPrintDlg.hDevNames)
148: CopyMemory vDevNames, ByVal lpDevNames, Len(vDevNames)
149: GlobalUnlock lpDevNames
150: GlobalFree vPrintDlg.hDevNames
151: End If
152:
153: ' プリンタの設定値を変更する
154: Dim prt As Printer
155:
156: ' 新しく設定されたプリンタ名を取得する
157:
158: ' ドライバ名の取得
159: NewDriverName = Mid(vDevNames.extData, vDevNames.wDriverOffset - 8 + 1)
160: NewDriverName = Left(NewDriverName, InStr(NewDriverName, Chr(0)) - 1)
161: ' デバイス名の取得
162: NewDeviceName = Mid(vDevNames.extData, vDevNames.wDeviceOffset - 8 + 1)
163: NewDeviceName = Left(NewDeviceName, InStr(NewDeviceName, Chr(0)) - 1)
164: ' ポート名の取得
165: NewPortName = Mid(vDevNames.extData, vDevNames.wOutputOffset - 8 + 1)
166: NewPortName = Left(NewPortName, InStr(NewPortName, Chr(0)) - 1)
167:
168: ' 同じ設定を持つプリンタを探し,
169: ' それをデフォルトプリンタとする
170: For Each prt In Printers
171: If UCase(prt.DeviceName) = UCase(NewDeviceName) Then
172: ' このプリンタをデフォルトプリンタとする
173: Set Printer = prt
174: Exit For
175: End If
176: Next
177:
178: On Error Resume Next
179:
180: ' プリンタの用紙を設定する
181: If vDevMode.dmPaperSize <> vbPRPSUser Then
182: ' 定型用紙である
183: Printer.PaperSize = vDevMode.dmPaperSize
184: Else
185: ' 不定形用紙である
186: Printer.PaperSize = vbPRPSUser
187: Printer.Width = Printer.ScaleX(vDevMode.dmPaperWidth, _
vbHimetric, Printer.ScaleMode)
188: Printer.Height = Printer.ScaleY(vDevMode.dmPaperLength, _
vbHimetric, Printer.ScaleMode)
189: End If
190:
191: If Err.Number <> 0 Then
192: MsgBox "指定された用紙サイズが不正です", vbOKOnly, "プリンタの設定"
193: Err.Clear
194: End If
195:
196: ' 給紙トレイ
197: Printer.PaperBin = vDevMode.dmDefaultSource
198:
199: ' 印字品質
200: Printer.PrintQuality = vDevMode.dmPrintQuality
201:
202: ' カラー
203: Printer.ColorMode = vDevMode.dmColor
204:
205: ' 両面印刷
206: Printer.Duplex = vDevMode.dmDuplex
207:
208: ' 用紙の向き
209: Printer.Orientation = vDevMode.dmOrientation
210:
211: ' 拡大率
212: Printer.Zoom = vDevMode.dmScale
213:
214: PrintSetup = True
215: Else
216: ' キャンセルされた
217: PrintSetup = False
218: End If
219: End Function