VBのPrinterオブジェクトでUnicodeを印字するには?

解決


エゥーゴ  2003-02-14 09:29:49  No: 51043

はじめまして。
Visual C++は全くのド素人です。

現在、VBでファイルにあるUnicodeを印字するプログラムを作成中です。
例えば、ファイルには以下のような文字コードが列挙されています。
----------------------------------------
0020
0021
...
FFE5
----------------------------------------

この16進数のUnicodeを取得して、文字としてプリンタに送信します。
VBでは、Unicodeの文字を表示する関数ChrWとPrinterオブジェクトで
実装しています。
----------------------------------------
'SJISに無い領域にもUnicode文字を持つフォントを指定
Printer.Font = "Arial Unicode MS"

For i = XX To XX
  '印字処理
  Printer.Print ChrW(取得した文字コード)
  '処理状況を表示するプログラム
  Progressbar.Value = XX
Next

----------------------------------------

しかし、VBでは入出力時にUnicodeをSJISコードに内部で変換しているらしく
SJISコードにないUnicode領域の文字は全て"?"に置き換えられてしまいます。

Unicode(0x3042) ⇒ あ  (VBで表示可能)
Unicode(0x8a21) ⇒ ごんべんに今という文字(VBでは表示不可)

このため、印字すると"あ"は表示されますが、下の文字は"?"で印字されます。
VCではこのような内部的な変換(Unicode ⇒ SJIS)を行わないように
指定可能と聞いたのですが。。。
そのため、印字部分全てをVCで外部DLLとして作成するか考えたのですが、
できればVBで制御したいため、プリンタに文字を送る部分VBでは
Printer.Print ChrW(取得した文字コード)の部分のみを
外部モジュールDLLとしてVCで作成できないでしょうか?
例えば、VBのプリンタオブジェクト(Printer)のハンドルと文字コードを
引数にそのプリンタに文字を送るといったことは可能でしょうか??

わけのわからない質問で申し訳ございませんが、御教授御願いします。


YuO  2003-02-15 00:49:09  No: 51044

Printer.hDCを渡せば,一応TextOutWで出力できるはずです。
バイト配列に突っ込めば文字コード変換されない,ってのを忘れずに。
ただ,VBのPrinter ObjectとAPIを同時に使ったときに,確か制限事項があったはずです。

ちなみに,利用するのはTextOutWだけなので,
Private Declare Function TextOutW Lib "GDI32.DLL" (ByVal hDC As Long, _
    ByVal nXStart As Long, ByVal nYStart As Long, lpString As Byte, _
    ByVal cbString As Long) As Long

Function TextOut (obj As Object, x As Long, y As Long, s As String) As Long
    Dim b() As Byte
    b = s
    TextOut = TextOutW(obj.hDC, x, y, b(0), Len(s))
End Function
なんてのを用意してやればDLLは不要かと。


エゥーゴ  2003-02-15 06:57:59  No: 51045

YuO様

早速試したところ、うまく印字することができました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加