1. 程式人生 > >Uniscribe文字自動換行

Uniscribe文字自動換行

我們獲得了每個字形的寬度陣列piAdvances,以及這個RUN所佔用的總寬度abc。

piVdvances對應於每個字元,它取得了每個字形所佔用寬度。

如果我們以行為單位來繪製文字,我們可以以一個迴圈來取得每個RUN的寬度資訊,並一直相加,假設我們己取得了一些run的寬度和,假設這個寬度和為LineWidth.當我們再取得連結串列中下一個run的寬度(假設為lo)與這個寬度相加後超過一個行的寬度。我們假設這個run的索引為n即在連結串列中的節點順序由頭節點向後遍歷的順序為第n個。

我們可以中斷這個run即把這個run分為兩個run,所謂劃分實際上也就是把這個run的字元分為兩部分。

可以這樣實現:

hr = ScriptGetLogicalWidths(&pRun->analysis,

                                pRun->iLen,

                                cGlyphs,

                                piAdvances,

                                pClusters,

                                pVisattrs,

                                logwidths);

ScriptGetLogicalWidhts函式轉換一個指定字型的字形向前寬度為邏輯寬度。

HRESULT WINAPI ScriptGetLogicalWidths(
 const SCRIPT_ANALYSIS *psa,
 int cChars,
 int cGlyphs,
 const int *piGlyphWidth,
 const WORD *pwLogClust,
 const SCRIPT_VISATTR *psva,
 int *piDx,
);

psa

cChars

[in] 在RUN中的邏輯編碼點數量

cGlyphs

[in] 在一個RUN中的字形數量

piGlyphWidth

[in] 字形向前寬度的陣列指標

pwLogClust

[in] 邏輯Cluster的陣列指標

psva

piDx

[out] 邏輯寬度的陣列指標

可以看出這個函式的最後一個引數為輸出引數,它代表邏輯寬度的陣列。即每個字形所佔用的寬度陣列。

然後我們可以以一個迴圈來判斷具體到哪個字元時滿足不超過視窗寬度的條件。

iChars = 0;

       iWidth = 0;

       while(iChars < pRun->iLen && iWidth + logwidths[iChars] < iMaxWidth)

       {

              iWidth += logwidths[iChars];

              iChars++;

       }

pRun代表我們當前的run。iWidth代表當前run中某個字元的邏輯寬度,iMaxWidth代表視窗剩餘的寬度即剩餘了iMaxWidth的寬度,但這個寬度不足以顯示這個run.

通過上面這個迴圈,我們找到了這個字元的位置。

if(iChars < pRun->iLen )

    {

        pNewRun     = new RUN;

        *pNewRun    = *pRun;

        pRun->pNext = pNewRun;

        pRun->iLen = iChars;

        pNewRun->iLen -= iChars;

    }

我們已經劃分了這個RUN。

第二步已經完成,總結第二步,主要目的是確定一行(視窗寬度)要顯示多少個RUN,並進行相應的劃分。

相關推薦

Uniscribe文字自動

我們獲得了每個字形的寬度陣列piAdvances,以及這個RUN所佔用的總寬度abc。 piVdvances對應於每個字元,它取得了每個字形所佔用寬度。 如果我們以行為單位來繪製文字,我們可以以一個迴圈來取得每個RUN的寬度資訊,並一直相加,假設我們己取得了一些run的寬度和,假設這個寬度和為Li

C++使用Uniscribe進行文字自動的計算和渲染

Uniscribe是Windows 2000以來就存在於WinAPI中的一個庫。這個庫能夠提供給我們關於字串渲染的很多資訊,譬如說哪裡可以換行啦,渲染的時候字元的順序應該是什麼樣子啦,還有每一個字元的大小什麼的。關於Uniscribe的資料可以在http://msdn.microsoft.com/

canvas文字自動、圓角矩形畫法、生成圖片手機長按保存

UNC get 函數 odata -i 圓角 ont eight nehe canvas的文字自動換行函數封裝 // str:要繪制的字符串 // canvas:canvas對象 // initX:繪制字符

JSP中table表格中的文字自動

style="display:inline-block;width:300px;word-wrap:break-word;white-space:normal" <span></span> style樣式+span標籤 <td align="left"

對於span標籤內文字自動的屬性white-space

<span style="white-space: pre-wrap;"> 測試資料 </span> white-space -- 通過HTML文件的原始碼的排版方式控制頁面顯示文字的排版方式  取值: normal | pre | nowrap |

canvas的繪製文字自動 最簡單實現

