Войти
NeoBooker.ru
Добро пожаловать к нам в гости!
Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Модератор форума: Peter, DEMBEL, YURIY  
Форум NeoBook » Всё о программе NeoBook » Общие вопросы по NeoBook » Проблема со шрифтами
Проблема со шрифтами
ВадимДата: Чт, 28 Января 2010, 01:49 | Сообщение # 61
Генератор идей
Quote (mishem)
попробуй такую програму. Smart Install Maker.
Спасибо. Я думал о таком варианте, но хотелось бы самому уметь, только средствами NB. Не думаю, что там что-то космически сложное. Где-то не прописываю, вот шрифт и удаляется сам.

Сейчас делаю так:

Code

   FileExists "C:\WINDOWS\Fonts\CALIBRI.TTF" "[calibriN]"
   If "[calibriN]" "=" "False"
     MessageBox "Выберите действие" "В операционной системе Вашего компьютера не обнаружен|необходимый для работы шрифт Calibri (True Type).|Без этого шрифта программа будет отображаться неправильно.||Установить шрифт Calibri на Ваш компьютер?" "     Да     |     Нет     " "[InstCalibri]"
       If "[InstCalibri]" "=" "1"
         FileCopy "[PubDir]CALIBRI.TTF" "C:\WINDOWS\Fonts\CALIBRI.TTF"
         RegistryWrite "HKEY_LOCAL_MACHINE" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts\Calibri (TrueType)" "CALIBRI.TTF"
         AlertBox "Сообщение" "Шрифт Calibri (True Type) успешно установлен!"
       Else
         AlertBox "Сообщение" "Вы сможете установить шрифт и при другом запуске программы"
       EndIf
   EndIf

Шрифт при запуске проги копируется, тестер его видит в системной папке шрифтов, но после закрытия приложения шрифт из Fonts исчезает... Я понимаю, если бы я вместо FileCopyприменил бы ExtractFile- это еще было бы объяснимо... Есть идеи?


Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
 
Сообщение
Quote (mishem)
попробуй такую програму. Smart Install Maker.
Спасибо. Я думал о таком варианте, но хотелось бы самому уметь, только средствами NB. Не думаю, что там что-то космически сложное. Где-то не прописываю, вот шрифт и удаляется сам.

Сейчас делаю так:

Code

   FileExists "C:\WINDOWS\Fonts\CALIBRI.TTF" "[calibriN]"
   If "[calibriN]" "=" "False"
     MessageBox "Выберите действие" "В операционной системе Вашего компьютера не обнаружен|необходимый для работы шрифт Calibri (True Type).|Без этого шрифта программа будет отображаться неправильно.||Установить шрифт Calibri на Ваш компьютер?" "     Да     |     Нет     " "[InstCalibri]"
       If "[InstCalibri]" "=" "1"
         FileCopy "[PubDir]CALIBRI.TTF" "C:\WINDOWS\Fonts\CALIBRI.TTF"
         RegistryWrite "HKEY_LOCAL_MACHINE" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts\Calibri (TrueType)" "CALIBRI.TTF"
         AlertBox "Сообщение" "Шрифт Calibri (True Type) успешно установлен!"
       Else
         AlertBox "Сообщение" "Вы сможете установить шрифт и при другом запуске программы"
       EndIf
   EndIf

Шрифт при запуске проги копируется, тестер его видит в системной папке шрифтов, но после закрытия приложения шрифт из Fonts исчезает... Я понимаю, если бы я вместо FileCopyприменил бы ExtractFile- это еще было бы объяснимо... Есть идеи?


Автор - Вадим
Дата добавления - 28 Января 2010 в 01:49
DEMBELДата: Чт, 28 Января 2010, 02:09 | Сообщение # 62
Наш дизайнер
эээ... путь в реестре вроде как отличается в завис-ти от версии ОС. Первый вопрос - какая ОС у клиента?
Quote (Вадим)
Шрифт при запуске проги копируется, тестер его видит в системной папке шрифтов, но после закрытия приложения шрифт из Fonts исчезает...

второй - клиент является администратором в системе где запускается прога?, третий - если Vista/7 то программа запускается от имени администратора или нет?


Как задавать вопросы

Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
Сообщениеэээ... путь в реестре вроде как отличается в завис-ти от версии ОС. Первый вопрос - какая ОС у клиента?
Quote (Вадим)
Шрифт при запуске проги копируется, тестер его видит в системной папке шрифтов, но после закрытия приложения шрифт из Fonts исчезает...

второй - клиент является администратором в системе где запускается прога?, третий - если Vista/7 то программа запускается от имени администратора или нет?

Автор - DEMBEL
Дата добавления - 28 Января 2010 в 02:09
ВадимДата: Чт, 28 Января 2010, 03:27 | Сообщение # 63
Генератор идей
Quote ( DEMBEL )
путь в реестре вроде как отличается в завис-ти от версии ОС
Да, именно так. В системе Windows 98 нужный раздел реестра будет называться чуть иначе (без NT):

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts

В системе Windows 95 шрифты для подстановки определяются не в Реестре, а в файле win.ini

Начиная с платформы Windows NT эта ветка выглядит так:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

Quote ( DEMBEL )
клиент является администратором в системе где запускается прога
Вот это не догадался уточнить. Но ведь если бы был запрет, то вообще не удалось бы скопировать в папку. А так она вроде бы как отдаётся, но потом идет на попятную :D

А система у тестера: Win XP. Поэтому пока не заморачивался определением операционной системы. Но реализовать разные записи в реестр при разной системе не сложно.

Добавлено (28 Январь 2010, 03:27)
---------------------------------------------
Перерыл весь интернет, не встретил похожую проблему с установкой шрифта, чтобы он после копирования сам исчезал из директории... Установка шрифта должна ограничиваться копированием в системную папку шрифтов и прописыванием в реестр.

Может быть это сама NB убирает файл шрифта после закрытия приложения? Прибирается, так сказать. Может быть NB особо щепетильна в отношении системных папок вообще? Чтобы всякие вирусы не писали с ее помощью, например.
Есть информация на этот счет?


Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
 
Сообщение
Quote ( DEMBEL )
путь в реестре вроде как отличается в завис-ти от версии ОС
Да, именно так. В системе Windows 98 нужный раздел реестра будет называться чуть иначе (без NT):

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts

В системе Windows 95 шрифты для подстановки определяются не в Реестре, а в файле win.ini

Начиная с платформы Windows NT эта ветка выглядит так:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

Quote ( DEMBEL )
клиент является администратором в системе где запускается прога
Вот это не догадался уточнить. Но ведь если бы был запрет, то вообще не удалось бы скопировать в папку. А так она вроде бы как отдаётся, но потом идет на попятную :D

А система у тестера: Win XP. Поэтому пока не заморачивался определением операционной системы. Но реализовать разные записи в реестр при разной системе не сложно.

Добавлено (28 Январь 2010, 03:27)
---------------------------------------------
Перерыл весь интернет, не встретил похожую проблему с установкой шрифта, чтобы он после копирования сам исчезал из директории... Установка шрифта должна ограничиваться копированием в системную папку шрифтов и прописыванием в реестр.

Может быть это сама NB убирает файл шрифта после закрытия приложения? Прибирается, так сказать. Может быть NB особо щепетильна в отношении системных папок вообще? Чтобы всякие вирусы не писали с ее помощью, например.
Есть информация на этот счет?


Автор - Вадим
Дата добавления - 28 Января 2010 в 03:27
DEMBELДата: Чт, 28 Января 2010, 03:50 | Сообщение # 64
Наш дизайнер
Quote (Вадим)
Может быть это сама NB убирает файл шрифта после закрытия приложения?

вполне вероятно что так и происходит собственно... но так вроде не должно происходить когда ты вручную копируешь файл и создаешь запись в реестре. Тут нужно проверить путем предварительного копирования и занесения в реестр вручную без участия нб, будет ли шрифт сохраняться. Если хочешь, поэкспериментируй у себя на машине, удали колибри и попробуй поставь сперва заново из нб, а потом вручную и проверь.


Как задавать вопросы

Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
Сообщение
Quote (Вадим)
Может быть это сама NB убирает файл шрифта после закрытия приложения?

вполне вероятно что так и происходит собственно... но так вроде не должно происходить когда ты вручную копируешь файл и создаешь запись в реестре. Тут нужно проверить путем предварительного копирования и занесения в реестр вручную без участия нб, будет ли шрифт сохраняться. Если хочешь, поэкспериментируй у себя на машине, удали колибри и попробуй поставь сперва заново из нб, а потом вручную и проверь.

Автор - DEMBEL
Дата добавления - 28 Января 2010 в 03:50
Alex3AДата: Чт, 28 Января 2010, 04:07 | Сообщение # 65
Друг клуба ММВ
Вадим, посмотри тут, шкрипт vb
 
