文字在低分辨率显示设备显示时,会出现边缘闪烁,但可用软件进行处理修正,谁有这样的处理例程?

nalfs 2003-10-17 11:04:14
文字在低分辨率显示设备显示时,会出现边缘闪烁,特别在电视机中显示。我知道可以用软件来进行处理修正,但不知道怎样做,谁有这样的处理例程?或者提供一些思路也可以。
...全文
73 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dlwxn 2003-10-20
  • 打赏
  • 举报
回复
不知道用逻辑字体可不可以,我没有试过,给你一个例子:

在windows系统有一个与字体设置相关的结构--LOGFONT,这个结构的成员变量含义如下:
typedef struct tagLOGFONT {
LONG lfHeight; //逻辑字体的大小;
LONG lfWidth; //逻辑字体的宽度;
LONG lfEscapement; //设置字体角度,精度是0.1度;
LONG lfOrientation; //字体的方位,可以与lfEscapement的设置相同;
LONG lfWeight; //逻辑字体的重量;
BYTE lfItalic; //设置逻辑字体是否倾斜;
BYTE lfUnderline; //设置逻辑字体是否有下画线;
BYTE lfStrikeOut; //设置逻辑字体是否有强调线;
BYTE lfCharSet; //设置字符集;
BYTE lfOutPrecision; //设置输出精度;
BYTE lfClipPrecision; //设置裁剪精度;
BYTE lfQuality; //设置字体质量;
BYTE lfPitchAndFamily; //设置字体族;
TCHAR lfFaceName[LF_FACESIZE]; //设置字体名;
} LOGFONT;
各参数的具体说明如下:
nHeight--字体的逻辑高度; 当nHeight>0时,该值是字符单元的尺度;当nHeight=0时,字体使用默认的高度;
当nHeight<0时,该值是字符的尺度.对可变字间距字体来说,该值说明的是平均的字符宽度.GDI总是选择尺度小于或指定值的物理字体(前提是字体可用).如果映射模式是MM_TEXT,则可用下列公式来指定大小来指定字体高度:nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY),72);
nWidth--平均逻辑单元的字符间逻辑宽度,如果该值是0,则字体映射选择一个"最匹配"的值;
nEscapement--显示正文的角度,在windows95中,该参数同时指定角度和方位;
nOrientaion--指定基线方位角(最小单位是0.1度);
fnWeight--字体宽度,指定0~1000范围的值.如果该值是0,则使用默认宽度.下列是常见的值:
FW_DONTCARE 0
FW_THIN 100
FW_EXTRALIGHT 200
FW_ULTRALIGHT 200
FW_LIGHT 300
FW_NORMAL 400
FW_REGULAR 400
FW_MEDIUM 500
FW_SEMIBOLD 600
FW_DEMIBOLD 600
FW_BOLD 700
FW_EXTRABOLD 800
FW_ULTRABOLD 800
FW_HEAVY 900
FW_BLACK 900
fdwItalic--指定字体是否倾斜标志,设置为true则字体倾斜;
fdwUnderline--指定字体是否有下画线标志,设置为true则有下画线;
fdwStrikeOut--指定字体是否有强调线标志,设置为true则设置强调线;
fdwCharSet--指明使用的字符集,以下是预定义的字符集:
ANSI_CHARSET
DEFAULT_CHARSET
SYMBOL_CHARSET
SHIFTJIS_CHARSET
GB2312_CHARSET
HANGEUL_CHARSET
CHINESEBIG5_CHARSET
OEM_CHARSET
windows 95专用的字符集:
JOHAB_CHARSET
HEBREW_CHARSET
ARABIC_CHARSET
GREEK_CHARSET
TURKISH_CHARSET
THAI_CHARSET
EASTEUROPE_CHARSET
RUSSIAN_CHARSET
MAC_CHARSET
BALTIC_CHARSET
其中 OEM_CHARSET是操作系统指定的字符集.如果使用的是DEFAULT_CHARSET值,则当指定字体名不存在时允许用默认字符集代替不存在的字符集;
fdwOutputPrecision--为GDI提供字体的输出精度,它定义了输出字体的高度,宽度,方位特性和倾斜角度特性,字体类型它可以是以下值其中的一种;
OUT_CHARACTER_PRECIS:没有使用;
OUT_DEFAULT_PRECIS--指定默认字体映射模式行为;
OUT_DEVICE_PRECIS--当系统含有多个同名的字体名时指明要选择的设备字体映射;
OUT_OUTLINE_PRECIS--Windows NT模式中,该值指明从TrueType字体和其他基于轮廓的字体; Windows 95模式中,该值没有使用;
OUT_RASTER_PRECIS--:当系统中含有多个同名字体时,指明要选择的光栅字体;
OUT_STRING_PRECIS--:该值没有在字体映射中使用,但是在列举光栅字体时是返回值;
OUT_STROKE_PRECIS--Windows NT模式下,该值没有在字体映射中使用,但在TrueType字体,其他基于轮廓的字体和矢量字体中该值作返回值; Windows 95模式下,该值用于映射矢量字体,并且可以作为列举TrueType或矢量字体的返回值;
OUT_TT_PRECIS--当系统中含有多个同名的字体名时,指明要选择的TrueType字体类型;当操作系统中含有多个指定的字体时,程序可以使用OUT_DEVICE_PRECIS, OUT_RASTER_PRECIS或OUT_TT_PRECIS控制字体映射;
fdwClipPrecision--定义范围之外的字体裁剪精度,它可以以下值中的一种:
CLIP_DEFAULT_PRECIS:指定默认的裁剪方式;
CLIP_CHARACTER_PRECIS:没有使用;
CLIP_STROKE_PRECIS:没有在字体映射中使用,但可以作为列举光栅字体,矢量字体和TrueType字体时的返回值.Windows NT模式下,为保持兼容性,该值用语列举字体的返回值;
CLIP_MASK:没有使用;
CLIP_EMBEDDED:在使用只读嵌入字体时使用该标志;
CLIP_LH_ANGLES:当该值使用时,所有字体的旋转角度决定于坐标系统;当该字体没有使用时,设备字体总是逆时针转动,但其他字体的旋转决定于坐标系统;
CLIP_TT_ALWAYS:没有使用;
fdwQuality--为GDI提供字体的输出质量,它的值可以是以下值中的一种:
DEFAULT_QUALITY:字像不匹配;
DRAFT_QUALITY:当PROOF_QUALITY值使用时,字像的重要性不是很重要.对于光栅字体来说是可缩放的,也就是说可以使用更大的字体.字体的其他属性,如粗细,倾斜,下画线和强调线都是同步变化的;
PROOF_QUALITY:字符质量比精确匹配的逻辑字体属性更重要.对于GDI光栅字体来说,选定之后的大小是不可变的,固定的.虽然选择字体的大小不能精确地映射,但当使用PROOF_QUALITY时,字体的精确度仍是比较高的,而且字体没有发生扭曲现象.同样地,字体的其他属性,如粗细,倾斜,下画线和强调线都是同步变化的;
fdwPitchAndFamily--定义字符间距和字体系列的组合,两个低字位指定字符间距,这个值可以从以下值中选取一种: DEFAULT_PITCH,FIXED_PITCH和VARIABLE_PITCH.
四个高字位指定了字体家族,可以从以下值中选取一种:
FF_DECORATIVE :新奇字体,老式英语就是其中一例;
FF_DONTCARE :不认识或不知道的字体;
FF_MODERN :带指定间距的字体,如serifs,Pica和Elite等;
FF_ROMAN :带间距不确定的字体;
FF_SCRIPT :创建像手写体的字体,如Script和Cursive;
FF_SWISS :创建带不确定间距的字体;
程序可以用布尔操作OR来连接一个字体间距常数和字体家族常数来指定字体的fdwPitchAndFamily参数;
lpszFace--指向打印机字体名字.如果该值为NULL或一个空字符串,GDI使用系统中与请求字体最匹配的字体;
说明:创建有指定特征的逻辑字体,创建的字体能被任何设备使用.
在设置好相应的参数值后,就可以通过字体API函数:CreateFontIndirect(const p1: TLogFont)则创建带指定特性结构的逻辑字体取代系统默认的字体.字体可以马上选进设备描述表中使用;函数中的参数p1指向有指定特性的逻辑LOGFONT结构,当不想使用这个字体时,可以用DeleteObject删除它;
返回值 :如果成功,则返回一个逻辑字体句柄,如果失败则返回为NULL;
2.如何实现浮雕效果
字体让我们看起来有浮雕效果,主要是因为字体在输出位置上有一定的偏移量而引起的.我们可以使用TextOut(X, Y: Integer; const Text: string)来在指定位置输出字符串,并设置一定的偏移量.这时要注意一个问题是当字符串输出位置相近时,就会产生覆盖问题.这时有一个函数可以帮助我们解决这个问题,那就是SetBkMode(hdc,iBkMode),只要把第二个参数设置为TRANSPAREN(透明)即可。

