获取屏幕分辨率:
/*----------------------------------------------------- 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 ; }
|
从程序的功能来看,上述API函数调用以及执行流程都不难,但和一般常用的消息框函数又不同,而分析MessageBoxPrintf的功能时,是否对va_list va_start这几个宏感到陌生;下面我们来看看在MSDN中的定义
The va_arg, va_end, and va_start macros provide a portable way to access the arguments to a function when the function takes a variable number of arguments. Two versions of the macros are available: The macros defined in STDARG.H conform to the ANSI C standard, and the macros defined in VARARGS.H are compatible with the UNIX System V definition. The macros are:
va_alist
Name of parameter to called function (UNIX version only)
va_arg
Macro to retrieve current argument
va_dcl
Declaration of va_alist (UNIX version only)
va_end
Macro to reset arg_ptr
va_list
typedef for pointer to list of arguments defined in STDIO.H
typedef struct {
char *a0; /* pointer to first homed integer argument */
int offset; /* byte offset of next parameter */
} va_list;
va_start
Macro to set arg_ptr to beginning of list of optional arguments (UNIX version only)
下面给出这几个宏的一个例子:
/* VA.C: The program below illustrates passing a variable * number of arguments using the following macros: * va_start va_arg va_end * va_list va_dcl (UNIX only) */
#include <stdio.h> #define ANSI /* Comment out for UNIX version */ #ifdef ANSI /* ANSI compatible version */ #include <stdarg.h> int average( int first, ... ); #else /* UNIX compatible version */ #include <varargs.h> int average( va_list ); #endif
void main( void ) { /* Call with 3 integers (-1 is used as terminator). */ printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );
/* Call with 4 integers. */ printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );
/* Call with just -1 terminator. */ printf( "Average is: %d\n", average( -1 ) ); }
/* Returns the average of a variable list of integers. */ #ifdef ANSI /* ANSI compatible version */ int average( int first, ... ) { int count = 0, sum = 0, i = first; va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */ while( i != -1 ) { sum += i; count++; i = va_arg( marker, int); } va_end( marker ); /* Reset variable arguments. */ return( sum ? (sum / count) : 0 ); } #else /* UNIX compatible version must use old-style definition. */ int average( va_alist ) va_dcl { int i, count, sum; va_list marker;
va_start( marker ); /* Initialize variable arguments. */ for( sum = count = 0; (i = va_arg( marker, int)) != -1; count++ ) sum += i; va_end( marker ); /* Reset variable arguments. */ return( sum ? (sum / count) : 0 ); } #endif
|
The va_arg, va_end, and va_start macros provide access to function arguments when the number of arguments is variable. These macros are defined in STDARG.H for ANSI C compatibility, and in VARARGS.H for compatibility with UNIX System V.
Argument-Access Macros
Macro |
Use |
|
Retrieve argument from list 从参数表中检索参数 |
|
Reset pointer 重置指针 |
|
Set pointer to beginning of argument list 设置一指针指向参数的起始位置 |
当函数的参数数目为变量时,使用这三个宏(va_arg,
va_end, 和
va_start )来获取函数的参数;
阅读(1904) | 评论(0) | 转发(0) |