2010-12-02 63 views
3

我需要做一個間距爲12.5像素X和20像素Y(PICA尺度)的網格繪製大量。字體需要是特定的尺寸,線條仍然需要一個像素厚度。目前我將這些值保存在浮點數中並將它們相乘(例如,從第3行開始的文本,第6列繪製爲座標2f * cx,5f * cy)。我想通過使用縮放變換來避免所有這些不必要的倍增,但不幸的是,這些也會影響字體大小和線條粗細。有沒有辦法避免這種情況?或者,編譯器會默默地爲我做這個,因爲cx/cy值是常量嗎?C#縮放GDI位置,但不是字體大小或線條的粗細

回答

1

編譯器應該將表達式的常量部分減少爲單個常量,但由於float的值在編譯時並不知道,所以在運行時仍然必須乘法。因此,如果c是一個常量,(1 + 2 + c)* 6 * f可以被編譯器減少到n * f。

爲防止文本縮放,最好的方法是設置縮放轉換,繪製所有不關心維護最小線寬的非文本圖形,然後在不使用轉換的情況下繪製文本。您可以使用轉換來定位文本應該開始的位置,以免自己獨立計算 - 像LPtoDP(邏輯點到設備點)這樣的函數應該能夠實現這一點。

解決此問題的另一種方法是在變換中渲染文本,但對文本大小本身應用反向縮放。所以,如果變換縮小5%,則可以將字體縮小5%。這不會給出確切的結果,但可能足夠接近視覺效果。

+0

在圖形類中是否有LPtoDP函數,還是我必須自己創建?有很多文本輸出,但我希望它儘可能快(它實際上屬於OnPaintBackground)並且方面不是1:1,所以我不認爲反向縮放會是一個不錯的選擇。 – Patrick 2010-12-07 20:25:18

+0

LPtoDP是一個Win32 GDI API函數。在.NET圖形類中可能有類似的,不確定。 – dthorpe 2010-12-07 21:10:06

6

...另外,如果您不希望縮放行,Microsoft已經爲我們留下了一些「黑客」。將線條的寬度設置爲0px,並將始終繪製單個像素厚度。