none
ClickOnceでのフォントの配布(もしくはWindowsFormにフォントインストール機能を追加) RRS feed

  • 質問

  • お世話になります。

     

    ClickOnceでFontを配布することは可能でしょうか?

    (必須コンポーネントのようなイメージで)

     

    少し調べてみた中では、ムリではないかと諦めかけています。

    もしムリであった場合の代替策として、ClickOnceではEXEなどと一緒に一般ファイル扱いで配布しておき、

    WindowsFormの初回起動時などにWindowsFormのコードから、EXEと同じフォルダにあるFontをクライアントにインストールできないかと考えています。

     

     今回配布が必要なフォントは、帳票出力機能を起動したときだけ必要ですので、必ずしもWindowsFormの初回起動の時点でインストールされている必要はありません。

     

     フォントをシステムにインストールするには、フォントを所定のフォルダにコピーするだけで良いのでしょうか。

     それとも、特別な処理が必要なのでしょうか。また、その処理はWin32APIを使わずに.NetFrameworkの機能だけで実現可能なのでしょうか。

     

     このあたりのお詳しい方いらっしゃいませんでしょうか?

     

    2008年1月29日 10:10

回答

  •  まみや さんからの引用
    ちなみに、プライベートフォントというものは、そこにFontを追加しておくと、Formから見ると、あたかもシステムにフォントがインストールされているように見えるというものでしょうか?

    これは見えませんね。システムにインストールされているのとは別のものと考えたほうがいいです。

     

     まみや さんからの引用
    ⇒ Form1で使用している"特殊フォント"はクライアントにはインストールされていないが、.NetFrameworkが自動的にプライベートフォントコレクションの中も探してくれて、自動的に/透過的にプライベートフォントコレクション内の"特殊フォント"を使ってくれる。

    残念ながら自動的にプライベートフォントコレクションを探すようなことはしてくれません。
    なので、明示的にプライベートフォントコレクションからフォントファミリを取得して、
    それを引数にフォントを生成してやる必要があります。

     

    そして、そのフォントを CrystalReports で使用している全てのコントロールに設定してやれば
    帳票に特殊フォントで出力されると思います。

     

    2008年1月30日 14:06

