一種長文本顯示方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及汽車領(lǐng)域,尤其涉及一種長文本顯示方法。
【背景技術(shù)】
[0002]在計算機系統(tǒng)中,特別對于顯示區(qū)域較小的嵌入式系統(tǒng),常常需要在指定寬度的顯示區(qū)域內(nèi)顯示一定長度的字符串,而這個字符串的長度往會超出顯示區(qū)域的寬度;如:某個文件的文件名很長,在顯示這個文件名時,在指定的顯示區(qū)域內(nèi)無法完全顯示這個字符串。針對這個問題,目前常用的方案有兩種:(1)截斷超出指定區(qū)域的字符并添加省略號表示有部分文字被截斷,無法顯示,用戶只能閱讀到顯示出來的文字。(2)字符串自動周期性的滾動顯示,這種方式雖然能夠是用戶到所有的文字內(nèi)容,但是文字的不停滾動,特別是同一屏幕上有多個文本顯示區(qū)域的文字同時一起滾動,使得用戶眼花繚亂,從而是閱讀變得更加困難。
【發(fā)明內(nèi)容】
[0003]為了解決上述問題,本發(fā)明提供一種長文本顯示方法的設(shè)計方案。
[0004]一種長文本顯示方法,包括:鼠標消息響應(yīng)步驟,監(jiān)控鼠標操作,判斷是否需要發(fā)出重新描繪消息,由系統(tǒng)調(diào)用重畫函數(shù),對控件重新描繪。寬度可描繪字符數(shù)計算步驟:計算在fwidth的寬度上可以描繪的前η個完整字符,其中η為計算后的返回值。文字描繪步驟:根據(jù)待顯示字符信息、鼠標消息響應(yīng)單元以及寬度可描繪字符數(shù)計算單元返回的數(shù)據(jù)通過DrawText對待顯示字符進行顯示。
[0005]具體的,所述鼠標消息響應(yīng)步驟包括:(11)鼠標壓下動作記錄步驟,設(shè)置壓下標志bIsPress=True,記錄鼠標壓下時的坐標pressPos ; (12)鼠標移動動作記錄步驟,計算鼠標移動偏移量MoveOffSet =當前鼠標坐標X值currMousePos.x -鼠標壓下時的坐標X值pressPos.X ; (13)鼠標釋放動作記錄步驟,設(shè)置壓下標志為blspress = false。
[0006]更具體的,寬度可描繪字符數(shù)計算步驟包括:(21)設(shè)置臨時變量sOK為空,并使用DrawText計算完整描繪待顯示字符str所需的范圍Width ; (22)判斷Width是否小于等于可進行字符描繪的寬度fWidth,如是,則返回待顯示字符str的字符長度并退出。(23)若Width>fWidth,將待顯示字符str對半拆分成sLeft、sRight,利用DrawText計算描繪sLeft所需寬度IWidth ;(24)若lWidth>fWidth,則令str=sLeft,執(zhí)行步驟(23)否則令str=sRight,,并設(shè)置 fWidth=fWidth - lffidth, sOK=sOK+sLeft ;以上步驟中,若 sRight 或sLeft為空,則直接返回sOK的Length的值。
[0007]更具體的,所述文字描繪步驟包括:(31)判斷指定顯示區(qū)域的寬度是否能完整顯示待顯示字符;若是則直接對待顯示字符進行描繪顯示,并跳過以下步驟,否則進入步驟
(32); (32)當待顯示字符左對齊顯示時,初始化字符顯示的起始位置Pos為O ; (33)當通過鼠標對指定顯示區(qū)域進行操作時,創(chuàng)建一個寬度為等于待顯示字符寬度的臨時畫布,令臨時畫布的起始位置為-Pos,大小與指定顯示區(qū)域一致,并根據(jù)鼠標的操作,不斷調(diào)整Pos值并截取從-Pos開始寬度等于顯示區(qū)域?qū)挾鹊漠嫴紖^(qū)域,拷貝至指定顯示區(qū)域;(34)當鼠標沒有對指定顯示區(qū)域進行操作時,根據(jù)Pos值,判斷左側(cè)或右側(cè)是否有字符被截斷,在指定顯示區(qū)域的左側(cè)或右側(cè)添加省略號,計算減去省略號所占寬度后指定顯示區(qū)域剩余的可描繪寬度,描繪顯示從Pos開始的完整的字符。
[0008]進一步的,所述步驟(34)包括:(a)初始化臨時變量DStr=待顯示字符FTStr ; (b)通過寬度可描繪字符數(shù)計算步驟計算-Pos寬度可描繪的待顯示字符的前η字符個數(shù);(c)如果η>=1,截取待顯示字符FTStr從η+1起至尾部的字符串FTStr.Right,并在左側(cè)添加省略號“…”,即DStr = “...,,+FTStr.Right ;(d)使用DrawText函數(shù),計算描繪DStr所需的長度DStrWidth,若DStrWidth大于指定顯示區(qū)域的寬度Ctrl.Width,則進入步驟(e),否則進入步驟(g) ; Ce)使用DrawText函數(shù),計算描繪省略號顯示所需的寬度OmitWidth ;計算剩余寬度nWidth = Ctrl.Width-OmitWidth,并通過使用寬度可描繪字符數(shù)計算步驟計算nWidth可描繪DStr的前ml個字符DStr.Left ; (f)計算出該分支最終顯示的字符串為DStr = DStr.Left+ “…”;(g)使用寬度可描繪字符數(shù)計算步驟計算Ctrl.Width可描畫DStr的前m2個字符DStr.Left,計算出該分支最終顯示的字符串為DStr = DStr.Left。
[0009]綜上所述,本發(fā)明具有以下有益效果:(1)效率高且復(fù)雜度低,便于應(yīng)用;(2)文字隨鼠標滑動而滾動顯示的視覺效果良好,且可保證每個字符均完整顯示;(3)根據(jù)用戶的拖動動作,顯示不同部分的文字,在用戶不作操作時,靜態(tài)顯示,為用戶提供更多選擇,提高用戶體驗。
【附圖說明】
[0010]圖1為本發(fā)明所述一種長文本顯示方法的流程示意圖;
圖2為本發(fā)明所述鼠標壓下操作流程示意圖;
圖3為本發(fā)明所述鼠標移動操作流程示意圖;
圖4為本發(fā)明所述鼠標釋放操作流程示意圖;
圖5為本發(fā)明所述寬度可描繪字符數(shù)計算步驟流程示意圖。
【具體實施方式】
[0011]為了讓本領(lǐng)域的技術(shù)人員能夠更好地了解本發(fā)明的技術(shù)方案,下面結(jié)合附圖對本發(fā)明作進一步的闡述。
[0012]如圖1所示,本發(fā)明揭示了一種長文本顯示方法,包括:鼠標消息響應(yīng)步驟,寬度可描繪字符數(shù)計算步驟以及文字描繪步驟。
[0013]當進行字符描繪時,首先判斷指定顯示區(qū)域的寬度(Ctrl.Width)是否能完整顯示待顯示字符(FTStr);若是則直接對待顯示字符進行描繪顯示,并跳過以下步驟,否則繼續(xù)后續(xù)的步驟。在屏幕上描繪文字時,每個字符所需的寬度并不一致,與字符字體類型、大小有關(guān),因此可以通過DrawText獲得待顯示字符(FTWidth)的寬度。當FTWidth <= Ctrl.Width,則說明控件寬度能夠完整地描繪FTStr,可直接使用DrawText在畫布上描繪,無須考慮鼠標是否按下或拖動。否則說明控件(即指定顯示區(qū)域)寬度不足以完整描繪待顯示字符,進入后繼流程。當待顯示字符左對齊顯示時,初始化字符顯示的起始位置Pos為O。
[0014]當通過鼠標對指定顯示區(qū)域進行操作時,創(chuàng)建一個寬度為等于待顯示字符寬度的臨時畫布。
[0015]如圖2?4所示鼠標的操作可分為三種情況。在鼠標壓下時,設(shè)置壓下標志bIsPress=True,記錄鼠標壓下時的坐標pressPos。在鼠標移動時,計算鼠標移動偏移量MoveOffSet =當前鼠標坐標X值currMousePos.x -鼠標壓下時的坐標X值pressPos.X。
[0016]當Ctrl.Width- (Pos+MoveOffSet)> FTffidth時,表示字符串己滑動至最左側(cè),將無法再向左側(cè)移動,這時Pos = Ctrl.Width - FTffidth0當Pos+MoveOffSet >= O時,則表示字符串己滑動至最右側(cè),將無法再向右側(cè)移動,這時Pos = O (Pos必須小于等于O)。當字符串不是滑動至最左側(cè)或最右側(cè)時,則Pos = Pos + MoveOffset。
[0017]在鼠標釋放時,設(shè)置壓下標志為blspress = false。
[0018]因此,根據(jù)blsPress變量的值,便可得知當前鼠標是否被按下。令臨時畫布的起始位置為-Pos,大小與指定顯示區(qū)域一致,并根據(jù)鼠標的操作,不斷調(diào)整Pos值并截取從-Pos開始寬度等于顯示區(qū)域?qū)挾鹊漠嫴紖^(qū)域,拷貝至指定顯示區(qū)域。因Pos〈=0,所以臨時畫布的起始位置為-Pos,大小與控件一致,拷貝時,不需要考慮是否有單個字符只被截取一部分,這樣可以產(chǎn)生一種文字隨鼠標平滑滾動的效果