СообщениеВадим, посмотри тут, шкрипт vb

Автор - Alex3A
Дата добавления - 28 Января 2010 в 04:07
ВадимДата: Чт, 28 Января 2010, 05:22 | Сообщение # 66
Генератор идей
Quote (DEMBEL)
проверить путем предварительного копирования и занесения в реестр вручную без участия нб
У меня при копировании шрифтов вручную (просто командой "вставить" в папке шрифтов) происходит их автоматическая установка, о чем свидетельствуют появляющиеся сразу записи о них в реестре. Соответственно удаление шрифтов из системной папки автоматически приводит и к удалению записей в реестре. Т.е. на действия пользователя ограничение на добавление шрифтов не действует. По крайней мере в моей системе. Оно и логично, что у пользователя приоритет выше, чем у программы... Может тогда надо сымитировать нажатие клавиш для копирования шрифтов в системную папку? :D

Quote (Alex3A)
посмотри тут, шкрипт vb
Из описания я понял только, что используется схема из двух шагов, где первый - как у меня - копирование шрифта в системную папку шрифтов, а вот второй шаг мне не понятен. Указано, что используется для установки шрифта вызов API посредством "RunDll32.exe gdi32.dll". Что это значит? И как можно этим воспользоваться из NB? И что такого делает запуск функции API, кроме как прописывание шрифта в реестре?


Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
 
Сообщение
Quote (DEMBEL)
проверить путем предварительного копирования и занесения в реестр вручную без участия нб
У меня при копировании шрифтов вручную (просто командой "вставить" в папке шрифтов) происходит их автоматическая установка, о чем свидетельствуют появляющиеся сразу записи о них в реестре. Соответственно удаление шрифтов из системной папки автоматически приводит и к удалению записей в реестре. Т.е. на действия пользователя ограничение на добавление шрифтов не действует. По крайней мере в моей системе. Оно и логично, что у пользователя приоритет выше, чем у программы... Может тогда надо сымитировать нажатие клавиш для копирования шрифтов в системную папку? :D

Quote (Alex3A)
посмотри тут, шкрипт vb
Из описания я понял только, что используется схема из двух шагов, где первый - как у меня - копирование шрифта в системную папку шрифтов, а вот второй шаг мне не понятен. Указано, что используется для установки шрифта вызов API посредством "RunDll32.exe gdi32.dll". Что это значит? И как можно этим воспользоваться из NB? И что такого делает запуск функции API, кроме как прописывание шрифта в реестре?

Автор - Вадим
Дата добавления - 28 Января 2010 в 05:22
ВадимДата: Чт, 28 Января 2010, 07:35 | Сообщение # 67
Генератор идей
Сделал исходник с одной кнопкой, код которой копирует шрифт в Fonts и прописывает его в реестр. Надо было сразу так поступить, но кто же знал, что добавить шрифт окажется так не просто...

В общем, на моем компе вообще другая картина. Т.е. шрифт даже в папку шрифтов не может программно скопироваться :D . Вообще там не появляется. А появляется сообщение "Аccess denied!".

Наверное это от дополнительных настроек безопасности системы зависит.
А после нажатия ОК в реестр данные заносятся без проблем. В реестр значить пускають, а к шрифтам ни ногоЙ!

Т.е. видимо вся сложность именно в том, чтобы программно разрешить проекту доступ к системной папке. Наверное это как-то и делают с помощью API?
Инсталляторы также работают?

Если кому интересно - исходник в прикреплении (весь код на одной кнопке), плюс там же один испанский шрифт AntoniousJ Jencom (TrueType). Он используется исходником. Может кому заодно и понадобится, например, справку читать по плагину Эсперальты :D .
Код тот же самый, что я привел выше, только шрифт испанский указан.

Добавлено (28 Январь 2010, 07:03)
---------------------------------------------
Да, может стоит предупредить. Что запись в реестр будет верна для систем выше Windows 98.
Интересно, кто-то пользуется Win 9x? :)

Добавлено (28 Январь 2010, 07:20)
---------------------------------------------
Нет, все верно! Появляется! Точнее в папке Fonts шрифт КАК БЫ появляется, но на самом деле его там нет.
Т.е. благодаря записи в реестре в системной папке появляется запись имени шрифта, но если по этому имени щелкнуть правой кнопкой мыши и выбрать "свойства", то виндовс выдаст ошибку, что такой файл шрифта не найден (и покажет имя файла, а не имя шрифта).

Ну, хоть это узнал, что на самом деле файл даже и не появляется в папке Fonts.

В общем задача сейчас прояснилась - как скопировать файл шрифта в папку шрифтов виндовс.

Добавлено (28 Январь 2010, 07:35)
---------------------------------------------
А после закрытия приложения запись об имени шрифта из системной папки исчезает.
Но, что любопытно, теперь исчезает и запись в реестре, вслед за ней. Видимо так и было с самого начала, но я не заметил.

И запись в реестре все-таки (без реального шрифта в системной папке) не задерживается.

Попробовал вручную снять у папки Fonts атрибут "только чтение", но ни фига, он опять сам появился.

Прикрепления: 4815226.png (6.7 Kb) · Antonious.rar (26.4 Kb)


Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
 
СообщениеСделал исходник с одной кнопкой, код которой копирует шрифт в Fonts и прописывает его в реестр. Надо было сразу так поступить, но кто же знал, что добавить шрифт окажется так не просто...

В общем, на моем компе вообще другая картина. Т.е. шрифт даже в папку шрифтов не может программно скопироваться :D . Вообще там не появляется. А появляется сообщение "Аccess denied!".

Наверное это от дополнительных настроек безопасности системы зависит.
А после нажатия ОК в реестр данные заносятся без проблем. В реестр значить пускають, а к шрифтам ни ногоЙ!

Т.е. видимо вся сложность именно в том, чтобы программно разрешить проекту доступ к системной папке. Наверное это как-то и делают с помощью API?
Инсталляторы также работают?

Если кому интересно - исходник в прикреплении (весь код на одной кнопке), плюс там же один испанский шрифт AntoniousJ Jencom (TrueType). Он используется исходником. Может кому заодно и понадобится, например, справку читать по плагину Эсперальты :D .
Код тот же самый, что я привел выше, только шрифт испанский указан.

Добавлено (28 Январь 2010, 07:03)
---------------------------------------------
Да, может стоит предупредить. Что запись в реестр будет верна для систем выше Windows 98.
Интересно, кто-то пользуется Win 9x? :)

Добавлено (28 Январь 2010, 07:20)
---------------------------------------------
Нет, все верно! Появляется! Точнее в папке Fonts шрифт КАК БЫ появляется, но на самом деле его там нет.
Т.е. благодаря записи в реестре в системной папке появляется запись имени шрифта, но если по этому имени щелкнуть правой кнопкой мыши и выбрать "свойства", то виндовс выдаст ошибку, что такой файл шрифта не найден (и покажет имя файла, а не имя шрифта).

Ну, хоть это узнал, что на самом деле файл даже и не появляется в папке Fonts.

В общем задача сейчас прояснилась - как скопировать файл шрифта в папку шрифтов виндовс.

Добавлено (28 Январь 2010, 07:35)
---------------------------------------------
А после закрытия приложения запись об имени шрифта из системной папки исчезает.
Но, что любопытно, теперь исчезает и запись в реестре, вслед за ней. Видимо так и было с самого начала, но я не заметил.

И запись в реестре все-таки (без реального шрифта в системной папке) не задерживается.

Попробовал вручную снять у папки Fonts атрибут "только чтение", но ни фига, он опять сам появился.


Автор - Вадим
Дата добавления - 28 Января 2010 в 07:35
Alex3AДата: Чт, 28 Января 2010, 11:26 | Сообщение # 68
Друг клуба ММВ
Вадим, сделай загрузчик фонта в ммв и запускай его из нв :D
 
СообщениеВадим, сделай загрузчик фонта в ммв и запускай его из нв :D

Автор - Alex3A
Дата добавления - 28 Января 2010 в 11:26
DEMBELДата: Чт, 28 Января 2010, 13:41 | Сообщение # 69
Наш дизайнер
Quote (Alex3A)
сделай загрузчик фонта в ммв и запускай его из нв

да он разве не по тому же принципу работает?
--
как один из вариантов, попробуй сделать инсталлятор на прогу, в какой-то проге создания инсталляторов я видел установку шрифтов.
Quote (Вадим)
задача сейчас прояснилась

будем разбираться дальше потихоньку...


Как задавать вопросы

Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
Сообщение
Quote (Alex3A)
сделай загрузчик фонта в ммв и запускай его из нв

да он разве не по тому же принципу работает?
--
как один из вариантов, попробуй сделать инсталлятор на прогу, в какой-то проге создания инсталляторов я видел установку шрифтов.
Quote (Вадим)
задача сейчас прояснилась

