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

怎麼知道有沒有裝某一套字型?

 
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-01 18:38:38 IP:203.65.xxx.xxx 未訂閱
比如說: 我的AP可能會移到別人的電腦上執行 所以我可能要先問OS, 看他的電腦有沒有安裝某套字體, 如"細明體" 要怎麼作呢?
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-08-01 23:05:15 IP:211.74.xxx.xxx 未訂閱
 
procedure TForm1.Button1Click(Sender: TObject);
var
    ts:TStrings;
    i:Integer;
    flag:Boolean;
begin
    ts:=TStringList.Create;
    ts:=Screen.Fonts;
    for i:=0 to ts.Count-1 do
    begin
        if ts.Strings[i]= '細明體' then
           begin
             flag:=True;
             Break;
           end;
    end;
    if not flag then ShowMessage('系統不存在細明體');    end;    
呵呵…Sorry BCB 不熟…用Delphi 表示應該也差不了多少吧^^ 噓~~~~~~沉思中… 發表人 - ddy 於 2002/08/01 23:06:38
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-08-02 01:31:24 IP:210.85.xxx.xxx 未訂閱
居然忘了Screen, 在Application建好時就可以用了, 哎! 幫你翻成BCB, 我是Delphi不會~~~噓 void __fastcall TForm1::Button1Click(TObject *Sender) {   bool Flag=false;   TStringList *ts=new TStringList;   for (int i=0; iCount-1; i ) { if(ts->String[i]=="細明體") Flag=true; } if (!Flag) ShowMessage("系統不存在細明體"); delete ts; }
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-08-02 01:47:12 IP:210.85.xxx.xxx 未訂閱
不過, 我已經Try出用API呼叫的方式 ^^, 可以問一個字型也可以抓出全部的, 更可以知道是不是True Type字, 畢竟是API嘛, 而且我是從BCB的範例偷出來的 想玩的人請跟著我這樣作囉 1. New一個Application 2. 放一個ComboBox, 名字叫FontList 3. 放一個Edit, 名字叫Edit1 (只是方便, 要用Static隨便你) 4. 我們先玩Unit.cpp 1)在 TForm1 *Form1; 前, 貼上 int __stdcall EnumFontsProc(TLogFontA &LogFont, TTextMetricA &/*TextMetric*/, int FontType, Pointer Data) { TCharsetObject *FontCharset; FontCharset = new TCharsetObject((int)LogFont.lfCharSet); String Getft; // Getft=IntToStr(FontType); //想知道是不是True Type字型, 就不要點掉這一行 ((TStrings *)Data)->AddObject(Getft (AnsiString)LogFont.lfFaceName, FontCharset); return 1; } 2)在OnFormShow裡, 貼上 HDC hDC=GetDC(0); void *AllFont=(void *)FontList->Items; TStringList *AA=new TStringList; void *SingleFont=(void *)AA; //詢問所有字型, 請傳NULL EnumFonts(hDC, NULL, (FONTENUMPROC) EnumFontsProc, (long) AllFont); //詢問一個字型, 請傳字型名稱, 可忽略大小寫 EnumFonts(hDC, "fixedsys", (FONTENUMPROC) EnumFontsProc, (long) SingleFont); ReleaseDC(0, hDC); FontList->Sorted=true; if (AA->Count>0) //如果有找到會大於0 Edit1->Text=AA->Strings[0]; delete AA; 3)在這個Unit1.cpp的最後面, 貼上 __fastcall TCharsetObject::TCharsetObject(int FCharset) : TObject() { Charset = FCharset; } 5. 搞定Unit1.cpp後, 現在來玩Unit1.hpp 請在 extern PACKAGE TForm1 *Form1; 前 貼上 class TCharsetObject : public TObject { public: int Charset; __fastcall TCharsetObject(int FCharset); }; 6.按Run ^_^ 7.解說 在你call EnumFonts這個API時, 會去call EnumFontsProc (所以EnumFontsProc是個callback function) 如果你想知道每個字型是不是True Type字型, 就把EnumFonts裡, 我remark 掉的地方, 照我的方式拿掉就行囉 好不好玩? 不好玩別打我 ^O^
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-08-02 01:48:12 IP:210.85.xxx.xxx 未訂閱
Source Code:Unit1.cpp    //---------------------------------------------------------------------------    #include  #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" int __stdcall EnumFontsProc(TLogFontA &LogFont, TTextMetricA &/*TextMetric*/, int FontType, Pointer Data) { TCharsetObject *FontCharset; FontCharset = new TCharsetObject((int)LogFont.lfCharSet); String Getft; // Getft=IntToStr(FontType); //想知道是不是True Type字型, 就不要點掉這一行 ((TStrings *)Data)->AddObject(Getft (AnsiString)LogFont.lfFaceName, FontCharset); return 1; } TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormShow(TObject *Sender) { HDC hDC=GetDC(0); void *AllFont=(void *)FontList->Items; TStringList *AA=new TStringList; void *SingleFont=(void *)AA; //詢問所有字型, 請傳NULL EnumFonts(hDC, NULL, (FONTENUMPROC) EnumFontsProc, (long) AllFont); //詢問一個字型, 請傳字型名稱, 可忽略大小寫 EnumFonts(hDC, "fixedsys", (FONTENUMPROC) EnumFontsProc, (long) SingleFont); ReleaseDC(0, hDC); FontList->Sorted=true; if (AA->Count>0) //如果有找到會大於0 Edit1->Text=AA->Strings[0]; delete AA; } //--------------------------------------------------------------------------- __fastcall TCharsetObject::TCharsetObject(int FCharset) : TObject() { Charset = FCharset; } //---------------------------------------------------------------------------
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-08-02 01:49:09 IP:210.85.xxx.xxx 未訂閱
Source Code:Unit1.hpp    #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include  #include #include #include <Forms.hpp> #include //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TComboBox *FontList; TEdit *Edit1; void __fastcall FormShow(TObject *Sender); private: public: // User declarations __fastcall TForm1(TComponent* Owner); }; class TCharsetObject : public TObject { public: int Charset; __fastcall TCharsetObject(int FCharset); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-08-02 01:51:58 IP:210.85.xxx.xxx 未訂閱
哎! 每次感覺都在自問自答 不過呢! 今天好開心, 可以玩到這個例子, 後來大致上搞懂了callback function是這樣子玩的呀, 呵..... 害偶在這麼晚的夜裡還睡不太著.....呵 下次, 再分享其他好玩的API, 讓大家的程式粉強, 粉有力啦 *^O^*
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-08-02 02:05:37 IP:210.85.xxx.xxx 未訂閱
打太快, 發現有筆誤, 在此更正 1. Unit1.hpp應該是Unit.h 2. 如果要知道是不是True Type字型, 請不要點掉EnumFontsProc裡 我提示的那一行, 而不是EnumFonts
dllee
站務副站長


發表:319
回覆:2516
積分:1710
註冊:2002-04-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-08-02 11:46:05 IP:61.231.xxx.xxx 未訂閱
建議您將原始檔放到 「會員作品發表區」 或 「會員貢獻文件檔案上傳專區」 這樣比較不會有「掉碼」的問題,因為在板上直接貼原始碼即使有加上 [ code ] 也可能會「掉碼」 [ /code ]
------
http://blog.yam.com/dllee/
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-08-02 16:15:41 IP:61.222.xxx.xxx 未訂閱
Source Code已附上 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=20045
CrazyHunter
一般會員


發表:1
回覆:1
積分:0
註冊:2007-01-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-01-29 20:46:49 IP:140.118.xxx.xxx 未訂閱
我在試用大大所提供的程式時,
都會出現"Unable to find package import: DCLUSR.bpi",
我在系統裡也找不到這個檔,
請教大大這要怎麼解決呢?
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-03-06 01:45:29 IP:61.64.xxx.xxx 訂閱
補充一下

字形資訊,在 registry 內有名稱與路徑
至於字形在不在,也可以直接 FileExist(c:\windows\fonts\字形檔名),不過這兩個方式取得的資訊有限,但比較簡單
系統時間:2017-12-13 9:30:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!