すべての返信

  • すいません、実際に自分で作ったことがあるわけではないので
    アイデアレベルになりますが。

     

    フォントのインストールについて

     

    エクスプローラでFontsフォルダを参照すると、普通のファイル一覧ではなく
    「Windows Font Folder」というDLL(fontext.dll)がファイル表示部に
    組み込まれる形で起動します。

    これはフォントをファイル名ではなくフォント名で表示し、またドラッグされた場合も
    単なるファイルコピーではなく「フォントのインストール」を行います。

     

    ですからエクスプローラ経由ではなく自作コードでフォントを組み込むなら、
    fontext.dllが行っているインストール相当の処理(フォントファイルのコピー
    +レジストリへの登録でしょうか)が必要となります。

     

    とりあえず特殊な設定をしなくていいなら、コピーしたフォントの情報を

     

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

     

    に追加してやればいい、と思うんですが。

     

    ClickOnceへのファイルの添付とインストール先での保存について

     

    同梱したいファイルをリソースとしてプロジェクトのResourcesフォルダに

    追加してしまうのが一番手っ取り早いかもしれません。

     

    で、プログラムの初回起動時にByte配列として読み込んで、

    目的のフォルダへWriteAllBytesで一気に書き出してしまえば。

     

    ちょっと邪道のような気もしますが、発行でどうのと考えずに済むので楽です。

     

    懸案事項

     

    Fontsフォルダへのファイル保存は、VistaだとUACでいろいろ面倒かもしれません。

    2008年1月29日 12:26
  • まみや さん、こんにちは

    ダッチです。

     

    フォントのインストールには API の使用とレジストリ登録をしないと無理だと思います。

     

    .NET Framework のみで実現するにはプライベートフォントを使う方法があります。
    プライベートフォントとはそのアプリケーションのみで使用できるフォントのことを言います。

     

    プライベートフォントを扱うには PrivateFontCollection クラスを使用します。
    PrivateFontCollection.AddFontFile メソッドでフォントファイルを指定するだけで、
    アプリケーションで指定したフォントを使用できるようになります。

     

    MSDN に使用方法が記載されてありますので参考にしてみてください。

     

    また、私のブログで取り上げたことがありますので参考にしてみてください。

     

    2008年1月29日 13:12
  • さるべーじさん、ダッチさん、ご助言ありがとうございます。

     

    やはり、ある程度の工夫がいるということなんですね。

     

    まずはプライベートフォントを試してみようかなと思っています。

    帳票ツール(現在のところ、CrystalReportsを予定)で帳票をデザイン/実行するときに特に問題ないことを試してみたいと思います。

     

     ちなみに、プライベートフォントというものは、そこにFontを追加しておくと、Formから見ると、あたかもシステムにフォントがインストールされているように見えるというものでしょうか?

     

     たとえば、以下の様なイメージで考えているのですが、全く的外れでしょうか。

     ※ClickOnceを絡めてしまっているので例が複雑になってしまっていますが...。

     

     (前提)

     ・今回使用したい特殊フォント名は"特殊フォント"

     ・開発PCには通常どおり"特殊フォント"がインストールされている

     ・クライアントには"特殊フォント"はインストールされていない。

     

     (アプリ開発)

     ・VisualStudioでForm1上のTextBoxのFontプロパティに"特殊フォント"を選ぶ

      ※開発PCにはフォントはインストールされているので、VisualStudio上で問題なく選択できる。

     ・ClickOnceの設定で、"特殊フォント.ttf"ファイルを一般ファイル扱いで配布するようにする。

     ・↑のアプリをClickOnceでクライアントに配布

     

     (クライアント)

     ・ClickOnceでアプリを取得("特殊フォント.ttf"はEXEと同じフォルダに取り込まれる(しかしWindowsにはそのフォントをインストールできていない状態))

     ・アプリの初期化処理の中で、EXEと同じフォルダにあらかじめ取り込んでおいた"特殊フォント.ttf"をプライベートフォントコレクションに追加する。

     ・Form1をShowする。

      ⇒ Form1で使用している"特殊フォント"はクライアントにはインストールされていないが、.NetFrameworkが自動的にプライベートフォントコレクションの中も探してくれて、自動的に/透過的にプライベートフォントコレクション内の"特殊フォント"を使ってくれる。

     

     実際にプロトタイプを作って、このあたりについて試してみたいと思います。

    2008年1月30日 1:00
  •  まみや さんからの引用
    ちなみに、プライベートフォントというものは、そこにFontを追加しておくと、Formから見ると、あたかもシステムにフォントがインストールされているように見えるというものでしょうか?

    これは見えませんね。システムにインストールされているのとは別のものと考えたほうがいいです。

     

     まみや さんからの引用
    ⇒ Form1で使用している"特殊フォント"はクライアントにはインストールされていないが、.NetFrameworkが自動的にプライベートフォントコレクションの中も探してくれて、自動的に/透過的にプライベートフォントコレクション内の"特殊フォント"を使ってくれる。

    残念ながら自動的にプライベートフォントコレクションを探すようなことはしてくれません。
    なので、明示的にプライベートフォントコレクションからフォントファミリを取得して、
    それを引数にフォントを生成してやる必要があります。

     

    そして、そのフォントを CrystalReports で使用している全てのコントロールに設定してやれば
    帳票に特殊フォントで出力されると思います。

     

    2008年1月30日 14:06
  •  

    ダッチさん、さるべーじさん、ご助言ありがとうございました。

     

    今回頂いたご助言をもとに頑張ってみたいと思います。

     

    ありがとうございました!

    2008年2月1日 11:25