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);
}
结果显示为:
- Windows程序设计(二)
- windows程序设计(二)
- Windows程序设计笔记(二)
- 《Windows 程序设计》学习笔记(二)
- 《windows程序设计》(二)-------UNICODE字符集
- Windows程序设计之计时器(二)
- Windows程序设计-文本输出(二)
- windows程序设计读书笔记二
- 《Windows程序设计》读书笔记之二
- 读书笔记--MFC Windows程序设计(二)
- 《Windows程序设计》读书笔记之二
- Windows程序设计--文本输出(二)
- 从零学起----Windows程序设计笔记(二) 窗口
- windows程序设计POPPAD3的关键难点详解(二)
- Windows程序设计(二)——Unicode简介
- Windows程序设计(第2版)多线程二
- Windows 程序设计学习笔记二:Unicode
- Windows程序设计--设置滚动条详解二
- KMP算法 Java实现
- company——桶思想
- 模块化开发
- JAVA String、StringBuilder和StringBuffer区别
- 树莓派笔记(二)--“闪烁灯”
- windows程序设计(二)
- Jquery UI实践系列(二)Accordion
- Watson Explorer 入门(12):词典
- 创建函数计算目标元素到浏览器窗口的距离
- 平方数
- js输出当前系统时间
- Note4、const
- redis 三(数据类型)
- SSM项目---淘淘商城(IDEA开发)