VB6.0 WinXP sp2
行単位 でESC/Pのドットプリンターに直接印刷するべく奮闘しております。
英数字での印刷はできるようになったのですが、
コントロールコードの送信と漢字の印刷方法がわかりません。
色々試行錯誤をしていますが、漢字を直接送っても英数字でしか
印刷されませんし、16進で送ってもまたしても英数字でしか印刷されません。
ESC/Pで漢字の印刷やコントロールコードの送信方法を教えてくださいませ。
よろしくお願いします。
# プリンタ言語には詳しくないので、細かい話になると分かりませんが…。
> コントロールコードの送信と漢字の印刷方法がわかりません。
基本部分は同じとはいえ、ESC/Pコマンドにはプリンタ固有の方言がありますので、
まずはプリンタメーカから、ESC/Pコマンドリファレンスを入手しましょう。
(開発者向けサイトにて仕様書を公開しているメーカもあります)
> 色々試行錯誤をしていますが
その試行錯誤した内容も掲載してもらえれば、修正案が出せるかも。
> 漢字を直接送っても英数字でしか印刷されませんし
まず、漢字ROMを搭載したプリンタであるかを確認してください。その上で、
プリンタ内蔵漢字フォントでの出力という意味であれば、漢字文字列が現れるたびに、
漢字の開始… [file separator(&H1C)][ampersand(&H26)]
漢字データ… JIS漢字文字列
漢字の解除… [file separator(&H1C)][ampersand(&H2E)]
という形式のバイナリを送る必要があるかと思います。
また、もしも外字が必要な場合には、プリンタに外字フォントを持たせるか、
内蔵フォントを使わず、VBでラスタイメージを生成して送るなどの対応も
考える必要があるかと思います。
間違い。漢字モードの解除は、[FS][.] です。m(_ _)m
誤> 漢字の解除… [file separator(&H1C)][ampersand(&H2E)]
正> 漢字の解除… [file separator(&H1C)][period(&H2E)]
魔界の仮面弁士様 ありがとうございます。
プリンタ内蔵漢字フォントでの出力ではなく。
内蔵フォントを使わず、VBでラスタイメージを生成して送る方法を
検討しております。
(内蔵フォントに無い漢字の印刷(人名)と、レイアウトの都合)
しかしながら、手始めにプリンタ内蔵漢字フォントでの出力を成功して
ラスタイメージを生成して送る方法に移行したいと思っております。
出先からのアクセスの為、ソースは後日掲載いたします。
プリンター VP-700 VP-880 共にエプソン
漢字ロム搭載
エプソンのESC/Pコマンドリファレンスは入手いたしました。
よろしくお願いします。
ソースです。
Option Explicit
Private Type DOCINFO
pDocName As String
pOutputFile As String
pDatatype As String
End Type
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal _
hPrinter As Long) As Long
Private Declare Function EndDocPrinter Lib "winspool.drv" (ByVal _
hPrinter As Long) As Long
Private Declare Function EndPagePrinter Lib "winspool.drv" (ByVal _
hPrinter As Long) As Long
Private Declare Function OpenPrinter Lib "winspool.drv" Alias _
"OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _
ByVal pDefault As Long) As Long
Private Declare Function StartDocPrinter Lib "winspool.drv" Alias _
"StartDocPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _
pDocInfo As DOCINFO) As Long
Private Declare Function StartPagePrinter Lib "winspool.drv" (ByVal _
hPrinter As Long) As Long
Private Declare Function WritePrinter Lib "winspool.drv" (ByVal _
hPrinter As Long, pBuf As Any, ByVal cdBuf As Long, _
pcWritten As Long) As Long
Dim lhPrinter As Long
Private Sub Command1_Click()
Dim lReturn As Long
Dim lpcWritten As Long
Dim sWrittenData As String
sWrittenData = "IUYGEUIYGWOFUI" & vbCrLf
lReturn = WritePrinter(lhPrinter, ByVal sWrittenData, _
Len(sWrittenData), lpcWritten)
lReturn = EndPagePrinter(lhPrinter)
lReturn = EndDocPrinter(lhPrinter)
lReturn = ClosePrinter(lhPrinter)
Dim lDoc As Long
Dim MyDocInfo As DOCINFO
lReturn = OpenPrinter(Printer.DeviceName, lhPrinter, 0)
If lReturn = 0 Then
MsgBox "The Printer Name you typed wasn't recognized."
Exit Sub
End If
MyDocInfo.pDocName = "AAAAAA"
MyDocInfo.pOutputFile = vbNullString
MyDocInfo.pDatatype = vbNullString
lDoc = StartDocPrinter(lhPrinter, 1, MyDocInfo)
Call StartPagePrinter(lhPrinter)
End Sub
Private Sub Form_Load()
Dim lReturn As Long
Dim lDoc As Long
Dim MyDocInfo As DOCINFO
lReturn = OpenPrinter(Printer.DeviceName, lhPrinter, 0)
If lReturn = 0 Then
MsgBox "The Printer Name you typed wasn't recognized."
Exit Sub
End If
MyDocInfo.pDocName = "AAAAAA"
MyDocInfo.pOutputFile = vbNullString
MyDocInfo.pDatatype = vbNullString
lDoc = StartDocPrinter(lhPrinter, 1, MyDocInfo)
Call StartPagePrinter(lhPrinter)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim lReturn As Long
lReturn = EndPagePrinter(lhPrinter)
lReturn = EndDocPrinter(lhPrinter)
lReturn = ClosePrinter(lhPrinter)
End Sub
Private Sub Command2_Click()
Dim lReturn As Long
lReturn = EndPagePrinter(lhPrinter)
lReturn = EndDocPrinter(lhPrinter)
lReturn = ClosePrinter(lhPrinter)
End
End Sub
ボタン2 の方の処理は、
Private Sub Command2_Click()
Unload Me
End Sub
のようにすべきかと。サンプルとはいえ、End の使用は避けましょう。
で、さしあたっての修正箇所としては、
lReturn = WritePrinter(lhPrinter, ByVal sWrittenData, ……)
の部分を、
Dim buf() As Byte
buf = ConverToRawData(sWrittenData)
lReturn = WritePrinter(lhPrinter, buf(0), ……)
のようにすることかと思います。
なお、上記の ConverToRawData というのが、どらさんが実際に
自作すべき箇所で、その処理内容としては、先に記述した
> 漢字文字列が現れるたびに、
> 漢字の開始… [file separator(&H1C)][ampersand(&H26)]
> 漢字データ… JIS漢字文字列
> 漢字の解除… [file separator(&H1C)][period(&H2E)]
> という形式のバイナリを送る
を実装するための部分となります。
魔界の仮面弁士様 ありがとうございます。
自作すべき箇所の書き方がわかりません
ConverToRawData = [file separator(&H1C)][ampersand(&H26)] & "ああ試験" & [file separator(&H1C)][period(&H2E)]
では翻訳エラーになります
根本的に何かが間違っているような。
この辺りのひらがなや漢字の記述方法をお教えくださいませ。
超初心者で申し訳ありません。 よろしくお願いします。
Private Sub Command1_Click()
Dim lReturn As Long
Dim lpcWritten As Long
Dim sWrittenData As String
Dim buf() As Byte
ConverToRawData(sWrittenData) = [file
separator(&H1C)][ampersand(&H26)] & "あああ" & [file
separator(&H1C)][period(&H2E)]
buf = ConverToRawData(sWrittenData)
lReturn = WritePrinter(lhPrinter, buf(0), Len(sWrittenData),
lpcWritten)
lReturn = EndPagePrinter(lhPrinter)
lReturn = EndDocPrinter(lhPrinter)
lReturn = ClosePrinter(lhPrinter)
Dim lDoc As Long
Dim MyDocInfo As DOCINFO
lReturn = OpenPrinter(Printer.DeviceName, lhPrinter, 0)
If lReturn = 0 Then
MsgBox "The Printer Name you typed wasn't recognized."
Exit Sub
End If
MyDocInfo.pDocName = "AAAAAA"
MyDocInfo.pOutputFile = vbNullString
MyDocInfo.pDatatype = vbNullString
lDoc = StartDocPrinter(lhPrinter, 1, MyDocInfo)
Call StartPagePrinter(lhPrinter)
End Sub
> 自作すべき箇所の書き方がわかりません
うーん。あれだけの API コードを理解するだけの力があるのに?
> では翻訳エラーになります
これはまぁ、私の説明不足だったかも知れませんが、具体例でいうと、
Dim buf() As Byte
sWrittenData = "abcどら123" & vbCrLf
buf = ConverToRawData(sWrittenData) '★←実装すべき処理
lReturn = WritePrinter(lhPrinter, buf(0), UBound(buf) + 1, lpcWritten)
という、「abcあいう123 (改行)」という文字列を印字するコードに対して、★の
Public Function ConverToRawData(ByVal text As String) As Byte()
という 自作関数 に、「abcあいう123 (改行)」の文字列を、下記の 16 バイト長の
バイナリに変換するための処理を実装する必要がある……ということです。
(Unicode → JIS への変換などは、説明不要ですよね)
Dim buf() As Byte
ReDim buf(17)
' 英数文字列「123」
buf(0) = &H61 ' ASCII の "a" に相当
buf(1) = &H62 ' ASCII の "b" に相当
buf(2) = &H63 ' ASCII の "c" に相当
' 漢字モードを開始する制御コード [FS] + [@]
buf(3) = &H1C ' file separator 制御記号
buf(4) = &H26 ' ASCII の "@" に相当
' JISかな文字列「どら」
buf(5) = &H24 ' "ど" の先導バイト
buf(6) = &H49 ' "ど" の後続バイト
buf(7) = &H24 ' "ら" の先導バイト
buf(8) = &H69 ' "ら" の後続バイト
' 漢字モードを解除する制御コード [FS] + [.]
buf(9) = &H1C ' file separator 制御記号
buf(10) = &H2E ' ASCII の "." に相当
'英数文字列「abc」
buf(11) = &H31 ' ASCII の "1" に相当
buf(12) = &H32 ' ASCII の "2" に相当
buf(13) = &H33 ' ASCII の "3" に相当
' 改行コード [CR] + [LF]
buf(14) = &HD ' carriage return (vbCr) に相当
buf(15) = &HA ' line feed (vbLf) に相当
# なお、手元に「漢字ROMを持ったプリンタ」が無いため、
# 動作確認はしていません。あしからず。
うぅ、また間違えた。
> ReDim buf(17)
この場合は ReDim buf(15) ですね。m(_ _;)m
魔界の仮面弁士様 本当にありがとうございます。
色々と試してみます。
&H1C&H26&H24&H49 ←"ど"
1バイトずつ分解しなければいけない、という理解でよかったでしょうか?
> 「abcあいう123 (改行)」という文字列を印字するコードに対して、
# そういえば、投稿前に「abcどら123 (改行)」に変更したんだっけ…。
# 今回、ミスばっかりだなぁ。(泣)
> &H1C&H26&H24&H49 ←"ど"
> 1バイトずつ分解しなければいけない、という理解でよかったでしょうか?
文字単位の処理になるので、1バイトずつというと少々語弊がありますが、
生データをプリンタに送信するのですから、いずれにしてもバイナリ送信と
いう事にはなるかと思います。
で、日本語文字列に対する漢字モードの切り替えを、1文字ずつ行うのか、
それとも、連続した漢字をひとまとまりにすべきかは、実際に試した上で
判断してみてください。
魔界の仮面弁士様、ありがとうございます。
試行錯誤しながら、やってみます。
ツイート | ![]() |