будем разбираться дальше потихоньку...

Автор - DEMBEL
Дата добавления - 28 Января 2010 в 13:41
ВадимДата: Чт, 28 Января 2010, 15:13 | Сообщение # 70
Генератор идей
Quote (Alex3A)

сделай загрузчик фонта в ммв и запускай его из нв
:D
Quote (DEMBEL)
да он разве не по тому же принципу работает?
Да, так и есть! Эта инфа мне тоже попадалась. В MMB сам принцип точно такой же - шрифт копируется во временную папку и система извещается, что туточки он, родимый. После закрытия проекта он исчезает. Только в NB это делать еще удобнее, не надо прописывать команду InstallFont, а просто галочку поставить при компиляции (есть целый раздел настроек) взять с собой "все шрифты проекта" или "только выделенные галочкой" или "никакие, винда сама распорядится" или "только шрифты не являющиеся базовыми для Windows".


Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
 
Сообщение
Quote (Alex3A)

сделай загрузчик фонта в ммв и запускай его из нв
:D
Quote (DEMBEL)
да он разве не по тому же принципу работает?
Да, так и есть! Эта инфа мне тоже попадалась. В MMB сам принцип точно такой же - шрифт копируется во временную папку и система извещается, что туточки он, родимый. После закрытия проекта он исчезает. Только в NB это делать еще удобнее, не надо прописывать команду InstallFont, а просто галочку поставить при компиляции (есть целый раздел настроек) взять с собой "все шрифты проекта" или "только выделенные галочкой" или "никакие, винда сама распорядится" или "только шрифты не являющиеся базовыми для Windows".

Автор - Вадим
Дата добавления - 28 Января 2010 в 15:13
Alex3AДата: Чт, 28 Января 2010, 15:39 | Сообщение # 71
Друг клуба ММВ
Вадим, а чего тебе надобнос...
при запуке проги фонт доступен, чего же еще?
А захламлять своими фонтами чужие компы не есть хорошо.
 
СообщениеВадим, а чего тебе надобнос...
при запуке проги фонт доступен, чего же еще?
А захламлять своими фонтами чужие компы не есть хорошо.

Автор - Alex3A
Дата добавления - 28 Января 2010 в 15:39
DEMBELДата: Чт, 28 Января 2010, 16:29 | Сообщение # 72
Наш дизайнер
ну по-ходу то что шрифты/записи реестра пропадают после закрытия проги это так и должно быть.
ну а когда мы их руками копируем, то в чем дело? я сейчас лично попробовал вручную поставить калибри, и пока я не сделал это через пу->шрифты->установить... он был недоступен в программах, несмотря ни на что (возможно надо было перезагруз сделать, но не проверял).


Как задавать вопросы

Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
Сообщениену по-ходу то что шрифты/записи реестра пропадают после закрытия проги это так и должно быть.
ну а когда мы их руками копируем, то в чем дело? я сейчас лично попробовал вручную поставить калибри, и пока я не сделал это через пу->шрифты->установить... он был недоступен в программах, несмотря ни на что (возможно надо было перезагруз сделать, но не проверял).

Автор - DEMBEL
Дата добавления - 28 Января 2010 в 16:29
mishemДата: Чт, 28 Января 2010, 19:49 | Сообщение # 73
Эксперт форума
Quote (DEMBEL)
как один из вариантов, попробуй сделать инсталлятор на прогу

DEMBEL, Я ему предложил такой вариант
Quote (Вадим)
Quote (mishem)
попробуй такую програму. Smart Install Maker

Она умеет и шрифт добавлять, и в реестре записи делать. Он отказался.


Не хочешь читать хелп?

Если хелп и форум не помогли, тогда все ответы здесь



Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
 
Сообщение
Quote (DEMBEL)
как один из вариантов, попробуй сделать инсталлятор на прогу

DEMBEL, Я ему предложил такой вариант
Quote (Вадим)
Quote (mishem)
попробуй такую програму. Smart Install Maker

Она умеет и шрифт добавлять, и в реестре записи делать. Он отказался.

Автор - mishem
Дата добавления - 28 Января 2010 в 19:49
DEMBELДата: Чт, 28 Января 2010, 21:05 | Сообщение # 74
Наш дизайнер
Quote (DEMBEL)
он был недоступен в программах

ну я знаю почему, токо как это устранить вручную? Alex тоже уже наверное понял почему...

Добавлено (28 Январь 2010, 21:05)
---------------------------------------------
попробовал пару способов, чето не могу заставить шрифт заработать...


Как задавать вопросы

Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
Сообщение
Quote (DEMBEL)
он был недоступен в программах

ну я знаю почему, токо как это устранить вручную? Alex тоже уже наверное понял почему...

Добавлено (28 Январь 2010, 21:05)
---------------------------------------------
попробовал пару способов, чето не могу заставить шрифт заработать...


Автор - DEMBEL
Дата добавления - 28 Января 2010 в 21:05
ВадимДата: Чт, 28 Января 2010, 21:45 | Сообщение # 75
Генератор идей
Quote (Alex3A)
а чего тебе надобнос...
Шрифт почему-то не отображается в приложении на некоторых компьютерах. Скрины и описание проблемы тут.

Quote (mishem)
DEMBEL, Я ему предложил такой вариант
Smart Install Maker
Она умеет и шрифт добавлять, и в реестре записи делать. Он отказался.
Да нет, не то чтобы отказался. Совет хороший! Я знаю об этой проге, она действительно классная, судя по функциям! Давно у меня стоит, но не пользовался ни разу, да и в этот раз хотел обойтись своими силами. Ведь интересно же, в конце концов! :)

Quote (DEMBEL)
он был недоступен в программах

А чтобы проги шрифт видели надо в реестре его прописать. Или еще что-то есть?


Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
 
Сообщение
Quote (Alex3A)
а чего тебе надобнос...
Шрифт почему-то не отображается в приложении на некоторых компьютерах. Скрины и описание проблемы тут.

Quote (mishem)
DEMBEL, Я ему предложил такой вариант
Smart Install Maker
Она умеет и шрифт добавлять, и в реестре записи делать. Он отказался.
Да нет, не то чтобы отказался. Совет хороший! Я знаю об этой проге, она действительно классная, судя по функциям! Давно у меня стоит, но не пользовался ни разу, да и в этот раз хотел обойтись своими силами. Ведь интересно же, в конце концов! :)

Quote (DEMBEL)
он был недоступен в программах

А чтобы проги шрифт видели надо в реестре его прописать. Или еще что-то есть?

Автор - Вадим
Дата добавления - 28 Января 2010 в 21:45
DEMBELДата: Чт, 28 Января 2010, 22:30 | Сообщение # 76
Наш дизайнер
Quote (Вадим)
А чтобы проги шрифт видели надо в реестре его прописать. Или еще что-то есть?

ну ПО ИДЕЕ да, в общем, нужно еще "дать знать" открытым программам в системе что доступен новый шрифт. Вот как это сделать я и думаю, вернее, думаю в этом ли проблема или нет. Возможно следует просто перезагруз сделать...
Попробуй удалить колибри(файл,реестр)->перезагрузить комп->поставить обратно ВРУЧНУЮ (и лучше не через Проводник->скопировать файл в fonts и написать в реестр)->снова перезагрузить и проверить доступен ли шрифт.


Как задавать вопросы

Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
Сообщение
Quote (Вадим)
А чтобы проги шрифт видели надо в реестре его прописать. Или еще что-то есть?

ну ПО ИДЕЕ да, в общем, нужно еще "дать знать" открытым программам в системе что доступен новый шрифт. Вот как это сделать я и думаю, вернее, думаю в этом ли проблема или нет. Возможно следует просто перезагруз сделать...
Попробуй удалить колибри(файл,реестр)->перезагрузить комп->поставить обратно ВРУЧНУЮ (и лучше не через Проводник->скопировать файл в fonts и написать в реестр)->снова перезагрузить и проверить доступен ли шрифт.

Автор - DEMBEL
Дата добавления - 28 Января 2010 в 22:30
ВадимДата: Чт, 28 Января 2010, 23:20 | Сообщение # 77
Генератор идей
Quote (DEMBEL)
попробовал пару способов, чето не могу заставить шрифт заработать...
Какие способы испробовал? Какие-то другие команды?


Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
 
Сообщение
Quote (DEMBEL)
попробовал пару способов, чето не могу заставить шрифт заработать...
Какие способы испробовал? Какие-то другие команды?

Автор - Вадим
Дата добавления - 28 Января 2010 в 23:20
DEMBELДата: Чт, 28 Января 2010, 23:28 | Сообщение # 78
Наш дизайнер
Quote (Вадим)
Какие-то другие команды?

