作者cole945 (躂躂..)
看板C_Sharp
标题Re: [问题] 请问像BBS的双色字
时间Thu Jan 18 19:06:47 2007
※ 引述《welon (小龙)》之铭言:
: 像BBS的双色字 有没有人写过?
: 如果用C#写的话,好像不太好写
纯粹就是一个字绘两次~
一次绘左边, 一次绘右边~
在 .NET 最简单的绘法就是用 Graphics.DrawString
在 .NET 2.0 後有 TextRenderer.DrawText 可以绘~
不然也可以直些用 win32的 ExtTextOut 来绘~
以速度来说, ExtTextOut 最快, DrawString 次之, DrawText 很慢..
我自己测出来的速度大概是 ExtTextOut 比 DrawString略快,
而DrawText大约要前者10倍以上的速度~
虽然说 DrawString 是用 GDI+(userspace) 而 DrawText 是用GDI(kernelspace)
但是测出来效果就是 DrawText慢很多 :X
但在画双色字时, DrawText 的比较容易实作, DrawString最麻烦..
双色绘图上比较麻烦的地方是, 如何算出(或去除) 字四周的padding,
绘上一个字时会像下图这样, 字和四周会留有 padding,
字并不会刚刚好绘在 (x,y) 上, 而是有一个小位移..
┌─┐
│字│
└─┘
所以若也画上底色时, 字和底便不会在同一个位置上~
1. ExtTextOut 的画法
利用 CONST RECT* lprc 参数指定有效区块, 一次画右一次画左
加上 ETO_CLIPPED 参数, 这样就不会不留padding
╴
▕字▏
▔
2. TextRender.DrawText
在 TextFormatFlags 参数加上 NoPadding 去边(印像是这个参数) 即可~
当然也是要画两次
3. DrawString
似乎没办法不加Padding, 所以自己算出padding的大小,
画字时自己位移~
我用以下的方式算出 padding 大小,
private PointF GetCharPadding(Font font, Graphics g)
{
string message = "A";
CharacterRange[] ranges =
new CharacterRange[] { new CharacterRange(0, 1) };
StringFormat sf = new StringFormat();
sf.SetMeasurableCharacterRanges(ranges);
Rectangle displayRectangle = new Rectangle(0, 0, 100, 100);
RectangleF displayRectangleF = (RectangleF)displayRectangle;
Region[] charRegion =
g.MeasureCharacterRanges(message, font, displayRectangleF, sf);
RectangleF rf = charRegion[0].GetBounds(g);
return new PointF(rf.X, rf.Y);
}
其实只要在改变字型时算padding算一次就够了..
这样应该就可以了
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.139.132.224
1F:推 welon:感谢大大的教学 01/20 03:03
2F:推 EricTsai:推,我多年来想做不知道怎麽做的事 01/21 02:47
3F:推 cole945:因为前一阵有试着用C#/.NET写上B的程式~所以研究了一下:p 01/21 03:56
4F:→ cole945:突然想到. PCMan也open了,其实可以去里面挖他怎麽绘的~ 01/21 04:24
5F:→ cole945:在win上~.NET还是可以找到winapi的影子~ 作法都大同小异~ 01/21 04:24