讀 《Windows程式設計》(2)

來源:互聯網
上載者:User

 

“簡單地說,Unicode擴充自ASCII字元集。在嚴格的ASCII中,每個字元用7位表示,或者電腦上普遍使用的每字元有8位寬;而Unicode使用全16位字元集。這使得Unicode能夠表示世界上所有的書寫語言中可能用於電腦通訊的字元、表意字元和其它符號。”

“Unicode影響到了電腦工業的每個部分,但也許會對作業系統和程式設計語言的影響最大。從這方面來看,我們已經上路了。Windows NT從底層支援Unicode(不幸的是,Windows 98隻是小部分支援Unicode)。”

“先天即被ANSI束縛的C程式設計語言通過對寬字元集的支援來支援Unicode。”

“DBCS從256代碼開始,就像ASCII一樣。與任何行為良好的字碼頁一樣,最初的128個代碼是ASCII。然而,較高的128個代碼中的某些總是跟隨著第二個位元組。這兩個位元組一起(稱作首位元組和跟隨位元組)定義一個字元,通常是一個複雜的表意字元。”

“明白Unicode和DBCS之間的區別很重要。Unicode使用(特別在C程式設計語言環境裡)「寬字元集」。「Unicode中的每個字元都是16位寬而不是8位寬。」在Unicode中,沒有單單使用8位元值的意義存在。相比之下,在雙位元組字元集中我們仍然處理8位元值。有些位元組自身定義字元,而某些位元組則顯示需要和另一個位元組共同定義一個字元。”

“使用Unicode也有缺點。第一點也是最主要的一點是,程式中的每個字串都將佔用兩倍的儲存空間。此外,您將發現寬字元執行時期連結庫中的函數比常規的函數大。出於這個原因,您也許想建立兩個版本的程式-一個處理ASCII字串,另一個處理Unicode字串。最好的解決辦法是維護既能按ASCII編譯又能按Unicode編譯的單一原始碼檔案。”

“Windows NT從底層支援Unicode。這意味著Windows NT內部使用由16位字元組成的字串。因為世界上其它許多地方還不使用16位字串,所以Windows NT必須經常將字串在作業系統內轉換。Windows NT可執行為ASCII、Unicode或者ASCII和Unicode混合編寫的程式。即,Windows NT支援不同的API函數呼叫,這些函數接受8位或16位的字串。”

 

/*---------------------------------------------------------------------------       
    SCRNSIZE.C -- Displays screen size in a message box       
                 (c) Charles Petzold, 1998       
----------------------------------------------------------------------------*/       
#include <windows.h>       
#include <tchar.h>          
#include <stdio.h>
       
int CDECL MessageBoxPrintf (TCHAR * szCaption, TCHAR * szFormat, ...)       
{       
    TCHAR   szBuffer [1024] ;       
    va_list pArgList ; 

    // The va_start macro (defined in STDARG.H) is usually equivalent to:       
    // pArgList = (char *) &szFormat + sizeof (szFormat) ;      

    va_start (pArgList, szFormat) ;       

    // The last argument to wvsprintf points to the arguments       

    _vsntprintf ( szBuffer, sizeof (szBuffer) / sizeof (TCHAR),       
                   szFormat, pArgList) ;
       

    // The va_end macro just zeroes out pArgList for no good reason       
    va_end (pArgList) ;       
    return MessageBox (NULL, szBuffer, szCaption, 0) ;       
}
       
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,       
                   PSTR szCmdLine, int iCmdShow)       
{       
    int cxScreen, cyScreen ;       
    cxScreen = GetSystemMetrics (SM_CXSCREEN) ;       
    cyScreen = GetSystemMetrics (SM_CYSCREEN) ;   

    MessageBoxPrintf (    TEXT ("ScrnSize"),       
                   TEXT ("The screen is %i pixels wide by %i pixels high."),cxScreen, cyScreen) ;       
    return 0 ;   
}

經由從GetSystemMetrics函數得到的資訊,該程式以圖素為單位顯示了視訊顯示的寬度和高度。GetSystemMetrics是一個能用來獲得Windows中不同對象的尺寸資訊的函數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.