да, системные кое-какие... чтобы
Quote (DEMBEL)
"дать знать" открытым программам в системе что доступен новый шрифт
но либо не пашет либо я неправильно вызываю... попробую потом еще раз. Либо вместо этого пробовать машину перезагружать как я писал выше.


Как задавать вопросы

Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
Сообщение
Quote (Вадим)
Какие-то другие команды?

да, системные кое-какие... чтобы
Quote (DEMBEL)
"дать знать" открытым программам в системе что доступен новый шрифт
но либо не пашет либо я неправильно вызываю... попробую потом еще раз. Либо вместо этого пробовать машину перезагружать как я писал выше.

Автор - DEMBEL
Дата добавления - 28 Января 2010 в 23:28
Alex3AДата: Пт, 29 Января 2010, 03:47 | Сообщение # 79
Друг клуба ММВ
Шрифты это вещь щепетильная, в винде куча прибамбасов со шриффтами, есть ряд стандартных шрифтов, которые должны быть всегда. В принципе, при нарушении стандартных шрифтов, нарушается работа винды - запустил какую прогу а там фиг,
ничего то и не видно. Есть такая фича шрифт по умолчанию, это когда в проге не
указан конкретный, потом выбор размера в системных прогах. В общем дабы рьяные
юзвери не смогли поламать операционку, доступ к системной папке затруднен.
Выбрал не тот шрифт, хрен закроеш окно, или управление проги становится
недоступным. С другой стороны, множество програм использует свои собственные
шрифты, на ряду с системными, и держать их могут отдельно. Ну и конечно все
телодвижения оставляют свой след в реестре, по поиску поищите слово font,
найдете кучу веток для разных програм. Инсталироватьсвой шрифт в систему
можно стандартным методом, вы его знаете. Как более быстрая альтернатива,
можно, преварительно пошаманив, добавить в меню "отослать" папку фонт.
Добавления своего шрифта в системные не всегда приведет к тому что нужная
вам прога его увидит, у нее может быть другое место хранения шрифтов,
или в установленном вами шрифте может не оказаться нужной для этой проги
страницы, плюс всякия премудрости типа локалей и еще много разной чепухи.
Поможет ли перезагрука? Не всегда, все зависит от устройства конкретной
проги, не исключаю что могут быть и такие что не в состоянии подхватить
появившийся фонт. К примеру список фонтов для нее создается при инсталяции
и записывается в реестр, всякое бывает.
 
СообщениеШрифты это вещь щепетильная, в винде куча прибамбасов со шриффтами, есть ряд стандартных шрифтов, которые должны быть всегда. В принципе, при нарушении стандартных шрифтов, нарушается работа винды - запустил какую прогу а там фиг,
ничего то и не видно. Есть такая фича шрифт по умолчанию, это когда в проге не
указан конкретный, потом выбор размера в системных прогах. В общем дабы рьяные
юзвери не смогли поламать операционку, доступ к системной папке затруднен.
Выбрал не тот шрифт, хрен закроеш окно, или управление проги становится
недоступным. С другой стороны, множество програм использует свои собственные
шрифты, на ряду с системными, и держать их могут отдельно. Ну и конечно все
телодвижения оставляют свой след в реестре, по поиску поищите слово font,
найдете кучу веток для разных програм. Инсталироватьсвой шрифт в систему
можно стандартным методом, вы его знаете. Как более быстрая альтернатива,
можно, преварительно пошаманив, добавить в меню "отослать" папку фонт.
Добавления своего шрифта в системные не всегда приведет к тому что нужная
вам прога его увидит, у нее может быть другое место хранения шрифтов,
или в установленном вами шрифте может не оказаться нужной для этой проги
страницы, плюс всякия премудрости типа локалей и еще много разной чепухи.
Поможет ли перезагрука? Не всегда, все зависит от устройства конкретной
проги, не исключаю что могут быть и такие что не в состоянии подхватить
появившийся фонт. К примеру список фонтов для нее создается при инсталяции
и записывается в реестр, всякое бывает.

Автор - Alex3A
Дата добавления - 29 Января 2010 в 03:47
ВадимДата: Пт, 29 Января 2010, 08:36 | Сообщение # 80
Генератор идей
Quote (DEMBEL)
"дать знать" открытым программам в системе что доступен новый шрифт
Это твое высказывание я немного недооценил. Респект, навел на мысль!

Quote (Alex3A)
множество программ использует свои собственные шрифты, на ряду с системными, и держать их могут отдельно
Да, и это совсем не мешает другим программам видеть этот шрифт, если о нем есть запись в реестре! И с чего я думал, что только из системной папки можно видеть? %)
Quote (Alex3A)
К примеру список фонтов для нее создается при инсталяции
и записывается в реестр, всякое бывает.
Весьма любопытно! Учтём, на будущее!

В общем, упорство в этот раз вознаградилось! :D

Проблема с установкой шрифта решена!
Мне удалось найти (собственно, они и не прятались) ДВА работающих способа контроля шрифта в проекте (ну, не считая стандартных для NB). Попробую подытожить основное нарытое по данной теме, так, чтобы народу полезнее было, в случае подобных трудностей. Поэтому опишу подробно.

КАК ПРОГРАММНО УСТАНОВИТЬ НУЖНЫЙ ПРОЕКТУ ШРИФТ В СИСТЕМУ ПОЛЬЗОВАТЕЛЯ

Если текст в Вашей программе отображается неправильно, не тем шрифтом (например, у пользователя шрифт "разбегается", изменен характер его начертания, жирность и пр.), или если Ваша программа использует не системный шрифт и Вы опасаетесь того, что Windows подставит совсем не подходящий шрифт, то решить эту проблему можно.

Основное решение – стандартное, в настройках проекта NB (во время компиляции проекта) проставить галочку "все шрифты…" или галочку "только эти…" (и выбрать свои используемые нестандартные шрифты).

Однако может случиться так, как случилось у меня – почему-то NB не смогла дать системе пользователя знать, что использовать нужно тот шрифт, который я прикрепил к проекту (Calibri True Type), либо она этот шрифт к проекту не прикрепила, в общем, что-то пошло не так... Выход в этом случае – установить нужный шрифт программно, наверняка.

Для этого мы делаем две основных вещи:
1) Проверяем наличие нужных шрифтов на наличие в системе (во время запуска нашего проекта). Если их нет, то копируем туда свои из "багажа" дистрибутива нашего проекта (соответственно нужный шрифт мы в "багаж" заранее складываем, при компиляции).
2) Прописываем скопированные шрифты в реестр системы пользователя (тем самым регистрируем шрифты, чтобы они отображались в программах, обнаруживались системой и любыми программами).

Пишем код

Покажу на примере своего проекта, шрифт "Калибри" имеет 4 начертания, каждому соответствует свой файл шрифта, поэтому и в "багаж" мы сложим все 4 файла, после установки программы они окажутся в той же папке, где и исполняемый файл нашего проекта. Можно, конечно, добавить в код проверку на корректность установки шрифта, но наверное это уже лишнее. Надо все-таки доверять NB :).

Просто скопировать файл шрифта в системную папку C:\Windows\Fonts стандартными командами FileCopy или ExtractFile (или FileToVar / FileWrite через буфер обмена, с помощью глобальной переменной [Clipboard]) не получится, поскольку данная системная папка защищена - шрифт исчезнет сразу после закрытия Вашего приложения и программа просто не успеет им насладиться. Кроме того, новый шрифт становится доступным для программ только после перезагрузки системы, в противном случае проги его просто не увидят, даже если Вы шрифт скопировали и прописали в реестре.

Однако, скопировать в системную папку можно нестандартными командами. В частности это таки оказалось возможно, но с помощью команды npCopiarArchivos плагина NeoDouble Давида Эсперальты. В ниже приведенном коде не учтена проверка версии Windows, но проверить, определить платформу Windows (95, 98, ME, NT, 2000, XP) можно посредством глобальной переменной [WindowsPlatform] или командой npVersionWindows плагина NeoDouble.[/b]

После копирования с помощью этого плагина шрифт остаётся в системной папке и после закрытия приложения, а после перезагрузки компьютера становится виден всем программам (проверял на Word). Видимо копирование тут реализовано как-то иначе, "под столом", что-ли… :).

Второй способ контроля (установки) шрифта значительно проще.
Шрифт никуда можно не копировать, можно оставить в папке проекта (в моем примере так и есть), а в реестре прописать абсолютный путь для него. Тогда, программы, обновляющие список шрифтов при запуске, обнаружат что шрифт с таким-то названием находится там-то.

В соответствующей ветке реестра "параметр" – это имя шрифта, а значение – это путь до него. Если вместо абсолютного пути к файлу в значении указано просто имя файла (не путать с именем шрифта!), то подразумевается, что шрифт находится в системной папке Fonts. Именно там его программа и будет искать. А если указан абсолютный путь, то будет искать именно по этому абсолютному пути.

