2010-08-25 97 views
5

我正在開發一個.net 3.5 Win Forms程序,我遇到了一個「有趣」的文本繪圖問題。.net DrawString/StringFormat問題

我正在實現一個文本編輯控件,它使用DrawString()和StringFormat.GenericTypographic(從此以後,GT)繪製文本。當用戶鍵入時,該行中較早的整個單詞(或一組單詞)隨機左右微妙地移動。

看起來很可能是四捨五入錯誤 - 受影響的塊看起來會在字符添加到行的末尾時在水平面中移動一個像素。如果我使用StringFormat.GenericDefault(GD),這不會發生,但字符渲染不準確,這是不可接受的。

我推斷我可以慢慢地將GD變成GT(每個設置在MSDN中討論,顯然可以在調試器中檢查),並查看哪些FormatFlags或其他設置導致了這種情況。但是,如果我拿一份GD的副本,改變所有的屬性,使它與GT完全相同,那麼角色的位置就會大不相同 - 這兩個被認爲是相同的對象的行爲顯然是不一樣的。

像太多事情恕我直言,.net反射器顯示StringFormat只是一個非託管對象的包裝,我只能假設並非所有的屬性都暴露給.net軟件。

任何人都可以提出任何可以幫助我的建議嗎?我知道TextRenderer可能爲渲染提供了一種替代方法,但是我在設計過程中早些時候對其進行了折扣(儘管我實際上不記得現在的問題是什麼......)。

編輯

我使用的渲染代碼如下:

sForm = new StringFormat(StringFormat.GenericTypographic); 
sForm.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces; 

using (SolidBrush brush = new SolidBrush(frmt.ForegroundColour)) 
    context.DrawString(line.Text, frmt.DisplayFont, brush, new PointF(horizontal, height), sForm); 
+0

你使用MeasureString()?通過該呼叫顯示一個片段。 – 2010-08-25 11:21:04

+1

我不在這裏使用MeasureString() - 我編輯了答案來顯示我在做什麼。 – 2010-08-25 11:36:33

回答

0

好了,我已經解決了這個問題。這不是我想要做的方式,但作爲參考,我做了這樣的:

我已經有代碼來計算每個單詞的邊界框(用於在控制單擊時計算插入位置並顯示合理的文字),所以我不是一口氣繪製整條線,而是單獨繪製每個單詞。

爲每個單詞連續呼叫DrawString()似乎很浪費(當它可以一次處理整個多行塊時),但程序仍然非常快。

現在,如果我能明白爲什麼它似乎要改變,因爲這個詞的增長在單詞中的各個字母字距...