WinAPI: CreateFontIndirect - 根据字体结构建立逻辑字体

//声明:
CreateFontIndirect(
  const p1: TLogFont {字体结构}
): HFONT;            {返回新字体指针}

//TLogFont 是 tagLOGFONTA 结构的重定义:
tagLOGFONTA = packed record
  lfHeight: Longint;      {字体高度}
  lfWidth: Longint;       {字体平均宽度}
  lfEscapement: Longint;  {角度, 单位是 1/10 度}
  lfOrientation: Longint; {基线角度}
  lfWeight: Longint;      {粗体, 取值: 0-1000}
  lfItalic: Byte;         {斜体}
  lfUnderline: Byte;      {下划线}
  lfStrikeOut: Byte;      {删除线}
  lfCharSet: Byte;        {字符集}
  lfOutPrecision: Byte;   {输出精度}
  lfClipPrecision: Byte;  {剪裁精度}
  lfQuality: Byte;        {输出质量}
  lfPitchAndFamily: Byte; {间距及字族}
  lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar; {字样名称}
end;

 
 
 
 
 

 

 

  

//例1:
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  FontInfo: TLogFont; {声明字体结构}
  FH1,FH2: HFONT;     {声明字体句柄}
const
  str = '万一的 Delphi 博客';
begin
  {定义字体特征}
  FontInfo.lfHeight := 0;     {赋值 0, 系统自动给一个值}
  FontInfo.lfWidth := 0;      {赋值 0, 系统自动给一个值}
  FontInfo.lfEscapement := 0; {无角度}
  FontInfo.lfWeight := 500;   {中等加粗}
  FontInfo.lfItalic := 0;     {非斜体}
  FontInfo.lfUnderline := 0;  {无下划线}
  FontInfo.lfStrikeOut := 0;  {无删除线}
  FontInfo.lfFaceName := '宋体';
  
  FH1 := CreateFontIndirect(FontInfo);
  FH2 := SelectObject(Canvas.Handle, FH1);
  {用 CreateFontIndirect 建立逻辑字体; 用 SelectObject 选人设备; 并返回字体句柄}
  
  TextOut(Canvas.Handle, X, Y, str, Length(str));
  
  DeleteObject(FH1);
  DeleteObject(FH2);
end;

 
 
 
 
 

 

 

  

//效果图:
26153533_wqX1.png
//例2: 扁字
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  FontInfo: TLogFont; 
  FH1,FH2: HFONT; 
const
  str = '万一的 Delphi 博客';
begin
  FontInfo.lfHeight := 0;     
  FontInfo.lfWidth := 12;     {只修改了此处} 
  FontInfo.lfEscapement := 0; 
  FontInfo.lfWeight := 500;   
  FontInfo.lfItalic := 0;     
  FontInfo.lfUnderline := 0;  
  FontInfo.lfStrikeOut := 0;  
  FontInfo.lfFaceName := '宋体';
  
  FH1 := CreateFontIndirect(FontInfo);
  FH2 := SelectObject(Canvas.Handle, FH1);

  TextOut(Canvas.Handle, X, Y, str, Length(str));

  DeleteObject(FH1);
  DeleteObject(FH2);
end;

 
 
 
 
 

 

 

  

//效果图:
26153533_OIBz.png
//例3: 长字
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  FontInfo: TLogFont; 
  FH1,FH2: HFONT;   
const
  str = '万一的 Delphi 博客';
begin
  FontInfo.lfHeight := 32;    {修改了此处}  
  FontInfo.lfWidth := 12;     
  FontInfo.lfEscapement := 0; 
  FontInfo.lfWeight := 500;   
  FontInfo.lfItalic := 0;     
  FontInfo.lfUnderline := 0;  
  FontInfo.lfStrikeOut := 0;  
  FontInfo.lfFaceName := '宋体';
  
  FH1 := CreateFontIndirect(FontInfo);
  FH2 := SelectObject(Canvas.Handle, FH1);

  TextOut(Canvas.Handle, X, Y, str, Length(str));

  DeleteObject(FH1);
  DeleteObject(FH2);
end;

 
 
 
 
 

 

 

  

//效果图:
26153533_jzh8.png
//例4: 旋转
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  FontInfo: TLogFont; 
  FH1,FH2: HFONT;       
const
  str = '万一的 Delphi 博客';
begin
  FontInfo.lfHeight := 0;      
  FontInfo.lfWidth := 0;     
  FontInfo.lfEscapement := 450; {修改了此处}
  FontInfo.lfWeight := 500;   
  FontInfo.lfItalic := 0;     
  FontInfo.lfUnderline := 0;  
  FontInfo.lfStrikeOut := 0;  
  FontInfo.lfFaceName := '宋体';
  
  FH1 := CreateFontIndirect(FontInfo);
  FH2 := SelectObject(Canvas.Handle, FH1);

  TextOut(Canvas.Handle, X, Y, str, Length(str));

  DeleteObject(FH1);
  DeleteObject(FH2);
end;

 
 
 
 
 

 

 

  

//效果图:
26153533_EY9v.png
//一个利用角度的示例:
procedure TForm1.FormPaint(Sender: TObject);
var
  FontInfo: TLogFont; 
  FH1,FH2: HFONT; 
  x,y,i: Integer;
const
  str = '万一的 Delphi 博客';
begin
  FontInfo.lfHeight := 0; 
  FontInfo.lfWidth := 0;     
  FontInfo.lfEscapement := 0; 
  FontInfo.lfWeight := 1000;   
  FontInfo.lfItalic := 0;     
  FontInfo.lfUnderline := 0;  
  FontInfo.lfStrikeOut := 0;  
  FontInfo.lfFaceName := '宋体';

  x := ClientWidth div 2;
  y := ClientHeight div 2;

  SetBkMode(Canvas.Handle, TRANSPARENT);

  i := 0;
  while i<360 do
  begin
    FontInfo.lfEscapement := i * 10;
    FH1 := CreateFontIndirect(FontInfo);
    FH2 := SelectObject(Canvas.Handle, FH1);
    TextOut(Canvas.Handle, X, Y, str, Length(str));
    Inc(i,10);
  end;
 
  DeleteObject(FH1);
  DeleteObject(FH2);
end;

 
 
 
 
 

 

 

  

//效果图:
26153533_82RO.png

转载于:https://my.oschina.net/hermer/blog/320138

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值