Пример кода:
(дает пользователю выбор – каким из двух способов устанавливать шрифт)

Code
FileExists "C:\WINDOWS\Fonts\CALIBRI.TTF" "[calibriN]"
     If "[calibriN]" "=" "False"
       MessageBox "Выберите действие" "В операционной системе Вашего компьютера не обнаружен|необходимый для работы шрифт Calibri (True Type).|Без этого шрифта программа будет отображаться неправильно.||У данного шрифта четыре вида начертания. |Возможно, программе потребуется установить все четыре.||Изменения вступят в силу только после перезагрузки компьютера.||Установить шрифт Calibri на Ваш компьютер?" "В системную папку Fonts|В папку программы Motive Power|Не в этот раз" "[InstCalibri]"
          If "[InstCalibri]" "=" "1"
            RegistryWrite "HKEY_LOCAL_MACHINE" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts\Calibri (TrueType)" "CALIBRI.TTF"
            npCopiarArchivos "[PubDir]CALIBRI.TTF" "C:\Windows\Fonts" "True"
            AlertBox "Сообщение" "Шрифт Calibri (True Type) успешно установлен!"
          EndIf
          If "[InstCalibri]" "=" "2"
            RegistryWrite "HKEY_LOCAL_MACHINE" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts\Calibri (TrueType)" "C:\Program Files\Motive Power\CALIBRI.TTF"
           AlertBox "Сообщение" "Шрифт Calibri (True Type) успешно установлен!"
          EndIf
          If "[InstCalibri]" "=" "3"
           AlertBox "Сообщение" "Программа будет работать, но многие надписи окажутся вне вашего поля зрения.||Рекомендуется установить шрифт при следующем запуске программы."
          EndIf
          If "[InstCalibri]" "=" "0"
           AlertBox "Сообщение" "Программа будет работать, но многие надписи окажутся вне вашего поля зрения.||Рекомендуется установить шрифт при следующем запуске программы."
          EndIf
      EndIf

И далее точно также повторяем этот блок кода для трех других файлов этого шрифта (только имена файлов и разделов, конечно, будут другие), либо можно написать один блок кода сразу для всех, но выглядеть он будет, естественно, иначе.

Но Вы можете и определить место для копирования своего шрифта произвольно.Главное, в реестре потом не забыть указать где программам этот самый шрифт искать. Если копировать, то, по всей видимости, логичнее копировать через команду FileCopy (когда файлы идут "багажом") и командой ExtractFile (если файлы были вложенными в проект). Второй вариант не совсем удобен тем, что увеличивает вес самого исполняемого файла, а не только дистрибутива. Но всё зависит от целей. Если нужен просто экзешник, без установочной программы и файлы должны работать только вместе с проектом, то этот вариант подойдет больше первого.

Внести изменения в реестр пользователя можно и другим способом.
Этот способ может понадобиться, в случае, если программа уже установлена и Вам срочно нужно помочь исправить ситуацию без переустановки программы пользователем.
Для этого нам нужно сначала сделать файл .reg, а затем запустить его на компьютере пользователя (например, отправив рег-файл архивом ему на почту).
Чтобы создать такой reg-файл, заходим в редактор реестра (клавиши Win+R, команда regedit), находим нужный ключ и раздел реестра (для Windows выше 98-й):

Code
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
В данном разделе хранится список шрифтов зарегистрированных в Windows и пути доступа к ним. Каждый параметр представляет собой имя шрифта, а каждое значение параметра путь к файлу данного шрифта (или только название шрифта, если шрифт лежит в системной папке Fonts).

Делаем экспорт данных с раздела Fonts в реестре (для этого нажимаем по ней правой кнопкой мыши и выбираем "экспорт", выбираем место сохранения, задаем имя файлу, например, Calibri.reg и жмем ОК). Можно и вручную набрать нужное содержание этого рег-файла, но экспортом и быстрее, и мало шансов ошибиться, а ведь ошибка в одной букве может заставить Ваш компьютер удалить все программы, а затем взорваться… Шучу. Но таки, как известно, ошибаться в реестре не нужно все равно, поэтому вместо того, чтобы списывать путь в реестре - всегда копируйте его).
Далее открываем получившийся рег-файл через любой Блокнот и удаляем все лишние строки, оставив только саму шапку рег-файла, имя ключа и четыре (в моем случае) строки нужных нам параметров с их значениями. В блокноте результат в моем случае выглядит так:

Для установки в системную папку

Code
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
"Calibri (TrueType)"="CALIBRI.TTF"
"Calibri Bold (TrueType)"="CALIBRIB.TTF"
"Calibri Italic (TrueType)"="CALIBRII.TTF"
"Calibri Bold Italic (TrueType)"="CALIBRIZ.TTF"

Для регистрации шрифта в любой папке, например в папке проекта:

Code
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
"Calibri (TrueType)"=" C:\Program Files\Motive Power\CALIBRI.TTF"
"Calibri Bold (TrueType)"=" C:\Program Files\Motive Power\CALIBRIB.TTF"
"Calibri Italic (TrueType)"=" C:\Program Files\Motive Power\CALIBRII.TTF"
"Calibri Bold Italic (TrueType)"=" C:\Program Files\Motive Power\CALIBRIZ.TTF"

Теперь Вы можете, там где это нужно, запустить рег-файл вручную, программно или отправить его пользователю и попросить его запустить просто дважды щелкнув по нему и согласившись с изменениями (потому, что появится окно выбора).

Если нужно сэкономить на размере дистрибутива.
Если для Вас критичен размер проекта, а нужный файл(ы) шрифтов весит довольно много (к примеру, 4 файла Calibri весят 1,36 Мб, а это весьма заметно и для кого-то может быть критичным), то вместо того, чтобы инсталлировать шрифт можно просто управлять подстановкой шрифтов. Вы просто создаете правило, на случай, если нужного шрифта в системе нет, тогда она будет пользоваться тем шрифтом, который Вы ей определите сами (не отдавая этот выбор на волю лихого случая в геймерской машине… :D …). Для этого "химичим" точно также, но уже в этой ветке реестра:

Code
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes
Информация об альтернативных шрифтах, которые используются вместо тех которые не установлены в системе.

Программно (или рег-файлом) создаем нужные параметры со значениями, где (в данном ключе реестра - FontSubstitutes) параметр – это шрифт по умолчанию, а значение – это тот шрифт, который должен использоваться для подстановки. Например, раскрыв в редакторе реестра раздел FontSubstitutes, вы заметите, что шрифт Arial Cyr образуется из шрифта Arial с использованием таблицы преобразования 204.

Рег-файл (с именем: "вашеимя.reg") в этом случае выглядел бы так:

Code
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ FontSubstitutes]
"Arial Cyr,0"="Arial,204"

А команда записи в реестр командой NB выглядела бы так:

Code
RegistryWrite "HKEY_LOCAL_MACHINE" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes\Arial Cyr,0" " Arial,204"

В более щепетильных случаях (и, пожалуй, так будет правильнее) можно организовать сначала проверку на наличие того параметра значение которого вы собираетесь создать (или поменять, ежели оно есть). А вдруг это правило смертельно необходимо какой-то проге пользователя? Для этого логично использовать команду чтения значения реестра. И если таковой параметр уже есть (например, для этого шрифта уже правило создано) и Вы его менять не собираетесь, то можно предусмотреть для этого случая выбор другого правила. И так хоть до посинения, пока имя параметра или хотя бы его значение не окажется свободным.

ПРИМЕЧАНИЯ:

В системе Windows 98 нужные разделы реестра будут называться чуть иначе (без NT):

Code
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fon tSubstitutes

В системе Windows 95 шрифты для подстановки определяются не в Реестре, а в файле win.ini (раздел FontSubstitutes), что, в принципе, тоже самое.

В любом случае, после изменения правил подстановки или установки шрифтов необходимо перезагрузить компьютер (иначе программы не будут видеть новый шрифт), о чем можно известить пользователя в соответствующем сообщении или сделать это программно (средств для этого достаточно).

Изменения настроек шрифтов лучше делать после того, как сделаны региональные установки.

Дополнительно о роли разных ключей реестра можно узнать тут (на примере Windows XP):
http://bit-bait.ucoz.ru/Reestr/reestr/right.htm

Если в папке "Шрифты" в панели управления отсутствуют в меню специфичные для неё пункты (например, "Установить новый шрифт"), то причина может быть одной из перечисленных:

* атрибут "Системный" не установлен на каталог FONTS;
* файл FONTEXT.DLL отсутствует или повреждён;
* файл DESKTOP.INI в каталоге WINDOWS\FONTS отсутствует или повреждён.

Для восстановления системного атрибута на каталоге FONTS перейдите в сеанс MS-DOS, в каталоге WINDOWS выполните команду ATTRIB FONTS +S и перезагрузите компьютер.

