读 《Windows程序设计》(2)

 

“简单地说,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中不同对象的尺寸信息的函数。

你可能感兴趣的:(读 《Windows程序设计》(2))