2017-03-31 153 views
1

我正在尝试使用CreateFont加载Code 128字体,因此我可以在纸条上输出条形码。 CreateFont不返回NULL,但似乎无法找到正确的字体,并加载其他内容,因为我将代码打印为纯文本。在POS打印机上打印条形码字体

这是条码功能。

void EpicSlipPrinter::addBarcode (const QString& text) 
{ 
    HFONT tempFont = CreateFont (60 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , L"Code 128"); 
    oFont = (HFONT)SelectObject (mPrinterHandle , tempFont); 

    INT ixPosition = iPaperWidth/2; 

    SIZE sz = getTextDimensions (text , 3 , 3 , 600 , 0 , 0); 

    SetTextAlign (mPrinterHandle , TA_CENTER); 

    TextOut (mPrinterHandle , ixPosition , iyPosition , text , text.length()); 

    SelectObject (mPrinterHandle , oFont); 
    DeleteObject(tempFont); 
} 

文本参数是绝对正确的所以我认为正在发生的是的CreateFont找不到指定的字体和默认到别的东西。字体被正确加载,并且可以从Windows应用程序中选择,如果我在Word中输入代码,那么我会得到一个可以从扫描仪读取的条形码。

我的问题是没有人知道为什么CreateFont不加载代码128或如果有另一个问题,我失踪了?

回答

1

您已经为fdwCharSet指定了0,它对应于ANSI_CHARSET,因此字体映射器正在寻找支持当前代码页的东西。尝试使用SYMBOL_CHARSET来处理这些特殊字体。

+0

只要我活着,我永远不会理解微软的字体映射器。字体名称应该是最重要的输入,但它不是。 –

+0

@Mark Ransom:始终使用字体名称的问题在于,尝试在其他脚本中打印文本时,您不会获得字体链接。较新的API,如DirectWrite,似乎完全避免了这个charset遗留问题。 –

+0

虽然它与文档不太一致,但我认为你总是可以使用DEFAULT_CHARSET,这似乎给了字体名称的先例。 (它适用于Marlett和我试过的其他特殊符号字体。 我没有Code 128.) –