by ノッチ » 2006年2月19日(日) 23:27
プリンター出力に関する質問が結構いっぱいあるので簡単なサンプルをのせます。
家にプリンターがないので実際に試してはいませんが流れとしては以下のようになります。
エラー処理等は省いています。
まずはMainWnd上にComboBoxとButtonとEditBoxを配置します。
起動するとComboBoxの中にプリンター名が列挙されます。
それを選択して、Buttonを押すとEditBoxに書かれている文字がプリントアウトされるはずです。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Type PRINTER_INFO_2
pServerName As Long
pPrinterName As Long
pShareName As Long
pPortName As Long
pDriverName As Long
pComment As Long
pLocation As Long
pDevMode As Long
pSepFile As Long
pPrintProcessor As Long
pDatatype As Long
pParameters As Long
pSecurityDescriptor As Long
Attributes As Long
Priority As Long
DefaultPriority As Long
StartTime As Long
UntilTime As Long
Status As Long
cJobs As Long
AveragePPM As Long
End Type
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim hHeap As Long
Dim pHeap As Long
Dim pi2 As *PRINTER_INFO_2
Dim hCombo As HWND
Dim any As DWord
Dim count As DWord
hHeap=GetProcessHeap()
hCombo=GetDlgItem(hMainWnd,ComboBox1)
EnumPrinters(PRINTER_ENUM_LOCAL,0,2,0,0,any,count)
pHeap=HeapAlloc(hHeap,NULL,any)
pi2=pHeap
EnumPrinters(PRINTER_ENUM_LOCAL,0,2,pi2,any,any,count)
While count
SendMessage(hCombo,CB_INSERTSTRING,0,pi2->pPrinterName)
count--
pi2=pi2+Len(pi2)
Wend
HeapFree(hHeap,0,pHeap)
End Sub
Sub MainWnd_CommandButton1_Click()
Dim hHeap As Long
Dim hDC As Long
Dim doc As DOCINFO
Dim buf As Long
Dim any As Long
hHeap=GetProcessHeap()
buf=HeapAlloc(hHeap,0,1024)
SendDlgItemMessage(hMainWnd,ComboBox1,CB_GETLBTEXT,SendDlgItemMessage(hMainWnd,ComboBox1,CB_GETCURSEL,0,0),buf)
hDC=CreateDC(0,buf,0,ByVal NULL)
any=SendDlgItemMessage(hMainWnd,EditBox1,WM_GETTEXTLENGTH,0,0)
any++
HeapReAlloc(hHeap,0,buf,any)
ZeroMemory(VarPtr(doc),len(doc))
doc.cbSize=Len(doc)
doc.lpszDocName="印刷ジョブ名"
StartDoc(hDC,doc)
StartPage(hDC)
TextOut(hDC,0,0,buf,lstrlen(buf))
DeleteDC(hDC)
HeapFree(hHeap,0,buf)
End Sub
流れを簡単に説明すると、画面に描画したことある人にはわかりやすいと思いますが、
プリンターのDCを取得してそのDCにTextOutやFillRect、BitBlt等をする。
ただこれだけです。
たぶんうまくいかないと思うので、プリンターを持っててわかる人、フォローお願いします。
プリンター出力に関する質問が結構いっぱいあるので簡単なサンプルをのせます。
家にプリンターがないので実際に試してはいませんが流れとしては以下のようになります。
エラー処理等は省いています。
まずはMainWnd上にComboBoxとButtonとEditBoxを配置します。
起動するとComboBoxの中にプリンター名が列挙されます。
それを選択して、Buttonを押すとEditBoxに書かれている文字がプリントアウトされるはずです。
[hide][code]
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Type PRINTER_INFO_2
pServerName As Long
pPrinterName As Long
pShareName As Long
pPortName As Long
pDriverName As Long
pComment As Long
pLocation As Long
pDevMode As Long
pSepFile As Long
pPrintProcessor As Long
pDatatype As Long
pParameters As Long
pSecurityDescriptor As Long
Attributes As Long
Priority As Long
DefaultPriority As Long
StartTime As Long
UntilTime As Long
Status As Long
cJobs As Long
AveragePPM As Long
End Type
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim hHeap As Long
Dim pHeap As Long
Dim pi2 As *PRINTER_INFO_2
Dim hCombo As HWND
Dim any As DWord
Dim count As DWord
hHeap=GetProcessHeap()
hCombo=GetDlgItem(hMainWnd,ComboBox1)
EnumPrinters(PRINTER_ENUM_LOCAL,0,2,0,0,any,count)
pHeap=HeapAlloc(hHeap,NULL,any)
pi2=pHeap
EnumPrinters(PRINTER_ENUM_LOCAL,0,2,pi2,any,any,count)
While count
SendMessage(hCombo,CB_INSERTSTRING,0,pi2->pPrinterName)
count--
pi2=pi2+Len(pi2)
Wend
HeapFree(hHeap,0,pHeap)
End Sub
Sub MainWnd_CommandButton1_Click()
Dim hHeap As Long
Dim hDC As Long
Dim doc As DOCINFO
Dim buf As Long
Dim any As Long
hHeap=GetProcessHeap()
buf=HeapAlloc(hHeap,0,1024)
SendDlgItemMessage(hMainWnd,ComboBox1,CB_GETLBTEXT,SendDlgItemMessage(hMainWnd,ComboBox1,CB_GETCURSEL,0,0),buf)
hDC=CreateDC(0,buf,0,ByVal NULL)
any=SendDlgItemMessage(hMainWnd,EditBox1,WM_GETTEXTLENGTH,0,0)
any++
HeapReAlloc(hHeap,0,buf,any)
ZeroMemory(VarPtr(doc),len(doc))
doc.cbSize=Len(doc)
doc.lpszDocName="印刷ジョブ名"
StartDoc(hDC,doc)
StartPage(hDC)
TextOut(hDC,0,0,buf,lstrlen(buf))
DeleteDC(hDC)
HeapFree(hHeap,0,buf)
End Sub
[/code][/hide]
流れを簡単に説明すると、画面に描画したことある人にはわかりやすいと思いますが、
プリンターのDCを取得してそのDCにTextOutやFillRect、BitBlt等をする。
ただこれだけです。
たぶんうまくいかないと思うので、プリンターを持っててわかる人、フォローお願いします。