先看下效果圖: 程式碼如下,後面解釋(小程式為例) content = "canvas的繪製文字自動換行 By Frank"; const ctx = wx.createCanvasContext('canvas'); ctx.setFontSize(1

html5-canvas的繪製文字自動

  本文介紹怎麼解決canvas繪圖過程中,drawText的換行問題,先看一個大家平時在canvas繪製文字都會遇到的問題:      一個150*100的canvas畫布,加個邊框明顯邊界 <canvas id="canvas" styl

mxGraph圖形文字自動

兩種方式。 1、直接設定預設樣式 style[mxConstants.STYLE_WHITE_SPACE]='wrap' 2、重寫mxCellRenderer.prototype.createLabel方法,將其中state.text進行更改,原來的程式碼如下

css控制文字自動

自動換行問題,正常字元的換行是比較合理的,而連續的數字和英文字元常常將容器撐大,挺讓人頭疼,下面介紹的是CSS如何實現換行的方法對於div,p等塊級元素正常文字的換行(亞洲文字和非亞洲文字)元素擁有預設的white-space:normal,當定義的寬度之後自動換行html正

WinForm系列——DataGridView單元格文字自動

DataGridView是.NET開發中常用的控制元件,在開發中發現大文字資料顯示時無法在介面上完全顯示,以下是我的解決方法。 (1)首先要保證單元格的為Text型別 (2)在程式中加入以下的程式碼片段 //設定資料來源 this.dataGridView1.

C#: WinForm系列——DataGridView單元格文字自動

DataGridView是.NET開發中常用的控制元件,在開發中發現大文字資料顯示時無法在介面上完全顯示,以下是我的解決方法。 (1)首先要保證單元格的為Text型別 (2)在程式中加入以下的程式碼片段 String str1 = "mac:192.168.0.121"; String str

iOS開發之UIlabel多文字自動自動

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

cocos2d-html5 文字自動

提醒:本文最後更新於 2025 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 某次使用 cocos2d-html5 時發現,通過 cc.LabelTTF 顯示的文字即使寬度超過了預設值,也不會自動換行。上網搜了下,很多人都遇到了同樣的問題。 之前用 cocos2d-x 的 CCLabelTTF

HTML5 canvas 文字自動

html5 的canvas 提供了多樣性的功能。 在canvas中提供了將文字作為圖片輸出到畫布上的功能,通常用到的函式主要有canvas.drawText 和canvas.fillText兩個。 以canvas.fillText()函式為例,在canvas.fillTex

[轉]C#控制元件——DataGridView單元格文字自動

DataGridView是.NET開發中常用的控制元件,在開發中發現大文字資料顯示時無法在介面上完全顯示,以下是我的解決方法。 (1)首先要保證單元格的為Text型別 (2)在程式中加入以下的程式碼片段 //設定資料來源      this.dataGridView1.DataSource = dt;  

CSS解決文字自動

1.單行文字溢位隱藏:p{ text-overflow: ellipsis;//必須 white-space: nowrap;//必須 overflow: hidden;//必須 }2.多行文字溢位隱藏:  (只適用移動端和 chrome)p{word-break: brea

WPF控制元件TextBlock中文字自動

在很多的WPF專案中,往往為了追求介面的美觀,需要控制控制元件中文字的換行顯示,現對TextBlock控制元件換行的實現方式進行總結,希望大家多多拍磚!!! 1.使用轉義字元 在XAML檔案中,實現方式如下: <TextBlock x:Name="textBlock

CDC:DrawText多顯示文字的問題(文字自動)

引數:     hdc:裝置環境控制代碼。     lpString:指向將被寫入的字串的指標,如果引數nCount是C1,則字串必須是以\0結束的。     如果uFormat包含DT_MODIFYSTRING,則函式可為此字串增加4個字元,存放字串的緩衝區必須足夠大,能容納附加的字元。     nCoun

IE7瀏覽器float:left li標籤文字自動

Li標籤Float:left在做網頁側欄的一些tags的時候,是一種很好的選擇。不過在中文字元上,可能會出現一點小問題,先看一張IE7和IE8下的效果圖吧:   看起來的確狠蛋疼,在標準瀏覽器中是不會出現上圖IE7的效果的。先看下程式碼結構 <style>

iReport文字自動設定

1、  選中要自動換行的text框,勾選中屬性面板中的“StretchWith Overflow”屬性 2、  選中該欄位所在行的所有欄位(包括行頭),在“屬性”面板中將“Stretch Type”設定為“Relative to Tallest Object”