線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:10164
推到 Plurk!
推到 Facebook!

如何使用OpenDialog取得字型檔?

答題得分者是:pceyes
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-19 17:10:24 IP:61.219.xxx.xxx 訂閱
小弟使用OpenDialog可以開始*.ttf檔案
但若是想要直接去取得C:\windows\fonts\裡的字型檔案,該如何得到該ttf檔的檔名呢?

另外,小弟取得ttf檔後,該如何傳TTF檔裡的檔案名稱讓Tmemo裡的字改變字型?
小弟搜尋過站內的文章,但到

[code delphi]
AddFontResource(PChar(D:\A.TTF));
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
[/code]

這兩句後就卡住了
小弟愚鈍,實在不知道該怎麼傳給Tmemo...= =b
------
永遠都是新手
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-19 18:35:44 IP:60.248.xxx.xxx 訂閱
HI, 先請教一下,您知道有 TFontDialog 可以用嗎? 還是這個不是您要用的???
因為看下面的目的似乎也只是要換字型而已,還是有其他用途?

===================引 用 Reiji 文 章===================
小弟使用OpenDialog可以開始*.ttf檔案
但若是想要直接去取得C:\windows\fonts\裡的字型檔案,該如何得到該ttf檔的檔名呢?

另外,小弟取得ttf檔後,該如何傳TTF檔裡的檔案名稱讓Tmemo裡的字改變字型?
小弟搜尋過站內的文章,但到

[code delphi]
AddFontResource(PChar(D:\A.TTF));
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
[/code]

這兩句後就卡住了
小弟愚鈍,實在不知道該怎麼傳給Tmemo...= =b
------
價值的展現,來自於你用哪一個角度來看待它!!
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-19 19:55:29 IP:59.127.xxx.xxx 訂閱
是,小弟主要是想做的像FONTVIEW的小工具
並且是可以自由load各目錄下的字型檔來查看字型
還打算要做個字型輸出比較的功能
所以TFontDialog對小弟來說感覺好像無法達到?
------
永遠都是新手
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-19 21:15:35 IP:59.126.xxx.xxx 訂閱
HI, 可以這樣試試    (參考網站:delphi.about.com )

拉一個 Combobox 在 Form 上,並他的屬性 Style 設為 csOwnerDrawFixed ,並命名為 FontCombo

然後在 FormCreate 的地方加上

var cnt : integer;
begin
for cnt := 0 to Screen.Fonts.Count-1 do
FontCombo.Items.Add(Screen.Fonts.Strings[cnt]) ;
end;


在這個 ComboBox 的 OnDrawItem 寫下
[code delphi]
procedure TForm1.FontComboDrawItem(Control: TWinControl; Index: Integer; Rect: TRect;
State: TOwnerDrawState);
begin
with (Control as TComboBox).Canvas do
begin
Font.Name := Screen.Fonts.Strings[Index];
FillRect(Rect) ;
TextOut(Rect.Left, Rect.Top, PChar(Screen.Fonts.Strings[Index]))
end;
end;
[/code]

參考圖如下




===================引 用 Reiji 文 章===================
是,小弟主要是想做的像FONTVIEW的小工具
並且是可以自由load各目錄下的字型檔來查看字型
還打算要做個字型輸出比較的功能
所以TFontDialog對小弟來說感覺好像無法達到?
------
價值的展現,來自於你用哪一個角度來看待它!!
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-19 21:50:37 IP:220.141.xxx.xxx 訂閱
參考這篇
\\winnt\fonts\標楷體 是不行的,必須Copy Delphi 新手問題 / 作業研討 » 如何SHOW檔案列表
http://delphi.ktop.com.tw/board.php?cid=30&fid=1498&tid=94610
GETMYFILE('c:\winnt\fonts');

[code delphi]
function GetFontName(FileNameTTF : string): string;
{ return the "friendly name" for a TrueType font from a .TTF file }
var
hFile : file;
Buffer : string;
TempName : string;
iPos, jPos : Integer;
begin
{Build name for new resource file in}
{a temporary file, and call the API.}
TempName := ExtractFilePath(Application.ExeName) '~TEMP.FOT';

{ build temporary .FOT file for the .TTF }
if CreateScalableFontResource(1, PChar(TempName), PChar(FileNameTTF),
nil) then
begin
{ open .FOT file and read it into a string buffer }
AssignFile(hFile, TempName);
Reset(hFile, 1);
SetLength(Buffer, FileSize(hFile));
BlockRead(hFile, Buffer[1], FileSize(hFile));

