wsprintf
参数数组的指针
标准版
vsprintf
vswprintf
_vstprintf
最大长度版
_vsnprintf
_vsnwprintf
_vsntprintf
Windows版
wvsprintfA
wvsprintfW
wvsprintf
在宽字符版的sprintf函数中,将字符串缓冲区定义为宽字符串。在宽字符版的所有这些函数中,格式字符串必须是宽字符串。不过,您必须确保传递给这些函数的其它字符串也必须由宽字符组成。
格式化消息框
程序2-1所示的SCRNSIZE程序展示了如何实作MessageBoxPrintf函数,该函数有许多参数并能像printf那样编排它们的格式。
程序2-1 SCRNSIZE
SCRNSIZE.C
/*---------------------------------------------------------------------------
SCRNSIZE.C -- Displays screen size in a message box
© 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中不同对象的尺寸信息的函数。事实上,我将在第四章用GetSystemMetrics函数向您展示如何在一个Windows窗口中显示和滚动多行文字。
本书与国际化
为国际市场准备的Windows程序不光要使用Unicode。国际化超出了本书的范围,但在Nadine Kano所写的《Developing International Software for Windows 95 and Windows NT》(Microsoft Press,1995年)一书中涉猎了许多。
本书中的程序写作时被限制成既可使用也可不使用定义的UNICODE标识符来编译。这包括对所有字符和字符串定义使用TCHAR,对字符串文字使用TEXT宏,以及注意不要混淆字节和字符。例如,注意SCRNSIZE中的 _vsntprintf呼叫。第二个参数是缓冲区的字符大小。通常,您使用sizeof (szBuffer)。但如果缓冲区中有宽字符,则返回的不是缓冲区的字符长度,而是缓冲区的字节大小。您必须用sizeof(TCHAR)将其分开。
通常,在Visual C++ Developer Studio中,可使用两种不同的设定来编译程序:Debug和Release。为简便起见,对本书的范例程序,我已修改了Debug设定,以便于定义UNICODE标识符。如果程序使用了需要字符串作参数的C链接库函数,那么_UNICODE标识符也在Debug设定中定义(要了解这是在哪里完成的,请从「Project」菜单中选择「Settings」,然后单击「C/C++」标签)。使用这种方式,这些程序就可以方便地被重新编译和连结以供测试。
本书中所有程序-无论是否为Unicode编译-都可以在Windows NT下执行。只有极少数情况例外。本书中按Unicode编译的程序不能在Windows 98中执行,而非Unicode版则可以。本章和第一章的程序就是两个特例。MessageBoxW是Windows 98支持的少数宽字符Windows函数之一。在SCRNSIZE.C中,如果用Windows函数wprintf代替了_vsntprintf(您还必须删除该函数的第二个参数),那么SCRNSIZE.C的Unicode版将不能在Windows 98下执行,这是因为Windows 98不支持wprintfW。
在本书的后面(特别在第六章,介绍键盘的使用时),我们将看到,编写能处理远东版Windows双字符集的Windows程序不是一件容易的事情。本书没有说明如何去做,并且基于这个原因,本书中的某些非Unicode版本的程序在远东版的Windows下不能正常执行。这也是Unicode对将来的程序设计如此重要的一条理由。Unicode允许程序更容易地跨越国界。