Re: [問題] 請問像BBS的雙色字
※ 引述《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
推
01/20 03:03, , 1F
01/20 03:03, 1F
推
01/21 02:47, , 2F
01/21 02:47, 2F
推
01/21 03:56, , 3F
01/21 03:56, 3F
→
01/21 04:24, , 4F
01/21 04:24, 4F
→
01/21 04:24, , 5F
01/21 04:24, 5F
討論串 (同標題文章)
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章
7
20