2008-09-20 15 views

उत्तर

10

और यहाँ एक डेल्फी संस्करण:

procedure LoadFontFromDll(const DllName, FontName: PWideChar); 
var 
    DllHandle: HMODULE; 
    ResHandle: HRSRC; 
    ResSize, NbFontAdded: Cardinal; 
    ResAddr: HGLOBAL; 
begin 
    DllHandle := LoadLibrary(DllName); 
    if DllHandle = 0 then 
    RaiseLastOSError; 
    ResHandle := FindResource(DllHandle, FontName, RT_FONT); 
    if ResHandle = 0 then 
    RaiseLastOSError; 
    ResAddr := LoadResource(DllHandle, ResHandle); 
    if ResAddr = 0 then 
    RaiseLastOSError; 
    ResSize := SizeOfResource(DllHandle, ResHandle); 
    if ResSize = 0 then 
    RaiseLastOSError; 
    if 0 = AddFontMemResourceEx(Pointer(ResAddr), ResSize, nil, @NbFontAdded) then 
    RaiseLastOSError; 
end; 

की तरह इस्तेमाल किया जा रहा:

var 
    FontName: PChar; 
    FontHandle: THandle; 
... 
    FontName := 'DEJAVUSANS'; 
    LoadFontFromDll('Project1.dll' , FontName); 
    FontHandle := CreateFont(0, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, 
    OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, 
    FontName); 
    if FontHandle = 0 then 
    RaiseLastOSError; 
2

मुझे Google के साथ this मिला। मैंने & काट दिया है नीचे दिए गए प्रासंगिक कोड को चिपकाया है।

आप अपने संसाधन फ़ाइल के लिए फ़ॉन्ट जोड़ने की जरूरत:


34 FONT "myfont.ttf" 

निम्नलिखित सी कोड DLL संसाधन से फ़ॉन्ट लोड और स्मृति से जारी जब आप इसका उपयोग करना समाप्त कर लें होगा।

 
DWORD Count; 
HMODULE Module = LoadLibrary("mylib.dll"); 
HRSRC Resource = FindResource(Module,MAKEINTRESOURCE(34),RT_FONT); 
DWORD Length = SizeofResource(Module,Resource); 
HGLOBAL Address = LoadResource(Module,Resource); 
HANDLE Handle = AddFontMemResourceEx(Address,Length,0,&Count); 

/* Use the font here... */ 

RemoveFontMemResourceEx(Handle); 
FreeLibrary(Module); 
1

यहाँ कुछ कोड है कि आपके निष्पादन अंदर से लोड होगा/font उपलब्ध बनाने है (यानी, फ़ॉन्ट एक संसाधन के रूप एम्बेडेड था, बल्कि कुछ की तुलना में आप आमतौर पर विंडोज में स्थापित करने के लिए किया था)।

ध्यान दें कि फ़ॉन्ट पर एप्लिकेशन तक उपलब्ध है जब तक कि आपका प्रोग्राम इससे छुटकारा न हो जाए। मुझे नहीं पता कि आपको यह कितना उपयोगी लगेगा, लेकिन मैंने इसे कुछ बार उपयोग किया है। मैंने फ़ॉन्ट को कभी भी एक डीएल में नहीं रखा है (मैं इसे 'exe' दृष्टिकोण में एम्बेड करना पसंद करता हूं) लेकिन कल्पना न करें कि यह चीजों को बहुत अधिक बदल देता है।

procedure TForm1.FormCreate(Sender: TObject); 
var 
    ResStream : TResourceStream; 
    sFileName : string; 
begin 
    sFileName:=ExtractFilePath(Application.ExeName)+'SWISFONT.TTF'; 

    ResStream:=nil; 
    try 
     ResStream:=TResourceStream.Create(hInstance, 'Swisfont', RT_RCDATA); 
     try 
      ResStream.SaveToFile(sFileName); 
     except 
      on E:EFCreateError Do ShowMessage(E.Message); 
     end; 
    finally 
     ResStream.Free; 
    end; 

    AddFontResource(PChar(sFileName)); 
    SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); 
end; 


procedure TForm1.FormDestroy(Sender: TObject); 
var 
    sFile:string; 
begin 
    sFile:=ExtractFilePath(Application.ExeName)+'SWISFONT.TTF'; 
    if FileExists(sFile) then 
    begin 
     RemoveFontResource(PChar(sFile)); 
     SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); 
     DeleteFile(sFile); 
    end; 
end; 
+0

नायब sFileName/sFile चर एक स्थानीय फ़ॉन्ट फ़ाइल बनाने के लिए उपयोग किया जाता है - इस मामले में, निर्देशिका में जहां एप्लिकेशन होस्ट किया गया है। – robsoft

+0

SendMessage को Vista पर समस्याएं होने वाली हैं। SendMessage (HWND_BROADCAST, ..) के बजाय आप SendMessage (Application.Handle, ..) – smo

+0

वास्तव में, यदि प्रोग्राम \ प्रोग्राम फ़ाइलों में चल रहा है, तो फ़ाइल में फ़ॉन्ट निकालने से Vista में समस्याग्रस्त हो जायेगा । आप बीएमटीयू के उदाहरण के रूप में स्मृति से फ़ॉन्ट संसाधन लोड करना चाहते हैं .. लेकिन मुझे यह भी लगता है कि आपको SendMessage की आवश्यकता है। – smo

संबंधित मुद्दे

 संबंधित मुद्दे