実現したいこと
趣味でC#を勉強中の者です。
作成したソフトにフォントを埋め込みたく、以下サイトを参考にして
以前はフォントの埋め込みに成功していました。
■参考にしたサイト
https://dobon.net/vb/dotnet/graphics/privatefontcollection.html
■リソースの埋め込み方
https://dobon.net/vb/dotnet/programing/vsresource.html
上記を参照して、「リソースエクスプローラー」→「新しいリソースの追加」→タイプに「ファイル」を選択→フォントファイルを選択で追加しています。
しかし以前の作成から2年ほどたってから同じ方法で新しく作成したソフトにフォントを埋め込もうとしたところ、以下のエラーが発生しています。
CS0029 暗黙的に型 'string' を 'byte[]' に変換できません
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/cs0029?f1url=%3FappId%3Droslyn%26k%3Dk(CS0029)
リソースの追加方法の仕方が間違っているのかと思い調べましたが、どう追加してもリソースの型?がstringになってしまいます。フォントをresourceに追加した際にbyte[]で持つようにする方法を教えてください。
発生している問題・分からないこと
フォントファイルをresourceに追加する際に「string」ではなく「byte[]」で持つ方法が分からない
該当のソースコード
System.Drawing.Text.PrivateFontCollection pfc; pfc = new System.Drawing.Text.PrivateFontCollection(); byte[] fontBuf = Properties.Resources.フォント名; IntPtr fontBufPtr = System.Runtime.InteropServices. Marshal.AllocCoTaskMem(fontBuf.Length); System.Runtime.InteropServices. Marshal.Copy(fontBuf, 0, fontBufPtr, fontBuf.Length); //AddFontMemResourceExを呼び出す uint cFonts; AddFontMemResourceEx(fontBuf, fontBuf.Length, IntPtr.Zero, out cFonts); pfc.AddMemoryFont(fontBufPtr, fontBuf.Length); System.Runtime.InteropServices. Marshal.FreeCoTaskMem(fontBufPtr); //バイト配列のポインターを取得する //アンセーフコードが許可されている必要がある unsafe { fixed (byte* pFontBuf = fontBuf) { //PrivateFontCollectionにフォントを追加する pfc.AddMemoryFont((IntPtr)pFontBuf, fontBuf.Length); } } foreach (Label label in this.Controls.OfType<Label>()) { フォント変更の処理 }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
リソースを埋め込む際の「タイプ」の選択を一通り試しました。
補足
特になし
あなたの回答
tips
プレビュー