Для восстановления файлов FONTEXT.DLL и DESKTOP.INI их необходимо извлечь из инсталляционного комплекта с помощью программы EXTRACT.
Кстати, DESKTOP.INI – весьма интересный инструмент! С его помощью можно управлять всеми файлами в папке как определенным типом файлов и делать разные другие вещи.

hpwDllCall v1.03 - плагин обеспечивающий вызов DLL для NeoBook. Возможно, его применение позволило бы средствами самой NB (без плагинов) установить шрифт в системную директорию. Но это лишь гипотеза. Сам плагин, если кому нужно, лежит здесь:
http://www.neosoftware.com/neobook....&lid=13


Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)

Сообщение отредактировано
Вадим - Пн, 01 Февраля 2010, 01:10
 
Сообщение
Quote (DEMBEL)
"дать знать" открытым программам в системе что доступен новый шрифт
Это твое высказывание я немного недооценил. Респект, навел на мысль!

Quote (Alex3A)
множество программ использует свои собственные шрифты, на ряду с системными, и держать их могут отдельно
Да, и это совсем не мешает другим программам видеть этот шрифт, если о нем есть запись в реестре! И с чего я думал, что только из системной папки можно видеть? %)
Quote (Alex3A)
К примеру список фонтов для нее создается при инсталяции
и записывается в реестр, всякое бывает.
Весьма любопытно! Учтём, на будущее!

В общем, упорство в этот раз вознаградилось! :D

Проблема с установкой шрифта решена!
Мне удалось найти (собственно, они и не прятались) ДВА работающих способа контроля шрифта в проекте (ну, не считая стандартных для NB). Попробую подытожить основное нарытое по данной теме, так, чтобы народу полезнее было, в случае подобных трудностей. Поэтому опишу подробно.

КАК ПРОГРАММНО УСТАНОВИТЬ НУЖНЫЙ ПРОЕКТУ ШРИФТ В СИСТЕМУ ПОЛЬЗОВАТЕЛЯ

Если текст в Вашей программе отображается неправильно, не тем шрифтом (например, у пользователя шрифт "разбегается", изменен характер его начертания, жирность и пр.), или если Ваша программа использует не системный шрифт и Вы опасаетесь того, что Windows подставит совсем не подходящий шрифт, то решить эту проблему можно.

Основное решение – стандартное, в настройках проекта NB (во время компиляции проекта) проставить галочку "все шрифты…" или галочку "только эти…" (и выбрать свои используемые нестандартные шрифты).

Однако может случиться так, как случилось у меня – почему-то NB не смогла дать системе пользователя знать, что использовать нужно тот шрифт, который я прикрепил к проекту (Calibri True Type), либо она этот шрифт к проекту не прикрепила, в общем, что-то пошло не так... Выход в этом случае – установить нужный шрифт программно, наверняка.

Для этого мы делаем две основных вещи:
1) Проверяем наличие нужных шрифтов на наличие в системе (во время запуска нашего проекта). Если их нет, то копируем туда свои из "багажа" дистрибутива нашего проекта (соответственно нужный шрифт мы в "багаж" заранее складываем, при компиляции).
2) Прописываем скопированные шрифты в реестр системы пользователя (тем самым регистрируем шрифты, чтобы они отображались в программах, обнаруживались системой и любыми программами).

Пишем код

Покажу на примере своего проекта, шрифт "Калибри" имеет 4 начертания, каждому соответствует свой файл шрифта, поэтому и в "багаж" мы сложим все 4 файла, после установки программы они окажутся в той же папке, где и исполняемый файл нашего проекта. Можно, конечно, добавить в код проверку на корректность установки шрифта, но наверное это уже лишнее. Надо все-таки доверять NB :).

Просто скопировать файл шрифта в системную папку C:\Windows\Fonts стандартными командами FileCopy или ExtractFile (или FileToVar / FileWrite через буфер обмена, с помощью глобальной переменной [Clipboard]) не получится, поскольку данная системная папка защищена - шрифт исчезнет сразу после закрытия Вашего приложения и программа просто не успеет им насладиться. Кроме того, новый шрифт становится доступным для программ только после перезагрузки системы, в противном случае проги его просто не увидят, даже если Вы шрифт скопировали и прописали в реестре.

Однако, скопировать в системную папку можно нестандартными командами. В частности это таки оказалось возможно, но с помощью команды npCopiarArchivos плагина NeoDouble Давида Эсперальты. В ниже приведенном коде не учтена проверка версии Windows, но проверить, определить платформу Windows (95, 98, ME, NT, 2000, XP) можно посредством глобальной переменной [WindowsPlatform] или командой npVersionWindows плагина NeoDouble.[/b]

После копирования с помощью этого плагина шрифт остаётся в системной папке и после закрытия приложения, а после перезагрузки компьютера становится виден всем программам (проверял на Word). Видимо копирование тут реализовано как-то иначе, "под столом", что-ли… :).

Второй способ контроля (установки) шрифта значительно проще.
Шрифт никуда можно не копировать, можно оставить в папке проекта (в моем примере так и есть), а в реестре прописать абсолютный путь для него. Тогда, программы, обновляющие список шрифтов при запуске, обнаружат что шрифт с таким-то названием находится там-то.

В соответствующей ветке реестра "параметр" – это имя шрифта, а значение – это путь до него. Если вместо абсолютного пути к файлу в значении указано просто имя файла (не путать с именем шрифта!), то подразумевается, что шрифт находится в системной папке Fonts. Именно там его программа и будет искать. А если указан абсолютный путь, то будет искать именно по этому абсолютному пути.

Пример кода:
(дает пользователю выбор – каким из двух способов устанавливать шрифт)

Code
FileExists "C:\WINDOWS\Fonts\CALIBRI.TTF" "[calibriN]"
     If "[calibriN]" "=" "False"
       MessageBox "Выберите действие" "В операционной системе Вашего компьютера не обнаружен|необходимый для работы шрифт Calibri (True Type).|Без этого шрифта программа будет отображаться неправильно.||У данного шрифта четыре вида начертания. |Возможно, программе потребуется установить все четыре.||Изменения вступят в силу только после перезагрузки компьютера.||Установить шрифт Calibri на Ваш компьютер?" "В системную папку Fonts|В папку программы Motive Power|Не в этот раз" "[InstCalibri]"
          If "[InstCalibri]" "=" "1"
            RegistryWrite "HKEY_LOCAL_MACHINE" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts\Calibri (TrueType)" "CALIBRI.TTF"
            npCopiarArchivos "[PubDir]CALIBRI.TTF" "C:\Windows\Fonts" "True"
            AlertBox "Сообщение" "Шрифт Calibri (True Type) успешно установлен!"
          EndIf
          If "[InstCalibri]" "=" "2"
            RegistryWrite "HKEY_LOCAL_MACHINE" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts\Calibri (TrueType)" "C:\Program Files\Motive Power\CALIBRI.TTF"
           AlertBox "Сообщение" "Шрифт Calibri (True Type) успешно установлен!"
          EndIf
          If "[InstCalibri]" "=" "3"
           AlertBox "Сообщение" "Программа будет работать, но многие надписи окажутся вне вашего поля зрения.||Рекомендуется установить шрифт при следующем запуске программы."
          EndIf
          If "[InstCalibri]" "=" "0"
           AlertBox "Сообщение" "Программа будет работать, но многие надписи окажутся вне вашего поля зрения.||Рекомендуется установить шрифт при следующем запуске программы."
          EndIf
      EndIf

И далее точно также повторяем этот блок кода для трех других файлов этого шрифта (только имена файлов и разделов, конечно, будут другие), либо можно написать один блок кода сразу для всех, но выглядеть он будет, естественно, иначе.

Но Вы можете и определить место для копирования своего шрифта произвольно.Главное, в реестре потом не забыть указать где программам этот самый шрифт искать. Если копировать, то, по всей видимости, логичнее копировать через команду FileCopy (когда файлы идут "багажом") и командой ExtractFile (если файлы были вложенными в проект). Второй вариант не совсем удобен тем, что увеличивает вес самого исполняемого файла, а не только дистрибутива. Но всё зависит от целей. Если нужен просто экзешник, без установочной программы и файлы должны работать только вместе с проектом, то этот вариант подойдет больше первого.

Внести изменения в реестр пользователя можно и другим способом.
Этот способ может понадобиться, в случае, если программа уже установлена и Вам срочно нужно помочь исправить ситуацию без переустановки программы пользователем.
Для этого нам нужно сначала сделать файл .reg, а затем запустить его на компьютере пользователя (например, отправив рег-файл архивом ему на почту).
Чтобы создать такой reg-файл, заходим в редактор реестра (клавиши Win+R, команда regedit), находим нужный ключ и раздел реестра (для Windows выше 98-й):