{ The name sits behind the text 'FONTRES:' }
iPos := Pos('FONTRES:', Buffer) 8;

{ search for next null character }
jPos := iPos;
while Buffer[jPos] <> #0 do
Inc(jPos);

{ Return the font name }
Result := Copy(Buffer, iPos, jPos - iPos);

{ clean up }
CloseFile(hFile);
DeleteFile(TempName);
end
else
Result:='Error';
// ShowMessage(SysErrorMessage(GetLastError));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if form1.OpenDialog1.Execute then begin
edit1.text := OpenDialog1.FileName;
edit2.text := GetFontName(edit1.text);
Memo1.Font.Name := edit2.text; // 設定字型名稱
end;
end;

[/code]
------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2008-11-19 22:09:07, 註解 無‧
pceyes 重新編輯於 2008-11-19 22:39:04, 註解 無‧
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-20 10:55:55 IP:61.219.xxx.xxx 訂閱
To careychen:

這個方式似乎只能顯示c:\windows\fonts\下的字型
有沒有辦法能自由取得其他路徑下的字型檔呢?

To pceyes:
小弟試過這段程式後發現有兩個問題

首先,存取c:\windows\fonts時,點選檔案後不會有反應
也不會關閉開啟檔案的視窗,只有取消的份
即使加入GETMYFILE(ExtractFileDir(opendialog1.Files))也依然是沒反應
當然,存取其他目錄的ttf檔是正常的


另外,小弟在Memo1.Font.Name := edit2.text;前加入
[code delphi]
AddFontResource(PChar(opendialog1.Files));
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
[/code]
但在Memo1裡的字仍舊沒有變成載入的字型,不曉得是不是小弟還遺漏了什麼?
------
永遠都是新手
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-20 11:19:33 IP:60.248.xxx.xxx 訂閱
是否要先在
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
註冊??
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-11-20 11:26:15, 註解 無‧
aftcast 重新編輯於 2008-11-20 11:28:20, 註解 無‧
aftcast 重新編輯於 2008-11-20 11:34:30, 註解 無‧
aftcast 重新編輯於 2008-11-20 11:41:51, 註解 無‧
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-20 12:00:49 IP:61.219.xxx.xxx 訂閱
To careychen :
抱歉,我知道怎麼自由載入自己要的字型了
FormCreate不要加就可以了...哈哈

TO aftcast:
註冊是否就變成安裝了呢?
因為僅是用來view,所以在AddFontResource後
關閉程式還會先
RemoveFontResource的@@"
------
永遠都是新手
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-11-20 13:57:08 IP:218.32.xxx.xxx 訂閱
除了OpenDialog外,在win31page內的FileListbox也無法顯示winnt\fonts的內容,所以應是被windows Api限制住了,一個方法是自己寫一個OpenDialog(很簡單);至於你所提的方式,我在站上看到它是暫時性的安裝,關機後就不存在了,故容易混淆視聽,沒有再測了。
===================引 用 Reiji 文 章===================
To pceyes:
小弟試過這段程式後發現有兩個問題

首先,存取c:\windows\fonts時,點選檔案後不會有反應
也不會關閉開啟檔案的視窗,只有取消的份
即使加入GETMYFILE(ExtractFileDir(opendialog1.Files))也依然是沒反應
當然,存取其他目錄的ttf檔是正常的


------
努力會更接近成功
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-11-20 14:28:04 IP:60.248.xxx.xxx 訂閱
哈,祝您成功~~!

===================引 用 Reiji 文 章===================
To careychen :
抱歉,我知道怎麼自由載入自己要的字型了
FormCreate不要加就可以了...哈哈

TO aftcast:
註冊是否就變成安裝了呢?
因為僅是用來view,所以在AddFontResource後
關閉程式還會先
RemoveFontResource的@@"
------
價值的展現,來自於你用哪一個角度來看待它!!
歸木淡
中階會員


發表:1
回覆:49
積分:75
註冊:2005-09-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-12-19 11:47:06 IP:99.168.xxx.xxx 訂閱
最近在寫個Tutorial, 可以顯示任意目錄下所有字型, 有全部代碼, 有興趣請參考:
http://codesquare.blogspot.com/2008/12/fontlist-110.html
系統時間:2024-11-21 18:26:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!