文字在低分辨率显示设备显示时,会出现边缘闪烁,但可用软件进行处理修正,谁有这样的处理例程? 文字在低分辨率显示设备显示时,会出现边缘闪烁,特别在电视机中显示。我知道可以用软件来进行处理修正,但不知道怎样做,谁有这样的处理例程?或者提供一些思路也可以。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不知道用逻辑字体可不可以,我没有试过,给你一个例子: 在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)); endend; 散分,每个月总有那么郁闷的几天(三) 这个问题可能有点难度 向下键移动问题 窗口与控件的OnKeyPress事件的执行顺序! 怎么将Access中的数据表导成Excel? 这个出错是什么意思??? 添加记录问题 请问这一段VB程序如何改成DELPHI?万分救急!!! 各位,昨天我把一个程序从BDE改用ADO,发现一个问题。。。 smtp的问题? 得到文件的类型,大小,修改日期,谢谢 请大家帮忙解决一下!--如何通过网页连接调用外部程序
在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;