2009-03-02 103 views
3

我正在嘗試爲將在MSN Messenger上運行的C#應用​​程序創建文本的coloumns。我很煩惱,讓一切排隊。使用可變寬度字體創建文本列

這裏是我想要的輸出的一個例子:

1) Pizza Hut           123 Fake St. 
2) Domino's Pizza          123 Fake St. 
3) The Cheesecake Cafe         123 Fake St. 
4) Capital Pizza & Steakhouse       123 Fake St. 
5) Funky Pickle Pizza         123 Fake St. 
6) Boston Pizza           123 Fake St. 
7) Rose Bowl Rouge Lounge        123 Fake St. 
8) Royal Pizza           123 Fake St. 
9) A Columbus Pizza & Donair Inc      123 Fake St. 

但因爲它是一個可變寬度字體時,它顯示是這樣的:

1) Pizza Hut          123 Fake St. 
2) Domino's Pizza         123 Fake St. 
3) The Cheesecake Cafe         123 Fake St. 
4) Capital Pizza & Steakhouse        123 Fake St. 
5) Funky Pickle Pizza         123 Fake St. 
6) Boston Pizza          123 Fake St. 
7) Rose Bowl Rouge Lounge        123 Fake St. 
8) Royal Pizza           123 Fake St. 
9) A Columbus Pizza & Donair Inc     123 Fake St. 

我一直使用C#字符串嘗試。 PadRight()函數以及創建我自己的函數,使用空格和製表符添加填充。兩種工作都可以使用固定寬度的字體,但可以使用可變寬度的字體。

有沒有什麼辦法可以確定給定字體中字符串的寬度?

還是沒有人有任何其他建議?

回答

5

只產出表和TR/TD元素只需使用TextRenderer類。最簡單的例子:

Size size = TextRenderer.MeasureText("Hello world", someFont); 

如果您沒有訪問System.Windows.Fonts Graphics.MeasureString遺蹟,它有一定的侷限性,但應該做的工作:

Bitmap bmp = new Bitmap(1,1); 
Graphics graphics = Graphics.FromImage(bmp); 
SizeF size = graphics.MeasureString("Hello world", someFont); 

但要注意的是,如果您的文字字體和空格必須相同,否則會出現無法完美對齊文字的情況。我不知道您的情況下MSN Messenger能夠做什麼,但除非您有權訪問HTML的至少一部分,否則您將無法獲得完美的輸出結果。

您還應該知道,如果您在本地計算機上進行測量併發送給另一個,而沒有安裝正確的字體,則您的列不再像列一樣,因此您僅限於所有計算機上的字體基本子集。

如果還需要多個操作系統支持,那麼您將遇到一些大問題,因爲Mac和PC上的Arial字體看起來(和測量)完全相同。

+0

它看起來像它的一部分System.Windows.Forms命名空間,但我的應用程序實際上是一個Web服務,它返回一個連接到MSN的Windows服務。因此,當我嘗試構建我的應用程序時,無法找到System.Windows名稱空間。 任何想法如何我可以訪問此功能? – 2009-03-02 22:43:57

0

您可以嘗試使用Graphics類來測量給定特定字體的字符串的長度,然後使用它來確定要使用的標籤數量。

+0

這將是一個很好的解決方案,但是如何從Web服務訪問圖形類的實例? 我發現這個代碼解釋了它的Windows窗體應用程序: http://www.dev102.com/2008/10/09/measure-string-size-in-pixels-c/ – 2009-03-02 22:55:13

-1

你或許應該在HTML格式的一切,那麼你可以爲列

0

看起來您正試圖在單個文本字段中將其全部以ASCII格式呈現。是?如果是這樣的話,那非常棘手。看起來你現在有一個固定數量的標籤,這就是問題所在。你可以改用空格 - 我懷疑你是用padright做的(不太熟悉那個特定的函數)。

但是,關鍵的是,如果使用純ASCII,以可變寬度的字體顯示,您將永遠無法在第二列中完美排列。如果你勤奮的話,你可以接近它,但就是這樣 - 如果你有一排有大量的資本W,而另一個有很多小寫字母,那麼無論你做什麼,你都會有很大的寬度差異。如果您使用GDI進行渲染,最好的方法是每列調用一次DrawText。如果需要,您可以在每列中創建一個大字符串,然後在第一列上調用MeasureString以確定需要爲第二列移動多少空間。

或者,如果這是一個接口,你可以做html,表格或divs會很好。取決於你的環境的細節。你也可以做一些事情,比如在FlowLayout面板中有兩個自動設置高度的標籤,如果這是WinForms等等。有很多選項可以使這個工作成爲可能,但是不是純粹的可變寬度字體。

編輯:另外,我看到你問如何獲得一個Web服務中的Graphics類實例。你可以做這樣的事情:

private static Bitmap bitmap = new Bitmap(1, 1); 
    private static Graphics graphics = null; 

    public static Graphics GetGeneralGraphics() 
    { 
     if (graphics == null) 
      graphics = Graphics.FromImage(bitmap); 
     return graphics; 
    } 

你可能想使這些局部變量(當完成你妥善處理)在Web服務環境。