procedure TForm1.Button1Click(Sender: TObject);
var
str:string;
LogicFont:TLOGFONT;
begin
str:=Memo1.Lines.Text;
setBKmode(Image1.Canvas.handle,TRANSPARENT);

LogicFont.lfHeight :=Font.Height+strtoint(edit2.text); //设置字体大小;
LogicFont.lfWidth :=0;
LogicFont.lfWeight :=FW_NORMAL;

LogicFont.lfEscapement:=-round(strtoint(edit1.text)*10); //角度设置,*10是因为源定义的角度精度是0.1度;
LogicFont.lfOrientation:=LogicFont.lfEscapement;

LogicFont.lfUnderline:=0; //无下划线、删除线、倾斜
LogicFont.lfItalic:=0;
LogicFont.lfStrikeOut:=0;

LogicFont.lfOutPrecision :=OUT_DEFAULT_PRECIS;
LogicFont.lfClipPrecision :=CLIP_DEFAULT_PRECIS;
LogicFont.lfQuality :=DEFAULT_QUALITY;
LogicFont.lfPitchAndFamily :=DEFAULT_PITCH;

LogicFont.lfCharSet :=GB2312_CHARSET;
LogicFont.lfFaceName:='宋体';
with image1.Canvas do
begin
Font.handle:=CreateFontIndirect(LogicFont); //用新创建的字体代替默认的字体句柄;
textout(50,120,PChar(str));
end
end;
pankun 2003-10-18
  • 打赏
  • 举报
回复
系统自己有这个功能的.如何实现就不知道了.帮顶~

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