Code
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
В данном разделе хранится список шрифтов зарегистрированных в Windows и пути доступа к ним. Каждый параметр представляет собой имя шрифта, а каждое значение параметра путь к файлу данного шрифта (или только название шрифта, если шрифт лежит в системной папке Fonts).

Делаем экспорт данных с раздела Fonts в реестре (для этого нажимаем по ней правой кнопкой мыши и выбираем "экспорт", выбираем место сохранения, задаем имя файлу, например, Calibri.reg и жмем ОК). Можно и вручную набрать нужное содержание этого рег-файла, но экспортом и быстрее, и мало шансов ошибиться, а ведь ошибка в одной букве может заставить Ваш компьютер удалить все программы, а затем взорваться… Шучу. Но таки, как известно, ошибаться в реестре не нужно все равно, поэтому вместо того, чтобы списывать путь в реестре - всегда копируйте его).
Далее открываем получившийся рег-файл через любой Блокнот и удаляем все лишние строки, оставив только саму шапку рег-файла, имя ключа и четыре (в моем случае) строки нужных нам параметров с их значениями. В блокноте результат в моем случае выглядит так:

Для установки в системную папку

Code
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
"Calibri (TrueType)"="CALIBRI.TTF"
"Calibri Bold (TrueType)"="CALIBRIB.TTF"
"Calibri Italic (TrueType)"="CALIBRII.TTF"
"Calibri Bold Italic (TrueType)"="CALIBRIZ.TTF"

Для регистрации шрифта в любой папке, например в папке проекта:

Code
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
"Calibri (TrueType)"=" C:\Program Files\Motive Power\CALIBRI.TTF"
"Calibri Bold (TrueType)"=" C:\Program Files\Motive Power\CALIBRIB.TTF"
"Calibri Italic (TrueType)"=" C:\Program Files\Motive Power\CALIBRII.TTF"
"Calibri Bold Italic (TrueType)"=" C:\Program Files\Motive Power\CALIBRIZ.TTF"

Теперь Вы можете, там где это нужно, запустить рег-файл вручную, программно или отправить его пользователю и попросить его запустить просто дважды щелкнув по нему и согласившись с изменениями (потому, что появится окно выбора).

Если нужно сэкономить на размере дистрибутива.
Если для Вас критичен размер проекта, а нужный файл(ы) шрифтов весит довольно много (к примеру, 4 файла Calibri весят 1,36 Мб, а это весьма заметно и для кого-то может быть критичным), то вместо того, чтобы инсталлировать шрифт можно просто управлять подстановкой шрифтов. Вы просто создаете правило, на случай, если нужного шрифта в системе нет, тогда она будет пользоваться тем шрифтом, который Вы ей определите сами (не отдавая этот выбор на волю лихого случая в геймерской машине… :D …). Для этого "химичим" точно также, но уже в этой ветке реестра:

Code
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes
Информация об альтернативных шрифтах, которые используются вместо тех которые не установлены в системе.

Программно (или рег-файлом) создаем нужные параметры со значениями, где (в данном ключе реестра - FontSubstitutes) параметр – это шрифт по умолчанию, а значение – это тот шрифт, который должен использоваться для подстановки. Например, раскрыв в редакторе реестра раздел FontSubstitutes, вы заметите, что шрифт Arial Cyr образуется из шрифта Arial с использованием таблицы преобразования 204.

Рег-файл (с именем: "вашеимя.reg") в этом случае выглядел бы так:

Code
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ FontSubstitutes]
"Arial Cyr,0"="Arial,204"

А команда записи в реестр командой NB выглядела бы так:

Code
RegistryWrite "HKEY_LOCAL_MACHINE" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes\Arial Cyr,0" " Arial,204"

В более щепетильных случаях (и, пожалуй, так будет правильнее) можно организовать сначала проверку на наличие того параметра значение которого вы собираетесь создать (или поменять, ежели оно есть). А вдруг это правило смертельно необходимо какой-то проге пользователя? Для этого логично использовать команду чтения значения реестра. И если таковой параметр уже есть (например, для этого шрифта уже правило создано) и Вы его менять не собираетесь, то можно предусмотреть для этого случая выбор другого правила. И так хоть до посинения, пока имя параметра или хотя бы его значение не окажется свободным.

ПРИМЕЧАНИЯ:

В системе Windows 98 нужные разделы реестра будут называться чуть иначе (без NT):

Code
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fon tSubstitutes

В системе Windows 95 шрифты для подстановки определяются не в Реестре, а в файле win.ini (раздел FontSubstitutes), что, в принципе, тоже самое.

В любом случае, после изменения правил подстановки или установки шрифтов необходимо перезагрузить компьютер (иначе программы не будут видеть новый шрифт), о чем можно известить пользователя в соответствующем сообщении или сделать это программно (средств для этого достаточно).

Изменения настроек шрифтов лучше делать после того, как сделаны региональные установки.

Дополнительно о роли разных ключей реестра можно узнать тут (на примере Windows XP):
http://bit-bait.ucoz.ru/Reestr/reestr/right.htm

Если в папке "Шрифты" в панели управления отсутствуют в меню специфичные для неё пункты (например, "Установить новый шрифт"), то причина может быть одной из перечисленных:

* атрибут "Системный" не установлен на каталог FONTS;
* файл FONTEXT.DLL отсутствует или повреждён;
* файл DESKTOP.INI в каталоге WINDOWS\FONTS отсутствует или повреждён.

Для восстановления системного атрибута на каталоге FONTS перейдите в сеанс MS-DOS, в каталоге WINDOWS выполните команду ATTRIB FONTS +S и перезагрузите компьютер.

Для восстановления файлов FONTEXT.DLL и DESKTOP.INI их необходимо извлечь из инсталляционного комплекта с помощью программы EXTRACT.
Кстати, DESKTOP.INI – весьма интересный инструмент! С его помощью можно управлять всеми файлами в папке как определенным типом файлов и делать разные другие вещи.

hpwDllCall v1.03 - плагин обеспечивающий вызов DLL для NeoBook. Возможно, его применение позволило бы средствами самой NB (без плагинов) установить шрифт в системную директорию. Но это лишь гипотеза. Сам плагин, если кому нужно, лежит здесь:
http://www.neosoftware.com/neobook....&lid=13


Автор - Вадим
Дата добавления - 29 Января 2010 в 08:36
СергейДата: Пт, 29 Января 2010, 09:47 | Сообщение # 81
Необукер
Quote (Вадим)
Сам плагин, если кому нужно, лежит здесь:
ковырял я этот плагин, у меня кроме его dll ни скакими другими неполучилось
 
Сообщение
Quote (Вадим)
Сам плагин, если кому нужно, лежит здесь:
ковырял я этот плагин, у меня кроме его dll ни скакими другими неполучилось

Автор - Сергей
Дата добавления - 29 Января 2010 в 09:47
ВадимДата: Пт, 29 Января 2010, 10:13 | Сообщение # 82
Генератор идей
Quote (Сергей)
ковырял я этот плагин
А я в dll вообще пока ничего не соображаю. Просто был разговор о возможной работе с API, вот я инфу и добавил. Темный лес для меня... Но, чую, что там может быть много чего вкусного! :D


Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
 
Сообщение
Quote (Сергей)
ковырял я этот плагин
А я в dll вообще пока ничего не соображаю. Просто был разговор о возможной работе с API, вот я инфу и добавил. Темный лес для меня... Но, чую, что там может быть много чего вкусного! :D

Автор - Вадим
Дата добавления - 29 Января 2010 в 10:13
DEMBELДата: Пт, 29 Января 2010, 11:18 | Сообщение # 83
Наш дизайнер
Quote (Вадим)
Но, чую, что там может быть много чего вкусного!

там все очень вкусное что касается всех системных функций. Но вызывать функции системных dll-библиотек можно не только через плагин, а через RunDll32. Например, вызовем функцию показа инфы о винде из shell32.dll:
rundll32 shell32.dll, ShellAboutA
Безопасное извл. устройства:
rundll32.exe shell32.dll, Control_RunDLL hotplug.dll
Таким образом доступны сотни системных функций.

Добавлено (29 Январь 2010, 11:18)
---------------------------------------------
так я не понял, ты решил проблему с установкой шрифта?


Как задавать вопросы

Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
Сообщение
Quote (Вадим)
Но, чую, что там может быть много чего вкусного!

там все очень вкусное что касается всех системных функций. Но вызывать функции системных dll-библиотек можно не только через плагин, а через RunDll32. Например, вызовем функцию показа инфы о винде из shell32.dll:
rundll32 shell32.dll, ShellAboutA
Безопасное извл. устройства:
rundll32.exe shell32.dll, Control_RunDLL hotplug.dll
Таким образом доступны сотни системных функций.

