Tôi cần tải một số phông chữ tạm thời trong chương trình của mình. Tốt hơn là từ một tập tin tài nguyên dll.Tôi có thể tạm thời tải phông chữ bằng cách nào?
Trả lời
Và đây là một phiên bản Delphi:
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;
sẽ được sử dụng như:
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;
Tôi đã tìm thấy this bằng Google. Tôi đã cắt & dán mã có liên quan bên dưới.
Bạn cần phải thêm font vào file nguồn của bạn:
34 FONT "myfont.ttf"
Mã C sau đây sẽ được tải font từ nguồn DLL và giải phóng nó khỏi bộ nhớ khi bạn đã kết thúc sử dụng nó.
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);
Dưới đây là một số mã đó sẽ được tải/làm cho có sẵn các phông chữ từ bên trong thực thi của bạn (ví dụ, font được nhúng như một nguồn lực, chứ không phải là một cái gì đó bạn phải cài đặt vào Windows nói chung).
Lưu ý rằng phông chữ có sẵn cho bất kỳ ứng dụng nào cho đến khi chương trình của bạn loại bỏ nó. Tôi không biết bạn sẽ thấy hữu ích như thế nào, nhưng tôi đã sử dụng nó một vài lần. Tôi đã không bao giờ đặt font vào một dll (tôi thích điều này 'nhúng vào phương pháp tiếp cận exe') nhưng không tưởng tượng nó thay đổi mọi thứ quá nhiều.
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;
- 1. Làm cách nào tôi có thể phác thảo phông chữ?
- 2. Tải trước phông chữ phông chữ?
- 3. Sử dụng thời gian tải chậm của phông chữ. Tôi có thể buộc khách hàng lưu vào bộ nhớ cache phông chữ không?
- 4. Phông chữ đã thay đổi tay - Tôi có giấy phép cũ - tôi vẫn có thể sử dụng phông chữ này?
- 5. Làm cách nào để có thể tải xuống tệp tạm thời bằng cách sử dụng mod_perl và CGI :: Application?
- 6. Làm cách nào để tôi có thể thêm phông chữ google (theo chương trình) vào ckeditor
- 7. Khi nào tải phông chữ trên web và bạn có thể tải trước chúng không?
- 8. Cách tải xuống tệp tạm thời
- 9. Nén/Deflate @ phông chữ phông chữ
- 10. Với ImageMagick, bạn có thể xem tất cả các phông chữ khả dụng bằng cách nào?
- 11. cách cập nhật phông chữ icomoon thành phông chữ icomoon hiện có?
- 12. Cách tạo url tạm thời để tải tệp lên Amazon S3 bằng thư viện boto?
- 13. Có thể xác định phông chữ Windows chọn để liên kết phông chữ không?
- 14. Không thể ghi đè phông chữ của bootstrap-sass bằng phông chữ tuyệt vời
- 15. Google có thể theo dõi tôi nếu tôi sử dụng Phông chữ web của Google không?
- 16. Làm thế nào tôi có thể nhận được các phông chữ sẵn có trong WPF
- 17. Tránh tải chậm khuôn mặt phông chữ
- 18. Tôi có thể tạm dừng một NSTimer theo cách lập trình bằng cách nào?
- 19. Cách nào hiệu quả hơn khi xem xét thời gian tải trang, sử dụng các tệp phông chữ cục bộ hoặc phông chữ web của google?
- 20. Heroku không tải phông chữ của Google
- 21. Sử dụng UIWebView, tôi có thể sử dụng phông chữ tùy chỉnh không?
- 22. Có thể thay đổi khoảng cách chữ/kerning của một phông chữ với Cocoa Touch không?
- 23. Làm thế nào tôi có thể tạm thời dừng STDOUT trong một chương trình Perl?
- 24. Làm cách nào tôi có thể nhận kích thước phông chữ của một phần tử như được đặt bởi css
- 25. Có thể sử dụng phông chữ tùy chỉnh - sử dụng phông chữ không?
- 26. Có cách nào thay đổi màu phông chữ của Jradiobutton bằng cách sử dụng UImanager
- 27. Phông chữ nào có sẵn trên Android?
- 28. Cufon nhiều phông chữ - Làm cách nào?
- 29. Tôi có thể lấy nội dung của tệp được tải lên bằng php bằng cách nào?
- 30. Nhận phông chữ phông chữ @ đẹp
NB các biến sFileName/sFile được sử dụng để tạo ra một tập tin phông chữ địa phương - trong trường hợp này, trong thư mục nơi ứng dụng được lưu trữ. – robsoft
SendMessage sẽ gặp sự cố trên vista. Thay vì SendMessage (HWND_BROADCAST, ..) bạn sẽ muốn SendMessage (Application.Handle, ..) – smo
Trên thực tế, nếu chương trình đang chạy trong \ Program Files, việc giải nén phông chữ vào một tập tin cũng sẽ có vấn đề trong Vista . Bạn sẽ muốn tải các nguồn tài nguyên font từ bộ nhớ như trong ví dụ của bmatthew .. nhưng tôi cũng nghĩ rằng bạn cần phải SendMessage. – smo