C# System.Drawing.Text.AddMemoryFont 内存字体

jiaanv6 2012-05-24 08:38:16
PrivateFontCollection pfc = new PrivateFontCollection();

string NameSpc = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name.ToString();

Stream stmFont = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(NameSpc + ".AN.TTF");
if (null != stmFont)
{

byte[] rgbyt = new Byte[stmFont.Length];

stmFont.Read(rgbyt, 0, rgbyt.Length);

IntPtr pbyt = Marshal.AllocCoTaskMem(rgbyt.Length);

if (null != pbyt)
{

Marshal.Copy(rgbyt, 0, pbyt, rgbyt.Length);

pfc.AddMemoryFont(pbyt, rgbyt.Length);

Marshal.FreeCoTaskMem(pbyt);

}

}
Font f = new Font(pfc.Families[0], 15, FontStyle.Bold);
//设置字体
foreach (Control labb in this.Controls)
{
if (labb is Label)
{
labb.Font = f;
((Label)labb).UseCompatibleTextRendering = true;
}
}
字样就实现内存字体显示
不过就有一些异常问题,就是说:

尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

这样字眼的问题,经多次调试发现原来是UseCompatibleTextRendering = true;
的原因。。。。。

请问各位高人,还有其它方法帮我实现“字体”从内存里读取吗?或者有更好的方法来处理UseCompatibleTextRendering = true; 所出显的异常。。。。。
...全文
591 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiaanv6 2012-05-28
  • 打赏
  • 举报
回复
问题自己解决了,先要谢谢cnfixit一直的帮助 ,原因是出自byte[] rgbyt = new Byte[stmFont.Length];

这句是另自定义了一个内存,系统会保护好它,当内存变动就会影响它,所以不能用byte[] rgbyt 要直接使用资源地址就无事了
cnfixit 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

Marshal.FreeCoTaskMem(pbyt);这句注释了也不行

我改为路径来加载字体
pfc.AddFontFile("AN.TTF");
Font f = new Font(pfc.Families[0], 15, FontStyle.Bold);
//设置字体
foreach (Control labb in this.Controls)
{
if……
[/Quote]

这个就不好说了,msdn上说有些控件是不支持这种方法,你换换控件看看呢
ONE-PIECE 2012-05-25
  • 打赏
  • 举报
回复
是不是电脑上没这种字体???
jiaanv6 2012-05-25
  • 打赏
  • 举报
回复
Marshal.FreeCoTaskMem(pbyt);这句注释了也不行

我改为路径来加载字体
pfc.AddFontFile("AN.TTF");
Font f = new Font(pfc.Families[0], 15, FontStyle.Bold);
//设置字体
foreach (Control labb in this.Controls)
{
if (labb is Label)
{
labb.Font = f;
((Label)labb).UseCompatibleTextRendering = true;
}
}
同时也出显哪种文题

无用字体程序里直接设为Application.SetCompatibleTextRenderingDefault(true);

发现同样问题
想了一下,程序之所以设为Application.SetCompatibleTextRenderingDefault(false);

是为了不给这样的问题发生,上网查了一下,每个人都说Application.SetCompatibleTextRenderingDefault(true);
只能看,不能用,也就是说好看不好用,一控件使用的话就出问题。。。。。。。
cnfixit 2012-05-25
  • 打赏
  • 举报
回复
出新状况了?
Marshal.FreeCoTaskMem(pbyt);这句注释了看看怎么样
jiaanv6 2012-05-25
  • 打赏
  • 举报
回复
就是有点不明,pfc.AddFontFile("AN.TTF");
不用GDI+就可以做到
而pfc.AddMemoryFont(pbyt, rgbyt.Length);
要用到GDI+才可实现。其中AddMemoryFont一定有其它方法,看来要看看pfc.AddFontFile("AN.TTF");
的运行步骤了。。。。。按道理AddFontFile应是从路径加载文件到内存里,然后应用到程序显示
而AddMemoryFont是已加载内存里,直接运用到程序。而现在AddMemoryFont加载显示不出,一定在AddFontFile应有的显示功能而AddMemoryFont少了一些东西。
现本人想用API来实现一下,有哪位高人指点一下

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