Quote (DEMBEL) "дать знать" открытым программам в системе что доступен новый шрифт Это твое высказывание я немного недооценил. Респект, навел на мысль! Quote (Alex3A) множество программ использует свои собственные шрифты, на ряду с системными, и держать их могут отдельно Да, и это совсем не мешает другим программам видеть этот шрифт, если о нем есть запись в реестре! И с чего я думал, что только из системной папки можно видеть? Quote (Alex3A) К примеру список фонтов для нее создается при инсталяции и записывается в реестр, всякое бывает. Весьма любопытно! Учтём, на будущее! В общем, упорство в этот раз вознаградилось! Проблема с установкой шрифта решена! Мне удалось найти (собственно, они и не прятались) ДВА работающих способа контроля шрифта в проекте (ну, не считая стандартных для 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 Мб, а это весьма заметно и для кого-то может быть критичным), то вместо того, чтобы инсталлировать шрифт можно просто управлять подстановкой шрифтов. Вы просто создаете правило, на случай, если нужного шрифта в системе нет, тогда она будет пользоваться тем шрифтом, который Вы ей определите сами (не отдавая этот выбор на волю лихого случая в геймерской машине… …). Для этого "химичим" точно также, но уже в этой ветке реестра: 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
С уважением, Вадим
Сообщение отредактировал Вадим - Понедельник, 01 Февраль 2010, 01:10 |