Добавлено (29 Январь 2010, 11:18)
---------------------------------------------
так я не понял, ты решил проблему с установкой шрифта?


Автор - DEMBEL
Дата добавления - 29 Января 2010 в 11:18
ВадимДата: Пт, 29 Января 2010, 13:04 | Сообщение # 84
Генератор идей
Quote (DEMBEL)
Таким образом доступны сотни системных функций.
Правильно ли я понимаю, что их таким образом можно через Run вызвать и в NB? И где можно почитать об этом синтаксисе вызова через программу rundll32 функций библиотек? Т.е. где можно узать о том, как этим всем пользоваться? Они в каких-то своих переменных предоставляют информацию?

Quote (DEMBEL)
так я не понял, ты решил проблему с установкой шрифта?
:D :D :D Да, проблема со шрифтом полностью решена, слава богу! Поэтому я и подытожил собранные за два дня материалы и подробно описал решение для тех, кому может оно понадобиться.

Сейчас я доработал код, но по прежнему все 4 начертания устанавливаются по очереди и фиксируется факт этой установки, а пользователь может выбрать каким способом устанавливать шрифты - с копированием в системную папку или нет. Разница для него лишь в том, что при деинсталляции моей программы исчезнут и шрифты (если они находились в папке программы и были просто прописаны в реестре, а не скопированы в системную папку шрифтов). Т.е. оба варианта решения рабочие и позволяют любым программам на компьютере использовать установленный шрифт. В тексте я рассмотрел еще третье решение - через создание правила подстановки похожих шрифтов, но не проверял на практике, ибо это какая-то половинчатая мера (ну, кроме случаев особенного желания сэкономить на весе дистрибутива).

Успокаивает то, что можно контролировать шрифты жестко, без фокусов и сюрпризов.

Добавлено (29 Январь 2010, 13:04)
---------------------------------------------
Однако! У другого тестера, у моего брательника, эта проблема тоже была, и тоже решена. НО! Есть другая фишка, тоже касается шрифтов - на кнопках в проекте не отображаются надписи! Вообще. Девственно чистые плашечки, а не кнопки. Работают, что надо делают, но надписей на них нет.

Кто-нибудь сталкивался с таким???

Не успел с одним разобраться, как новый фокус...

Как будто в "свойствах экрана\оформление\дополнительно" элемент "Рельефные объекты" выставлен с белым шрифтом, но там выставлен черный, я проверил. Давал инструкции, дистанционно.


Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
 
Сообщение
Quote (DEMBEL)
Таким образом доступны сотни системных функций.
Правильно ли я понимаю, что их таким образом можно через Run вызвать и в NB? И где можно почитать об этом синтаксисе вызова через программу rundll32 функций библиотек? Т.е. где можно узать о том, как этим всем пользоваться? Они в каких-то своих переменных предоставляют информацию?

Quote (DEMBEL)
так я не понял, ты решил проблему с установкой шрифта?
:D :D :D Да, проблема со шрифтом полностью решена, слава богу! Поэтому я и подытожил собранные за два дня материалы и подробно описал решение для тех, кому может оно понадобиться.

Сейчас я доработал код, но по прежнему все 4 начертания устанавливаются по очереди и фиксируется факт этой установки, а пользователь может выбрать каким способом устанавливать шрифты - с копированием в системную папку или нет. Разница для него лишь в том, что при деинсталляции моей программы исчезнут и шрифты (если они находились в папке программы и были просто прописаны в реестре, а не скопированы в системную папку шрифтов). Т.е. оба варианта решения рабочие и позволяют любым программам на компьютере использовать установленный шрифт. В тексте я рассмотрел еще третье решение - через создание правила подстановки похожих шрифтов, но не проверял на практике, ибо это какая-то половинчатая мера (ну, кроме случаев особенного желания сэкономить на весе дистрибутива).

Успокаивает то, что можно контролировать шрифты жестко, без фокусов и сюрпризов.

Добавлено (29 Январь 2010, 13:04)
---------------------------------------------
Однако! У другого тестера, у моего брательника, эта проблема тоже была, и тоже решена. НО! Есть другая фишка, тоже касается шрифтов - на кнопках в проекте не отображаются надписи! Вообще. Девственно чистые плашечки, а не кнопки. Работают, что надо делают, но надписей на них нет.

Кто-нибудь сталкивался с таким???

Не успел с одним разобраться, как новый фокус...

Как будто в "свойствах экрана\оформление\дополнительно" элемент "Рельефные объекты" выставлен с белым шрифтом, но там выставлен черный, я проверил. Давал инструкции, дистанционно.


Автор - Вадим
Дата добавления - 29 Января 2010 в 13:04
DEMBELДата: Пт, 29 Января 2010, 13:22 | Сообщение # 85
Наш дизайнер
Quote (Вадим)
Правильно ли я понимаю, что их таким образом можно через Run вызвать и в NB?

ну да
Quote (Вадим)
И где можно почитать об этом синтаксисе вызова через программу rundll32 функций библиотек?

чтобы посмотреть функции и параметры требуется "расковырять" библиотеку, есть такие "хакерские" программки, на подобных же сайтах можно имеющуюся инфу посмотреть, но ее не так много. Ну и потом, потребуется поэкспериментировать с вызовом функции и ее параметрами чтобы получить 100% рабочий вариант, не всегда удается. А синтаксис в этом случае простой
Code
RunDll32 <.DLL>,<Функция> <Параметры>

вот например еще вариант


Как задавать вопросы

Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
Сообщение
Quote (Вадим)
Правильно ли я понимаю, что их таким образом можно через Run вызвать и в NB?

ну да
Quote (Вадим)
И где можно почитать об этом синтаксисе вызова через программу rundll32 функций библиотек?

чтобы посмотреть функции и параметры требуется "расковырять" библиотеку, есть такие "хакерские" программки, на подобных же сайтах можно имеющуюся инфу посмотреть, но ее не так много. Ну и потом, потребуется поэкспериментировать с вызовом функции и ее параметрами чтобы получить 100% рабочий вариант, не всегда удается. А синтаксис в этом случае простой
Code
RunDll32 <.DLL>,<Функция> <Параметры>

вот например еще вариант

Автор - DEMBEL
Дата добавления - 29 Января 2010 в 13:22
ВадимДата: Сб, 30 Января 2010, 05:13 | Сообщение # 86
Генератор идей
Quote (DEMBEL)
вот например еще вариант
Да, я на эту тему обратил внимание, после твоего поста (и благодаря Информеру, слава Диме энд Юре!). Заинтересовало. И в сети попадалось. Мне кажется это тоже очень перспективная тема, для расширения возможностей NB. Но мне пока существующих хватает, поэтому шибко не вбуривался в тему установки чего либо через файл *.inf
А вообще тема хорошая! Спасибо! Надо мне Windows поизучать, а то все как-то кусками, то там, то сям... Вот эта прога, rundll32, например, в книге "Недокументированные и малоизвестные возможности Windows XP" называется гениальной программой и почти забытой самими программистами Microsoft. В общем, матчасть, матчасть...

Добавлено (30 Январь 2010, 05:13)
---------------------------------------------
Обсуждение проблемы отображения надписей на кнопках перенес в новую тему, поскольку тема эта не про шрифт, а, скорее, про объекты вообще (поскольку у тестера не отобразился еще и один чек-бокс, на что я не сразу обратил внимание). И, кроме того, шрифт на кнопках все равно должен быть системным, если я правильно понимаю.


Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
 
Сообщение
Quote (DEMBEL)
вот например еще вариант
Да, я на эту тему обратил внимание, после твоего поста (и благодаря Информеру, слава Диме энд Юре!). Заинтересовало. И в сети попадалось. Мне кажется это тоже очень перспективная тема, для расширения возможностей NB. Но мне пока существующих хватает, поэтому шибко не вбуривался в тему установки чего либо через файл *.inf
А вообще тема хорошая! Спасибо! Надо мне Windows поизучать, а то все как-то кусками, то там, то сям... Вот эта прога, rundll32, например, в книге "Недокументированные и малоизвестные возможности Windows XP" называется гениальной программой и почти забытой самими программистами Microsoft. В общем, матчасть, матчасть...

Добавлено (30 Январь 2010, 05:13)
---------------------------------------------
Обсуждение проблемы отображения надписей на кнопках перенес в новую тему, поскольку тема эта не про шрифт, а, скорее, про объекты вообще (поскольку у тестера не отобразился еще и один чек-бокс, на что я не сразу обратил внимание). И, кроме того, шрифт на кнопках все равно должен быть системным, если я правильно понимаю.


Автор - Вадим
Дата добавления - 30 Января 2010 в 05:13
Форум NeoBook » Всё о программе NeoBook » Общие вопросы по NeoBook » Проблема со шрифтами
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Поиск: