使用旧版 borland 软件打印模糊
Blurry print with legacy borland software
这是我的问题:我必须将为 windows NT 4(我认为)制作的旧软件移植到 Windows 7 或更新版本的旧 Borland。该程序 运行 很好(dependency walker 没问题,App Verifier 显示 Bad DEVMODE 缓冲区,但此错误存在于 XP 上并且运行良好)。
程序必须打印带有一些信息的标签,这在 windows XP 上运行良好,但在七个数字上模糊不清,我不知道为什么,我也不知道如何解决这个问题。
我的打印机工作正常,因为我可以完美地打印 7 个文本,如果我用 pdf 打印机打印,问题仍然相同,所以我认为问题出在 windows。
有什么想法吗?
编辑 1:
我有源代码的某些部分,但 IDE 中包含的部分丢失了。
打印机不在原因我认为是因为这两个测试是一样的而且问题仍然存在于 PDF 打印机
这里是 print 的源代码:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <printers.hpp>
#include "FileCtrl.hpp"
#include "IniFileName.h"
#include "PrnEtiQ.h"
#include "CheckDll.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TEtiquette *Etiquette;
//---------------------------------------------------------------------------
__fastcall TEtiquette::TEtiquette(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TEtiquette::PrintEti(AnsiString Name,double OD,double OG,double xrb,int PrnIndex)
{
if (PrnIndex==-1) return;
TIniFile * pIni=new TIniFile(GetIniFileName());
if (pIni)
{
DecalX=pIni->ReadInteger("ETIQUETTE","Decal_X",150);
DecalY=pIni->ReadInteger("ETIQUETTE","Decal_Y",0);
pIni->WriteInteger("ETIQUETTE","Decal_X",DecalX);
pIni->WriteInteger("ETIQUETTE","Decal_Y",DecalY);
delete pIni;
}
else
{
DecalX=150;
DecalY=0;
}
LblName->Caption=Name;
PerimDroit->Caption=FormatFloat("##0.0000",OD);
PerimGauche->Caption=FormatFloat("##0.0000",OG);
XRB->Caption=FormatFloat("##0.00",xrb);
Printer()->PrinterIndex=PrnIndex;
int MemoWidth=Width;
int MemoHeight=Height;
Width=MemoWidth+DecalX;
Height=MemoHeight+DecalY;
Panel1->Left=DecalX;
Panel1->Top=DecalY;
Print();
Width=MemoWidth;
Height=MemoHeight;
Panel1->Left=0;
Panel1->Top=0;
}
//---------------------------------------------------------------------------
这是描述标签形状的 .DFM 文件
object Etiquette: TEtiquette
Left = 167
Top = 149
HorzScrollBar.Visible = False
VertScrollBar.Visible = False
BorderIcons = []
BorderStyle = bsNone
ClientHeight = 33
ClientWidth = 142
Color = clWhite
UseDockManager = True
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'Arial Black'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
PixelsPerInch = 96
TextHeight = 18
object Panel1: TPanel
Left = 0
Top = 0
Width = 143
Height = 34
BevelOuter = bvNone
Color = clWhite
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'Arial Black'
Font.Style = []
ParentFont = False
TabOrder = 0
object PerimGauche: TLabel
Left = 4
Top = 0
Width = 65
Height = 11
AutoSize = False
Caption = '200.00'
Color = clWhite
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentColor = False
ParentFont = False
end
object PerimDroit: TLabel
Left = 72
Top = 0
Width = 66
Height = 11
Alignment = taRightJustify
AutoSize = False
Caption = '100.00'
Color = clWhite
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentColor = False
ParentFont = False
end
object XRB: TLabel
Left = 40
Top = 12
Width = 57
Height = 11
Alignment = taCenter
AutoSize = False
Caption = '123.45'
Color = clWhite
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentColor = False
ParentFont = False
end
object LblName: TLabel
Left = 4
Top = 20
Width = 42
Height = 14
Caption = '18241_1'
Color = clWhite
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = []
ParentColor = False
ParentFont = False
end
end
end
如您所见,字体是硬编码的,所以我不认为问题出在那里而且我检查了字体,它们是同一版本。
编辑 2:https://drive.google.com/file/d/0B0AeGDmETlPXbGlPX3dUSG1WUzg/view?usp=sharing
由于您的问题不够具体,所以这里有一些提示可能有助于代替答案:
有打印源代码吗?
在源代码中搜索以下内容:
#include <Printers.hpp>
TPrinter *prn = Printer();
// here open dialog window... set the printing parameters
prn->BeginDoc();
// here draw the printed image to prn->Canvas
prn->NewPage();
// here draw the printed image to prn->Canvas
// ...
prn->EndDoc();
尝试将 prn->Canvas
复制到 Graphics::TBitmap *bmp->CopyRect(...)
,然后将其保存到文件 bmp->SaveToFile("print.bmp");
。在打印之前检查问题是否出在渲染图像上。另外 post 在这里打印代码,以便我们查看是否有任何可疑之处。如果您不熟悉 VCL 下的 Canvas/Bitmap,请参阅:
- GDI and Bitmap section
post打印正确和错误打印的图像怎么样。
现在我能想到的几种可能性如下:
一些Win7增强文本功能改变使用的字体
使用的字体参数与 XP 不同
可以尝试复制XP字体到你的Win7(别忘了保存原件)
错误选择了打印机纸张区域(以像素为单位)
(x64 Windows 是 WOW64 模拟器中的 运行 Win32 应用程序,它具有不同的驱动程序集,可能是 returns 不同的 printer/parameters 或其他)
较新的打印机驱动程序(如 HP)
通过将打印图像缩放到 97%
来增加默认碳粉节省,从而产生 aliasing/blurring 伪像。检查打印对话框 window 是否存在此类问题
一些第 3 方组件的使用
我不再使用它们,因为它们很快就会过时且不受支持,并且在移植到更新的 OS、编译器时让我的生活变得一团糟。更不用说它们的价格通常很疯狂
这是我的问题:我必须将为 windows NT 4(我认为)制作的旧软件移植到 Windows 7 或更新版本的旧 Borland。该程序 运行 很好(dependency walker 没问题,App Verifier 显示 Bad DEVMODE 缓冲区,但此错误存在于 XP 上并且运行良好)。
程序必须打印带有一些信息的标签,这在 windows XP 上运行良好,但在七个数字上模糊不清,我不知道为什么,我也不知道如何解决这个问题。
我的打印机工作正常,因为我可以完美地打印 7 个文本,如果我用 pdf 打印机打印,问题仍然相同,所以我认为问题出在 windows。
有什么想法吗?
编辑 1: 我有源代码的某些部分,但 IDE 中包含的部分丢失了。 打印机不在原因我认为是因为这两个测试是一样的而且问题仍然存在于 PDF 打印机
这里是 print 的源代码:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <printers.hpp>
#include "FileCtrl.hpp"
#include "IniFileName.h"
#include "PrnEtiQ.h"
#include "CheckDll.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TEtiquette *Etiquette;
//---------------------------------------------------------------------------
__fastcall TEtiquette::TEtiquette(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TEtiquette::PrintEti(AnsiString Name,double OD,double OG,double xrb,int PrnIndex)
{
if (PrnIndex==-1) return;
TIniFile * pIni=new TIniFile(GetIniFileName());
if (pIni)
{
DecalX=pIni->ReadInteger("ETIQUETTE","Decal_X",150);
DecalY=pIni->ReadInteger("ETIQUETTE","Decal_Y",0);
pIni->WriteInteger("ETIQUETTE","Decal_X",DecalX);
pIni->WriteInteger("ETIQUETTE","Decal_Y",DecalY);
delete pIni;
}
else
{
DecalX=150;
DecalY=0;
}
LblName->Caption=Name;
PerimDroit->Caption=FormatFloat("##0.0000",OD);
PerimGauche->Caption=FormatFloat("##0.0000",OG);
XRB->Caption=FormatFloat("##0.00",xrb);
Printer()->PrinterIndex=PrnIndex;
int MemoWidth=Width;
int MemoHeight=Height;
Width=MemoWidth+DecalX;
Height=MemoHeight+DecalY;
Panel1->Left=DecalX;
Panel1->Top=DecalY;
Print();
Width=MemoWidth;
Height=MemoHeight;
Panel1->Left=0;
Panel1->Top=0;
}
//---------------------------------------------------------------------------
这是描述标签形状的 .DFM 文件
object Etiquette: TEtiquette
Left = 167
Top = 149
HorzScrollBar.Visible = False
VertScrollBar.Visible = False
BorderIcons = []
BorderStyle = bsNone
ClientHeight = 33
ClientWidth = 142
Color = clWhite
UseDockManager = True
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'Arial Black'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
PixelsPerInch = 96
TextHeight = 18
object Panel1: TPanel
Left = 0
Top = 0
Width = 143
Height = 34
BevelOuter = bvNone
Color = clWhite
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'Arial Black'
Font.Style = []
ParentFont = False
TabOrder = 0
object PerimGauche: TLabel
Left = 4
Top = 0
Width = 65
Height = 11
AutoSize = False
Caption = '200.00'
Color = clWhite
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentColor = False
ParentFont = False
end
object PerimDroit: TLabel
Left = 72
Top = 0
Width = 66
Height = 11
Alignment = taRightJustify
AutoSize = False
Caption = '100.00'
Color = clWhite
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentColor = False
ParentFont = False
end
object XRB: TLabel
Left = 40
Top = 12
Width = 57
Height = 11
Alignment = taCenter
AutoSize = False
Caption = '123.45'
Color = clWhite
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentColor = False
ParentFont = False
end
object LblName: TLabel
Left = 4
Top = 20
Width = 42
Height = 14
Caption = '18241_1'
Color = clWhite
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Arial'
Font.Style = []
ParentColor = False
ParentFont = False
end
end
end
如您所见,字体是硬编码的,所以我不认为问题出在那里而且我检查了字体,它们是同一版本。
编辑 2:https://drive.google.com/file/d/0B0AeGDmETlPXbGlPX3dUSG1WUzg/view?usp=sharing
由于您的问题不够具体,所以这里有一些提示可能有助于代替答案:
有打印源代码吗?
在源代码中搜索以下内容:
#include <Printers.hpp>
TPrinter *prn = Printer();
// here open dialog window... set the printing parameters
prn->BeginDoc();
// here draw the printed image to prn->Canvas
prn->NewPage();
// here draw the printed image to prn->Canvas
// ...
prn->EndDoc();
尝试将 prn->Canvas
复制到 Graphics::TBitmap *bmp->CopyRect(...)
,然后将其保存到文件 bmp->SaveToFile("print.bmp");
。在打印之前检查问题是否出在渲染图像上。另外 post 在这里打印代码,以便我们查看是否有任何可疑之处。如果您不熟悉 VCL 下的 Canvas/Bitmap,请参阅:
- GDI and Bitmap section
post打印正确和错误打印的图像怎么样。
现在我能想到的几种可能性如下:
一些Win7增强文本功能改变使用的字体
使用的字体参数与 XP 不同
可以尝试复制XP字体到你的Win7(别忘了保存原件)
错误选择了打印机纸张区域(以像素为单位)
(x64 Windows 是 WOW64 模拟器中的 运行 Win32 应用程序,它具有不同的驱动程序集,可能是 returns 不同的 printer/parameters 或其他)
较新的打印机驱动程序(如 HP)
通过将打印图像缩放到
97%
来增加默认碳粉节省,从而产生 aliasing/blurring 伪像。检查打印对话框 window 是否存在此类问题一些第 3 方组件的使用
我不再使用它们,因为它们很快就会过时且不受支持,并且在移植到更新的 OS、编译器时让我的生活变得一团糟。更不用说它们的价格通常很疯狂