Цитата Johny777:
тк на день раз 20 запускаю для теста основы и очень часто оба примера перестают работать через несколько повторных запусков »
|
Johny777, Несколько замечаний по обоим примерам кастомного шрифта:
1. Совсем не обязательно рассылать сообщение WM_FONTCHANGE всем top-level окнам, достаточно послать форме. А можно и вообще Send/PostMessage убрать.
2. FontExists лучше делать до вызова AddFontResource, т.к. шрифт может быть уже установленым в системе и повторное его добавление это не есть хорошо.
3. Булев флаг IsCustomFontInstalled лишний.
4. Все это лучше не делать в функции InitializeSetup, когда формы еще нет.
5. Применить для уверенности функцию AddFontResourceEx, зная что шрифт будет использован только вызываемым приложением.
читать дальше »
Код:
#define Font "Edisson.ttf"
#define FontName "Edisson"
[Files]
Source: {#Font}; Flags: dontcopy
[code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
FR_PRIVATE = $10;
function AddFontResource(lpszFilename: String; fl, pdv: DWORD): Integer; external 'AddFontResourceEx{#A}@gdi32.dll stdcall';
function RemoveFontResource(lpFileName: String; fl, pdv: DWORD): BOOL; external 'RemoveFontResourceEx{#A}@gdi32.dll stdcall';
procedure InitializeWizard();
begin
if not FontExists('{#FontName}') then
begin
ExtractTemporaryFile('{#Font}');
AddFontResource(ExpandConstant('{tmp}\{#Font}'), FR_PRIVATE, 0);
end;
WizardForm.Font.Name := '{#FontName}';
end;
procedure DeinitializeSetup();
begin
RemoveFontResource(ExpandConstant('{tmp}\{#Font}'), FR_PRIVATE, 0);
WizardForm.Free;
end;