windows程序设计(二)

来源:互联网 发布:项目 书籍 商务 知乎 编辑:程序博客网 时间:2024/05/16 18:54

本期,我们来通过对话框来显示自己的屏幕水平和竖直方向上的分辨率。

先给大家看看主要代码吧:

#include<Windows.h>
#include<tchar.h>
#include<stdio.h>

//CDECL  是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,
//这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,
//甚至完全不同的参数都不会产生编译阶段的错误。
int CDECL MessageBoxPrintf(TCHAR *szCaption,TCHAR *szFormat,...)  //capton标题;format版本、格式
{
TCHAR szBuffer[1024];
va_list pArgList;
va_start(pArgList,szFormat);
_vsntprintf_s(szBuffer,sizeof(szBuffer)/sizeof(TCHAR),
szFormat,pArgList);//将可变参数格式化输出到一个字符数组。

//_vsntprintf_s用法类似于vsprintf,不过加了sizeof(szBuffer)的限制,防止了内存溢出(sizeof(szBuffer)为szBuffer所指的存储空间的大小)。
//返回值:执行成功,返回写入到字符数组szBuffer中的字符个数(不包含终止符),最大不超过size;执行失败,返回负值,并置errno.
//sizeof():返回一个对象或类型名的长度,长度单位是字节
va_end(pArgList);
return MessageBox(NULL,szBuffer,szCaption,0);
}
//VA_LIST的用法:(可变参数的函数)
//(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;
//(2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,使其指向第一个可
//变参数的地址;
//(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数
//的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);
//(4)最后用VA_END宏结束可变参数的获取。使用VA_LIST应该注意的问题:
//  (1、可变参数的类型和个数完全由程序代码控制,它并不能智能地识别不同参数的个数和类型;
//  (2、如果我们不需要一一详解每个参数,只需要将可变列表拷贝至某个缓冲,可用vsprintf函数;
//  (3、因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利.不利于我们写出高质量的代码;
//小结:可变参数的函数原理其实很简单,而VA系列是以宏定义来定义的,实现跟堆栈相关。我们写一个可变参数的C函数时,有利也有弊,所以在不必要的场合,我们无需用

//到可变参数,如果在C++里,我们应该利用C++多态性来实现可变参数的功能,尽量避免用C语言的方式来实现。


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
  PSTR szCmdLine,int iCmdShow)
{
int cxScreen,cyScreen;
cxScreen=GetSystemMetrics(SM_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;
}

截图结果为:


附:

为了验证_vsntprintf_s返回值是写入到字符数组szBuffer中的字符个数(不包含终止符),我们声明两个变量啊a和b,将MessageBoxPrintf函数代码修改为:

int CDECL MessageBoxPrintf(TCHAR *szCaption,TCHAR *szFormat,...)//capton标题;format版本、格式
{
TCHAR szBuffer[1024];
va_list pArgList;
va_start(pArgList,szFormat);
a=_vsntprintf_s(szBuffer,sizeof(szBuffer)/sizeof(TCHAR),
szFormat,pArgList);//将可变参数格式化输出到一个字符数组。
va_end(pArgList);
if(b==0)
{
b++;
MessageBoxPrintf(NULL,TEXT("the number is %i"),a);

}
return MessageBox(NULL,szBuffer,szCaption,0);

}

结果显示为:


1 0
原创粉丝点击