by M.S. » 2007年6月07日(木) 22:25
関数 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Declare Function SetAbortProc lib "gdi32" (hdc As HDC,lpAbortProc As DWord) As Long
Declare Function AbortDoc lib "gdi32" (hDC As HDC) As Long
Declare Function OpenPrinter lib "winspool" alias "OpenPrinterA" (pPrinterName As *Char,phPrinter As VoidPtr,ByRef pDefault As PRINTER_DEFAULTS) As Long
Declare Function ClosePrinter lib "winspool" (hPrinter As HANDLE) As Long
Declare Function PrinterProperties lib "winspool" (hWnd As HWND,hPrinter As HANDLE) As Long
Type PRINTER_DEFAULTS
pDatatype As String
pDevMode As Long
pDesiredAccess As Long
End Type
' 印刷関数
Function MyPrint() As Long
Dim hdc As HDC
Dim docinfo As DOCINFO
ZeroMemory(VarPtr(docinfo),Len(docinfo))
docinfo.cbSize = sizeof(DOCINFO)
docinfo.lpszDocName = "testprint"
hdc = GetPrintInfo()
hCancelDlgWnd = CreateDialog(hMainWnd, "PRNSTOP")
ShowWindow(hCancelDlgWnd, SW_SHOW)
EnableWindow(hMainWnd, FALSE)
SetAbortProc(hdc, AddressOf(MyAbortProc))
Dim length As DWord
Dim buffer As BytePtr
'テキスト データを格納するためのバッファ領域を確保
length=GetWindowTextLength(hEdit)
buffer=malloc(length+1)
'テキスト バッファを取得
GetWindowText(hEdit, buffer, length+1)
StartDoc(hdc, docinfo)
StartPage(hdc)
TextOut(hdc, 20, 20, buffer, length)
If bCancel Then
AbortDoc(hdc)
else
DestroyWindow(hCancelDlgWnd)
End If
EndPage(hdc)
EndDoc(hdc)
EnableWindow(hMainWnd, TRUE)
SetFocus(hMainWnd)
DeleteDC(hdc)
MyPrint=0
'バッファを解放する
free(buffer)
End Function
' プリンタ情報を取得する
Function GetPrintInfo() As HDC
Dim dwNeeded As DWORD, dwReturned As DWORD
If EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5, VarPtr(prninfo), Len(prninfo), dwNeeded, dwReturned) Then
GetPrintInfo=CreateDC(NULL, prninfo[0].pPrinterName, NULL,ByVal 0)
Else
GetPrintInfo=0
End If
End Function
Function MyAbortProc(hDC As HDC,int As Long)
Dim msg As MSG
While PeekMessage(msg, NULL, 0, 0, PM_REMOVE)
If IsDialogMessage(hCancelDlgWnd, msg) Then
TranslateMessage(msg)
DispatchMessage(msg)
End If
Wend
MyAbortProc=bCancel
End Function
' 印刷中止
Function MyPrnCancelProc(hWnd As HWND,msg As DWord,wp As WPARAM,lp As LPARAM) As LRESULT
Select Case msg
Case WM_INITDIALOG
SetFocus(hWnd)
MyPrnCancelProc=TRUE
Case WM_COMMAND
If LOWORD(wp) = IDCANCEL Then
bCancel = TRUE
DestroyWindow(hCancelDlgWnd)
MyPrnCancelProc=TRUE
End If
End Select
MyPrnCancelProc=FALSE
End Function
Function PrinterSet() As Long
Dim hPrint As HANDLE
GetPrintInfo()
OpenPrinter(prninfo[0].pPrinterName, hPrint,ByVal 0)
PrinterProperties(hParent, hPrint)
ClosePrinter(hPrint)
PrinterSet=0
End Function
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Dim hEdit As HWND
Dim hParent As HWND, hCancelDlgWnd As HWND
Dim hInst As HINSTANCE
Dim bCancel = FALSE As Long
Dim prninfo[3] As PRINTER_INFO_5
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
hEdit=GetDlgItem(hMainWnd,EditBox1)
End Sub
' 印刷
Sub MainWnd_CommandButton1_Click()
PrinterSet()
GetPrintInfo()
MyPrint()
End Sub
これで印刷をやってみたら、
リリースコンパイルのほうは何の反応もなく、
デバッグ実行のときだけ印刷されましたが、
印刷される文字は改行もされず、
紙の右端まで行くと文の途中にも関わらず印刷が終わってしまいます。
自分ではこれが精一杯ですので、
どなたか力を貸してください。
お願いします。
AB: 4.24.00
参考ページ:
猫でもわかるプログラミング 第78章、
同 第79章
[hide=関数][code]Declare Function SetAbortProc lib "gdi32" (hdc As HDC,lpAbortProc As DWord) As Long
Declare Function AbortDoc lib "gdi32" (hDC As HDC) As Long
Declare Function OpenPrinter lib "winspool" alias "OpenPrinterA" (pPrinterName As *Char,phPrinter As VoidPtr,ByRef pDefault As PRINTER_DEFAULTS) As Long
Declare Function ClosePrinter lib "winspool" (hPrinter As HANDLE) As Long
Declare Function PrinterProperties lib "winspool" (hWnd As HWND,hPrinter As HANDLE) As Long
Type PRINTER_DEFAULTS
pDatatype As String
pDevMode As Long
pDesiredAccess As Long
End Type
' 印刷関数
Function MyPrint() As Long
Dim hdc As HDC
Dim docinfo As DOCINFO
ZeroMemory(VarPtr(docinfo),Len(docinfo))
docinfo.cbSize = sizeof(DOCINFO)
docinfo.lpszDocName = "testprint"
hdc = GetPrintInfo()
hCancelDlgWnd = CreateDialog(hMainWnd, "PRNSTOP")
ShowWindow(hCancelDlgWnd, SW_SHOW)
EnableWindow(hMainWnd, FALSE)
SetAbortProc(hdc, AddressOf(MyAbortProc))
Dim length As DWord
Dim buffer As BytePtr
'テキスト データを格納するためのバッファ領域を確保
length=GetWindowTextLength(hEdit)
buffer=malloc(length+1)
'テキスト バッファを取得
GetWindowText(hEdit, buffer, length+1)
StartDoc(hdc, docinfo)
StartPage(hdc)
TextOut(hdc, 20, 20, buffer, length)
If bCancel Then
AbortDoc(hdc)
else
DestroyWindow(hCancelDlgWnd)
End If
EndPage(hdc)
EndDoc(hdc)
EnableWindow(hMainWnd, TRUE)
SetFocus(hMainWnd)
DeleteDC(hdc)
MyPrint=0
'バッファを解放する
free(buffer)
End Function
' プリンタ情報を取得する
Function GetPrintInfo() As HDC
Dim dwNeeded As DWORD, dwReturned As DWORD
If EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5, VarPtr(prninfo), Len(prninfo), dwNeeded, dwReturned) Then
GetPrintInfo=CreateDC(NULL, prninfo[0].pPrinterName, NULL,ByVal 0)
Else
GetPrintInfo=0
End If
End Function
Function MyAbortProc(hDC As HDC,int As Long)
Dim msg As MSG
While PeekMessage(msg, NULL, 0, 0, PM_REMOVE)
If IsDialogMessage(hCancelDlgWnd, msg) Then
TranslateMessage(msg)
DispatchMessage(msg)
End If
Wend
MyAbortProc=bCancel
End Function
' 印刷中止
Function MyPrnCancelProc(hWnd As HWND,msg As DWord,wp As WPARAM,lp As LPARAM) As LRESULT
Select Case msg
Case WM_INITDIALOG
SetFocus(hWnd)
MyPrnCancelProc=TRUE
Case WM_COMMAND
If LOWORD(wp) = IDCANCEL Then
bCancel = TRUE
DestroyWindow(hCancelDlgWnd)
MyPrnCancelProc=TRUE
End If
End Select
MyPrnCancelProc=FALSE
End Function
Function PrinterSet() As Long
Dim hPrint As HANDLE
GetPrintInfo()
OpenPrinter(prninfo[0].pPrinterName, hPrint,ByVal 0)
PrinterProperties(hParent, hPrint)
ClosePrinter(hPrint)
PrinterSet=0
End Function[/code][/hide]
[hide][code]Dim hEdit As HWND
Dim hParent As HWND, hCancelDlgWnd As HWND
Dim hInst As HINSTANCE
Dim bCancel = FALSE As Long
Dim prninfo[3] As PRINTER_INFO_5
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
hEdit=GetDlgItem(hMainWnd,EditBox1)
End Sub
' 印刷
Sub MainWnd_CommandButton1_Click()
PrinterSet()
GetPrintInfo()
MyPrint()
End Sub[/code][/hide]
これで印刷をやってみたら、
リリースコンパイルのほうは何の反応もなく、
デバッグ実行のときだけ印刷されましたが、
印刷される文字は改行もされず、
紙の右端まで行くと文の途中にも関わらず印刷が終わってしまいます。
自分ではこれが精一杯ですので、
どなたか力を貸してください。
お願いします。
AB: 4.24.00
参考ページ: [url=http://www.kumei.ne.jp/c_lang/sdk/sdk_78.htm]猫でもわかるプログラミング 第78章[/url]、[url=http://www.kumei.ne.jp/c_lang/sdk/sdk_79.htm]同 第79章[/url]