如何产生象FontDialog中设置字体大小的列表????(50分)

  • 主题发起人 主题发起人 tank37
  • 开始时间 开始时间
T

tank37

Unregistered / Unconfirmed
GUEST, unregistred user!
如题!
就是和word一样的字体设置....不全是几号字体...还有像什么"五号"..."小五号"....的!!
 
用ListBox不行吗?为啥这么问?
 
不是不是....我是问我该怎样获得列表????

我知道的是字体大小可以设在1..100之间变化,但是每一种字体字体的设置都应当是不一
样的列表....就像fontDialog里的设置字体大小的那种下拉列表!!!!
 
看看DELPHI自带的DEMO,具体名字忘记了,但肯定有你想要的东东
 
肯定有一个对象,你找找看,在TFontDialog中。
 
大富翁以前的例程,谁的忘了。


以下的函数GetFontSizeList用来取得字体名为FontName的字体的所有可用尺寸,而EnumFontsSize是其中要用到的字体枚举回调函数:

function EnumFontsSize(var LogFont: TLogFont; var TextMetric: TTextMetric;
FontType: Integer; Data: Pointer): Integer; stdcall;
begin
TStrings( Data ).Add(IntToStr( LogFont.lfHeight) );
Result := 1;
end;

procedure GetFontSizeList( FontName : String; List : TStrings );
//FontName,是字体名;
//这种字体的所有可用尺寸将被填在List中。
var
DC: HDC;
begin
List.Clear;
DC := GetDC(0);
EnumFonts(DC, PChar(FontName), @EnumFontsSize, Pointer(List));
ReleaseDC(0, DC);
end;

///////////////////////////////////////////////////////////////////
var
Form1: TForm1;
VRES:Integer;

const
MaxStdSizes=16;

function EnumFontFamiliesProc(var LogFont: TLogFont; var TextMetric: TTextMetric;
FontType: Integer; Data:Pointer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} export; {$ENDIF}

procedure AddToList(const aValue:String);
var
j:Integer;
c:Boolean;
begin
j:=0;
c:=False;
with TListBox(Data) do
begin
while (j<Items.Count) and not c do
if StrToInt(aValue)>=StrToInt(Items[j]) then Inc(j) else c:=True;
Items.Insert(j, aValue);
end;
end;

var
i:Integer;
c:String;
const
csizes:array[0..MaxStdSizes-1] of Integer=(8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72);

begin
result:=0;
with TListBox(Data) do
begin
if (FontType and TRUETYPE_FONTTYPE=TRUETYPE_FONTTYPE) or (FontType in [0,2]) then
begin
For i:=0 to (MaxStdSizes-1) do Items.Add(IntToStr(Csizes));
result:=0
end;

if (FontType and RASTER_FONTTYPE=RASTER_FONTTYPE)
{or (FontType and DEVICE_FONTTYPE=DEVICE_FONTTYPE)} then
with TextMetric do
begin
c:=IntToStr(Round((tmHeight-tmInternalLeading)*72 / VRES));
if Items.IndexOf(c)=-1 then AddToList(c);
result:=1;
end;
end
end;

procedure TForm1.DoList(FFontName:String);
var
buffer:array[0..255] of Char;
DC:HDC;
begin
ListBox1.Items.Clear;

DC:=GetDC(0);
StrPCopy(Buffer, FFontName);
vres:=GetDeviceCaps(DC, LOGPIXELSY);
EnumFontFamilies(DC, Buffer, @EnumFontFamiliesProc,
LongInt(ListBox1));
ReleaseDC(0, DC);
end;

 
我能不能再问一下.中文中如"小五号"字和"9"号字是怎样换算的来得
 

Similar threads

回复
0
查看
863
不得闲
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部