2011-05-01 35 views
4

所以我可以讓drawtext斷開一個字符串,如果字符串有空格,或者如果我把\ r \ n放在字符串的末尾。但是,一個沒有空格或換行符的長字符串會延續到繪圖矩形的後面並被裁剪。如果可能的話,我想阻止這一點。使DrawText斷開一個字符串

沒有什麼格式標誌的drawtext突出了我,這將使這種情況發生。有任何想法嗎?

+0

這很簡單:不要懶惰。發佈該代碼片段本應該是毫不費力的。 – 2011-05-01 23:47:13

+2

也許你不明白這個問題?我不是在討論現有的代碼片段。我在問如何在文本中沒有空格的情況下,當drawtext函數打算走出繪圖矩形之外時,如何讓drawtext函數分割一行文本。 – Gogeta70 2011-05-02 03:16:18

回答

5

你會正常做的是使用DT_WORDBREAK標誌。從DrawText documentation on MSDN,這個:

打破單詞。如果一個單詞 延伸超過由lpRect參數指定的矩形 的邊緣,則行之間會自動斷開 。 A 回車換行序列 也打破了界限。

如果未指定,則輸出爲 一行。

但是,你有一個單牢不可破線 - 也就是說,沒有言語。 你需要自己照顧休息時間。可以解決這個問題有兩種方式:

  • 使用DrawTextDT_CALCRECT計算矩形的大小 - 循環,縮短您的字符串,直到你找到的第一行中的字符串,然後重複剩餘串。也就是說,找到索引0-n的子集,這個索引在繪圖區域的寬度上水平放置;從n + 1-m找到再次水平放置的字符串;重複,直到你擊中你的字符串的末尾。將這些子串與\r\n連接在一起以強制手動中斷,然後使用DrawText進行繪製,並且它將正確包裝。

  • 使用DrawTextEx並傳入指向DRAWTEXTPARAMS結構的指針。它有一個uiLengthDrawn成員,它是「DrawTextEx處理的字符數,包括空白字符,數字可以是字符串的長度或者位於繪圖區下方的第一行的索引。」你應該不是通過DT_NOCLIP。這可能(沒有測試它)會給你提供與沒有循環的第一種方法相同的信息:讓我不確定的關鍵是在繪圖區域「下面」的短語,並且如果你的線是牢不可破的,它可能會認爲它處理了整個文本。

第一種方法將始終工作,並且是我用於我自己的富文本處理的簡單版本。

+0

謝謝你,我明白了。^_^ – Gogeta70 2011-05-04 02:16:32

+0

你用什麼方法? – 2011-05-05 06:33:39

+2

我有一個字符串中每個字符的COLORREF值的數組。我遍歷字符串並檢查每個字符的顏色,直到找到與最後一個字符顏色不同的字符,或者直到字符串的寬度(GetTextExtentPoint32)超過了要繪製的區域的寬度,然後使用drawtext繪製字符串。它就像一個魅力^ _^ – Gogeta70 2011-05-06 02:35:30

6

其實,這是你在大多數情況下想要的東西,從MSDN

DT_EDITCONTROL

直接複製多行編輯 控制的文本顯示特性。具體而言,平均字符寬度的計算方式與 中編輯控件的方式相同,並且函數不會顯示 部分可見的最後一行。

它沒有提及的是,如果需要,它也會在中間打破單詞,就像編輯控件一樣。它具有不顯示部分可見底線的其他效果,但在大多數用法中,我不認爲這很重要,因爲您可能提前使用DT_CALCRECT以確保您有足夠的空間(如果不是,不會繪製部分無論如何,可見的線路可能是最好的)。如果它真的很重要,那麼你總是可以使用裁剪來做些事情,比如給DrawText一個更高的矩形,但是已經在設備上下文中設置了一個更小的剪輯矩形。

+0

我可以確認'DT_EDITCONTROL'和'DT_WORDBREAK'一起將包裹,不管空格,所以IMO這是(最)正確的答案。 – SpeedFreak 2014-09-17 12:12:39

相關問題