Re: [問題] 請問像BBS的雙色字

看板C_Sharp (C#)作者 (躂躂..)時間18年前 (2007/01/18 19:06), 編輯推噓3(302)
留言5則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《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
因為前一陣有試著用C#/.NET寫上B的程式~所以研究了一下:p
01/21 03:56, 3F

01/21 04:24, , 4F
突然想到. PCMan也open了,其實可以去裡面挖他怎麼繪的~
01/21 04:24, 4F

01/21 04:24, , 5F
在win上~.NET還是可以找到winapi的影子~ 作法都大同小異~
01/21 04:24, 5F
文章代碼(AID): #15hrJ8V0 (C_Sharp)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #15hrJ8V0 (C_Sharp)