作者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
推 welon:感謝大大的教學 01/20 03:03
推 EricTsai:推,我多年來想做不知道怎麼做的事 01/21 02:47
推 cole945:因為前一陣有試著用C#/.NET寫上B的程式~所以研究了一下:p 01/21 03:56
→ cole945:突然想到. PCMan也open了,其實可以去裡面挖他怎麼繪的~ 01/21 04:24
→ cole945:在win上~.NET還是可以找到winapi的影子~ 作法都大同小異~ 01/21 04:24