《Windows程式設計》讀書筆記------------->>文字輸出——多行文字<<

來源:互聯網
上載者:User

    因為TextOut是不能使用/n進行多行輸出的,它的每一個行的位置都是由座標決定的,所以要實現多行輸出就要自己算每行的位置,所以就要知道每行的高度(在不考慮會超出右邊界的情況下)。
   
    程式取得行高的方法是從hdc控制代碼中得到每個字的高度。使用函數如下: GetTextMetrics (hdc,  & tm) ;

    tm是一個TEXTMETRIC結構,需要自己定義。調用這個函數需要hdc控制代碼而計算行高之類的操作一般在程式建立的時候進行,所以用GetDC取得控制代碼。
   
    TEXTMETRIC之中包含來很多資訊,不過不用擔心記不住,在VC++中,當輸入完tm.之後,後面的所有屬性都會顯示出來,只要記得前面幾個字母就可以立即輸入完畢了。這個也是VC++看起來很難,要記的東西很多的原因吧:)有用的有這麼幾個:     typedef  struct  tagTEXTMETRIC
        
{
        
    LONG tmHeight ;                     // 文字高度
        
    LONG tmAscent ;                     // 文字上部高度
        
    LONG tmDescent ;                 // 文字下部高度
        
    LONG tmInternalLeading ;         // 重音符號出現的地方
        
    LONG tmExternalLeading ;         // 行間距
        
    LONG tmAveCharWidth ;             // 文字平均寬度
        
   LONG tmMaxCharWidth ;
        
           其它結構欄位
        
}
        
TEXTMETRIC,  *  PTEXTMETRIC ;

只要對照這張圖看看就知道了,上面標註了一個字母各個部分的高度是怎麼劃分的:
>文字輸出——多行文字

      另外,大寫字母寬度一般是tmAveCharWidth的1.5倍。所以文字寬度一般就是tmAveCharWidth,高度就是tmHeight+tmExternalLeading

      所以,一般的初始化代碼就是這樣的(來自MSDN[Platform SDK>MSDN Library>使用者介面的設計和開發>Windows Controls>Individual Control Information>Scroll Bars>Using Scroll Bars]的樣本)      case  WM_CREATE : 
         //  Get the handle to the client area's device context. 
        hdc  =  GetDC (hwnd); 
 
         //  Extract font dimensions from the text metrics. 
        GetTextMetrics (hdc,  & tm); 
        xChar  =  tm.tmAveCharWidth; 
        xUpper  =  (tm.tmPitchAndFamily  &   1   ?   3  :  2 )  *  xChar / 2 ; 
        yChar  =  tm.tmHeight  +  tm.tmExternalLeading; 
 
         //  Free the device context. 
        ReleaseDC (hwnd, hdc); 
 
         //  Set an arbitrary maximum width for client area. 
         //  (xClientMax is the sum of the widths of 48 average 
         //  lowercase letters and 12 uppercase letters.) 
        xClientMax  =   48   *  xChar  +   12   *  xUpper; 
 
         return   0 ; 

MSDN地址:ms-help://MS.MSDNQTR.2003FEB.2052/shellcc/platform/commctls/scrollbars/usingscrollbars.htm

然後,每一行就是這樣子的: TextOut (hdc, x * xChar, y * yChar, szBuffer,wsprintf (szBuffer, TEXT ( " 什麼什麼什麼 " )));

x,y是指第x各字元和第y行。使用wsprintf函數的好處是,它的傳回值就是字串的長度,而且在裡面用了TEXT就可以使用%i之類的東東進行格式化了。說白了wsprintf就是在預格式化到了szBuffer這個緩衝區。不過記得先定義szBuffer就是了(TCHAR szBuffer [40] ;)


-----------------------------------------------------------
好了,終於可以動手了,這回要弄點東西進行輸出了:

顯示可以從GetSystemMetrics呼叫中取得的資訊。這個函數時這麼用的:

GetSystemMetrics (「索引」),所謂的索引呢,就是一個整數,告訴這個函數我們要知道什麼。因為這個函數索引眾多(廢話,不多怎麼練習我們的多行輸出),所以定義了一個.h的檔案,直接調用這個結構就可以了。具體程式就不列出來了,書上有,建議除了SYSMETS.H外,其他部分自己寫(注意書上的有點小錯誤哦)


下面是這個樣本的工程打包(其實就是昨天那個,把那個MessageBox函數去掉就行了):

http://dl2.csdn.net/down4/20070706/06104222215.rar

>文字輸出——多行文字 到這裡你會發現有些東西沒有顯示出來。這就要用到捲軸了。。。。。。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.