lihong557

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

可能WPF太耀眼了,大家都一直在讨论它的光芒,我也是其中的一员。

当发现它给软件界面设计带来的革命性变化时,说服同事,在新项目中使用了WPF这一新技术。

无奈,项目快结束时,头头验收时说字体模糊,不能接受,只好认真对待了。

没有彻底解决,但是在很多情况下可以使用,可以解燃眉之急。

症状:比较WPF项目和WinForm下字体显示效果,WPF下文字很模糊。特别是“宋体”,简直一团糟,换了别的字体稍微好一点,但是还是无法接受,被大家推崇为最佳解决方案的“微软雅黑”也无济于事(有可能是我机器的原因)。

问题分析:字体较WinForm下模糊,是因为WPF下和WinForm使用的绘制文字引擎不一样,感觉有点矢量文字的意思,进行了模糊处理,特别是文字较小时,表现很糟糕。

解决办法:使用WinFowm下Graphics进行绘制文字到Bitmap上,然后把Bitmap转换成WPF下面的ImageSource,然后再采用DrawingContextDrawImage(。。。)方法进行绘制图片即可。

核心代码如下:

 

protected override void OnRender(DrawingContext drawingContext)
        {
            //base.OnRender(drawingContext);

            try
            {
                System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(txtSize.Width, txtSize.Height);
                System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap);

                graphics.DrawString(Text, txtFont, TransBrush(this.Foreground), new System.Drawing.PointF(0,0));

                ImageSource imageSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                    bitmap.GetHbitmap(),
                IntPtr.Zero,
                System.Windows.Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());

                drawingContext.DrawImage(imageSource, new Rect(0, 0, bitmap.Width, bitmap.Height));

            }
            catch { }
        }

源代码如下:

源代码下载

源码里面有缺陷:最让我头疼的是外围容器的宽度会影响字体的清晰度,具体就是差一个像素。比如例子中Window的宽度设为300,就不清晰,有重影,如果设为301,就好了,跟WinForm是一样的。原因没有找到,猜想是WPF和WinForm之间像素坐标系统有差别有关,具体由于工作忙,就没有细究,凑合着使用了。如果有解决方案,望大家共享,呵呵,还是那样,祝大家好运,在编程中享受乐趣。

 

上午发了一个关于WPF中显示动画图片(如。gif图片)的例子,有些跟帖的说不详细,如果有时间我再整理吧,如果真的能用的上,自己看一下应该能懂。稍微有点复杂,呵呵。重新把链接贴出来,有需要的看一下吧,欢迎沟通。

 

WPF:暂时解决播放gif动画图片问题 

 

posted on 2008-09-23 15:22  抛物线  阅读(7075)  评论(9)    收藏  举报