DOBON.NETプログラミング道掲示板

No35200 の記事


■35200 / )  Re[4]: VB.NetでVB6.0と同じFontを指定しても同様に印刷されない
□投稿者/ ゆりりん 一般人(3回)-(2022/10/26(Wed) 13:45:04)
  • アイコン> 逆に VB6 や VBA 側で GDI+ を使いたい場合は、Declare ステートメントで
    > GdiPlus.dll のもつ API 群を呼び出す形になりますね。
    > GdipDrawImageRectI API とか、GdipDrawString API とか。
    >
    > 今回は VB6 開発をするわけでも無いので、蛇足だとは思いますが。

    ありがとうございます。

    アドバイスをいただき、TextOutを使用して、印刷のプログラムを作成し、印刷してみたのですが、
    座標は合っているようなのですが、想定していたよりかなり小さく印刷されてしまい、ほとんど解読できないような大きさでした。
    単純に大きな値にしたら、見えるようにはなったのですが、Fontサイズの指定の仕方がわかりません。
    色々調べてみたのですが、わからなかったので、また、ここに質問させていただきます。

    ※以前のVB.Netのサンプル

    e.Graphics.PageUnit = GraphicsUnit.Millimeter
    Dim f As New Font("MS ゴシック", 9, FontStyle.Regular)
    e.Graphics.DrawString("IN-OUT<AB>CD EFG-HIJK-LMN A<10>", f, Brushes.Black, 12.5, 30.7)

    だったので、同様に、同じFontとFontSizeを指定して以下のようにやってみました。
    少し長いですが、すみません。

     ' 印刷データを指定の位置に出力します
    <System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")> _
    Friend Shared Function TextOut(ByVal hdc As IntPtr, _
    ByVal nXStart As Integer, ByVal nYStart As Integer, _
    ByVal lpString As String, ByVal cbString As Integer) As Integer
    End Function

    ' 論理フォントを作成します
    <System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")> _
    Friend Shared Function CreateFont(ByVal nHeight As Integer, ByVal nWidth As Integer, ByVal nEscapement As Integer, _
    ByVal nOrientation As Integer, ByVal fnWeight As Integer, ByVal fdwItalic As Boolean, _
    ByVal fdwUnderline As Boolean, ByVal fdwStrikeOut As Boolean, ByVal fdwCharSet As Integer, _
    ByVal fdwOutputPrecision As Integer, ByVal fdwClipPrecision As Integer, ByVal fdwQuality As Integer, _
    ByVal fdwPitchAndFamily As Integer, ByVal lpszFace As String) As IntPtr
    End Function

    --------- 省略 ---------

    Private Sub pd_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)

    Dim mFont As IntPtr
    Dim mFontOld As IntPtr

    ' Graphicsの設定をします
    e.Graphics.PageUnit = GraphicsUnit.Millimeter

    Dim intX As Integer = 0 ' X座標
    Dim intY As Integer = 0 ' Y座標
    Dim intFont As Integer = 0 ' フォントサイズ
    Dim Dt As String ' 印刷データ

    Dim hdc As IntPtr

    ' 印刷データを設定します
    Dt = "IN-OUT<AB>CD EFG-HIJK-LMN A<10>"

    ' --- QRコードを印刷 ---

    ' デバイスコンテキストを識別するハンドルを取得します
    hdc = e.Graphics.GetHdc()
    ' 座標とFontSize設定
    intX = 3
    intY = 5
    intFont = 1
    Call SetFont(hdc, "QR-01", intFont) 'QR-01:プリンタに登録したQRコードのFont
    Call PrintTextOut(hdc, intX, intY, Dt, Dt.Length) ← このQRコードはきちんと印刷されます

    ' グラフィックオブジェクトを削除し、システムリソースの解放をします
    DeleteObject(mFont)
    ' デバイスコンテキストにオブジェクトの選択をします
    SelectObject(hdc, mFontOld)
    ' デバイスコンテキストハンドルを解放します
    e.Graphics.ReleaseHdc(hdc)

    ' --- 文字列を印刷 ---

    ' デバイスコンテキストを識別するハンドルを取得します
    hdc = e.Graphics.GetHdc()
    ' 座標とFontSize設定
    intX = 12
    intY = 30
    intFont = 9
    Call SetFont(hdc, "MS ゴシック", intFont)
    Call PrintTextOut(hdc, intX, intY, Dt, Dt.Length) ← これが読み取れないくらい小さく印刷されます

    ' グラフィックオブジェクトを削除し、システムリソースの解放をします
    DeleteObject(mFont)
    ' デバイスコンテキストにオブジェクトの選択をします
    SelectObject(hdc, mFontOld)
    ' デバイスコンテキストハンドルを解放します
    e.Graphics.ReleaseHdc(hdc)


    End Sub

    ' 論理フォント作成

    Private Sub SetFont(ByVal control As IntPtr, ByVal fontFamily As String, ByVal fontSize As Integer)

    mFont = CreateFont(fontSize * -1, 0, 0, 0, 400, 0, 0, 0, 1, 0, 0, 0, 0, fontFamily)
    mFontOld = SelectObject(control, mFont)

    End Sub

    ' 文字列描写

    Private Sub PrintTextOut(ByVal hdc As IntPtr, ByVal intX As Integer, ByVal intY As Integer, ByVal strPrint As String, ByVal intCount As Integer)

    ' SATO CL4NX-J 609dpi(24dot/mm)より1dot辺りのMillimeterを指定しています
    Dim dbldotmm As Double = 0.04166
    Dim intPixelX As Integer = Convert.ToInt16(intX / dbldotmm)
    Dim intPixelY As Integer = Convert.ToInt16(intY / dbldotmm)

    Call TextOut(hdc, intPixelX, intPixelY, strPrint, intCount)

    End Sub

    e.Graphics.DrawStringの時と、同じFontとFontSizeなのですが、印刷される大きさが違ってしまいます。
    FontSizeはどのように設定すればよいのでしょうか。

    どうぞよろしくお願いいたします。

違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -