0

私は C# でラベル プリンター用のプリンター SDK を使用しています。詳細については、次を参照してください。

https://stackoverflow.com/questions/18083309/getting-a-printer-api-to-work-with-c-sharp

そこで与えられたアドバイスを受けて、PInvoke を使用して DLL 内の関数を機能させました。驚いたことに、すべてがまとまり始めました...ほとんどの場合。

関数 SlpDrawTextXY() は、Hfont タイプのフォントの引数を取ることができるはずです。これは、SlpCreateFont() という関数によって作成できます。(これらのメソッドの詳細は、ドキュメントのそれぞれ 21 ページと 19 ページにあります)。

さて、Hfont が実際に何であるかを発見する私の探求はうまくいきませんでした。MSDN はそれについて少し言及していますが、それが正確に何であるかを実際には教えてくれません。提供されている記事は、あなたが盲目である場合にはあまり役に立ちません. それに関する他のドキュメントは非常にスリムで、一体何が起こっているのか推測するしかありません。

次のようなコード ブロックがあります。

public partial class Form1 : Form
{
    [DllImport("SlpApi7x32.dll")]
    static extern void SlpDebugMode(int nMode);

    [DllImport("SlpApi7x32.dll")]
    static extern int SlpOpenPrinter(String strPrinterName, int nID, bool fPortrait);

    [DllImport("SlpApi7x32.dll")]
    static extern void SlpClosePrinter();

    [DllImport("SlpApi7x32.dll")]
    static extern bool SlpStartLabel();

    [DllImport("SlpApi7x32.dll")]
    static extern void SlpDrawTextXY(int x, int y, Font iFont, String lpText);

    [DllImport("SlpApi7x32.dll")]
    static extern bool SlpEndLabel();

    [DllImport("SlpApi7x32.dll")]
    static extern Font SlpCreateFont(String lpName, int nPoints, int nAttributes);

    [DllImport("GDI32.dll")]
    public static extern bool DeleteObject(IntPtr objectHandle); 

    public Form1()
    {
        InitializeComponent();
    }

    private void print_Click(object sender, EventArgs e)
    {
        //Font myFont = new Font("Arial", 12);
        //IntPtr hFont = myFont.ToHfont();

        SlpDebugMode(2);

        SlpOpenPrinter("Smart Label Printer 440", 1, false);

        {
            SlpStartLabel();

            //Font font = SlpCreateFont("Courier", 12, 0);
            SlpDrawTextXY(30, 30, null, "Hello World!");

            SlpEndLabel();
        }

        SlpClosePrinter();
    }
}

コメントアウトされた私のいじり回しの名残がいくつかあります。コメントアウトされている場合、機能しません。

このコードは実際にプリンターに送られ、空白のラベルを「印刷」するので、私は本当に近いように思えます. SlpDrawTextXY の 3 番目の引数は、フォントがあるべき場所であり、それを正常に通過できるかどうかを確認するために「null」に設定しています。このコードは、ドキュメントの 12 ページのサンプル C コードに基づいています。このコードを、実際にテキストを出力するコードに変換できるようにしたいと考えています。

4

2 に答える 2

2
[DllImport("SlpApi7x32.dll")]
static extern Font SlpCreateFont(...)

ここでの使用Fontは正しくありません。SlpCreateFont() は、「フォントのハンドル」である HFONT を返します。これは、アンマネージ コードでフォントを作成するときにフォントを操作する方法です。そして、Font.ToHfont()メソッドから返されるのとまったく同じ種類の動物です。したがって、ToHfont() が返す方法で宣言する必要がありIntPtrます。宣言に含める必要があります。それに応じて他の宣言を更新します。

SlpCreateFont() の代わりに Font.ToHfont() を使用できる可能性が高いことに注意してください。ルールは同じですが、フォントの使用が終わったら必ずDeleteObject() を呼び出す必要があります。そうしないと、最終的にコードがクラッシュする GDI オブジェクトがリークされます。

于 2013-08-06T19:42:50.347 に答える
0

ハンスは完全に正しかった。今後の参考のために、以下は作業コードです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace SSLP
{
public partial class Form1 : Form
{
    [DllImport("SlpApi7x32.dll")]
    static extern void SlpDebugMode(int nMode);

    [DllImport("SlpApi7x32.dll")]
    static extern int SlpOpenPrinter(String strPrinterName, int nID, bool fPortrait);

    [DllImport("SlpApi7x32.dll")]
    static extern void SlpClosePrinter();

    [DllImport("SlpApi7x32.dll")]
    static extern bool SlpStartLabel();

    [DllImport("SlpApi7x32.dll")]
    static extern void SlpDrawTextXY(int x, int y, IntPtr iFont, String lpText);

    [DllImport("SlpApi7x32.dll")]
    static extern bool SlpEndLabel();

    [DllImport("SlpApi7x32.dll")]
    static extern IntPtr SlpCreateFont(String lpName, int nPoints, int nAttributes);

    [DllImport("GDI32.dll")]
    public static extern bool DeleteObject(IntPtr objectHandle); 

    public Form1()
    {
        InitializeComponent();
    }
    private void Button1_Click(object sender, EventArgs e)
    {

        IntPtr font = SlpCreateFont("Arial", 10, 0);

        SlpDebugMode(2);

        //The second parameter defines the type of label per the documentation.
        SlpOpenPrinter("Smart Label Printer 440", 3, false);

        {
            SlpStartLabel();

            //Draw as much as you want with these!
            SlpDrawTextXY(0, 0, font, "Hello World");

            SlpEndLabel();
        }

        SlpClosePrinter();

        DeleteObject(font);
    }
}

}

于 2013-08-13T16:32:05.613 に答える