none
gdi64 , gdi32 等の認識について。 RRS feed

  • 質問

  • 練習から1ヶ月程度なので、的外れな質問であれば、申し訳ありません。
    印刷時に、プリンタの印刷可能範囲を調べるため、下記プログラムを試していたものです。

        Private Declare Function GetDeviceCaps Lib "gdi64" (ByVal hdc As IntPtr, ByVal nindex As Integer) As Integer
        Private Const LOGPIXELSX = 88
        Private Const LOGPIXELSY = 90
        Private Const PHYSICALOFFSETX = 112
        Private Const PHYSICALOFFSETY = 113
        Dim isInPrinting As Boolean = False

        Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            '描画サーフェイスの単位をミリメートルにする。
            e.Graphics.PageUnit = GraphicsUnit.Millimeter
            '原点の位置をずらす
            If isInPrinting Then
                Dim hDC As IntPtr
                hDC = e.Graphics.GetHdc()
                Dim dpiX = GetDeviceCaps(hDC, LOGPIXELSX)
                Dim dpiY = GetDeviceCaps(hDC, LOGPIXELSY)
                Dim marginX = GetDeviceCaps(hDC, PHYSICALOFFSETX)
                Dim marginY = GetDeviceCaps(hDC, PHYSICALOFFSETY)
                e.Graphics.ReleaseHdc()
                e.Graphics.TranslateTransform(-marginX / dpiX * 25.4, -marginY / dpiY * 25.4, Drawing2D.MatrixOrder.Append)
            End IF

    Lib "gdi64"について、当初”gdi32”としたところ、プログラムは動くのですが、初期位置にズレが生じたため、”gdi64”にしたところ、以下の不具合が確認されました。

    (印刷ダイアログを表示してから印刷 → System.DllNotFoundException: 'DLL 'gdi64' を読み込めません:指定されたモジュールが見つかりません。 )

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If PrintDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
                isInPrinting = True
                PrintDocument1.Print()
                isInPrinting = False
            End If

        End Sub

    (印刷プレビューダイアログを表示してから、印刷 → 成功、初期位置も修正されていました。)

       Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

            PrintPreviewDialog1.Document = PrintDocument1
            PrintPreviewDialog1.Width = 480
            PrintPreviewDialog1.Height = 600

            PrintPreviewDialog1.ShowDialog()

    同じ、printdocumentの印刷に至る過程とは思ったのですが、プログラムを呼び出すのに、何かしらの違いがあるようです。
    まだ、難しいことはわからないレベルですが、何かしらの回答を頂きたいと思います。

    2017年10月27日 5:05

回答

  • gdi64というファイルは見たことがありません。64bit OSであってもgdi32.dllのまま変更されていない点は理解されていますか?

    位置がずれる点については、High DPIが影響している可能性があります。試しに画面の拡大率を100%に変更し、尚且つログオンし直してから実行した場合に改善しますか? またそもそもアプリケーションとしてHigh DPIには対応していますか? 

    2017年10月27日 5:56

すべての返信

  • gdi64というファイルは見たことがありません。64bit OSであってもgdi32.dllのまま変更されていない点は理解されていますか?

    位置がずれる点については、High DPIが影響している可能性があります。試しに画面の拡大率を100%に変更し、尚且つログオンし直してから実行した場合に改善しますか? またそもそもアプリケーションとしてHigh DPIには対応していますか? 

    2017年10月27日 5:56
  • APIは全然わからず、32でダメだったから、とりあえず64にしたものですが、エラー表示が出たのはその理由ですね。

    とすると、エラー表示が出なかった(プレビューを表示してから印刷)方と、32→64に文字を変えるとズレが修正されたことの方が何か変って話になりますね。
    少し調べてみます。ありがとうございました。

    2017年10月27日 8:16
  • 週末、改めてgdi32の表記で上記プログラムのデバッグしたところ、印刷ダイアログ→印刷の方では印字が正しく補正され、印刷プレビューダイアログ→印刷の方では、補正されずにそのまま(プリンターによる印刷可能領域を左上隅とした)印刷が行われました。

    希望する結果で満足しています。重ねてありがとうございました。

    2017年10月30日 5:15