Windows程序设计:格式化对话框的设计
刚开始学习Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,主要是将MessageBox这个Windows API函数的。
MessageBox函数是许多人刚开始学习Windows程序设计或者是Windows API遇到的第一个内置函数,这个函数使用的方式是:
MessageBox(NULL, TEXT("弹出框内容"), TEXT("标题"), MB_OK);
初次之外,它还有几个姐妹:
MessageBoxA(NULL, "弹出框内容", "标题", MB_OK); // TEXT可有可无
MessageBoxW(NULL, L"", L"", MB_OK); // 这个L用来表示Unicode,不可以省略
其实之所以有这两个是因为微软需要满足Windows 98之后对汉字等其他语言编码的需求,这种需求通过Unicode实现,但是微软本意不是要我们使用Unicode来编程,而是通过使用“通用”形式,也就是MessageBox();函数,实现不同的编码主要还是通过IDE集成开发环境下改变不同的编码形式。回到MessageBox();,今天比较头疼的是,怎么在MessageBox();中实现变量的打印呢?
就像C语言中经常使用printf函数,这个函数挺有趣的,应为函数输入的参数是没有限定个数的,相当于是随机改变的。例如:
#include <stdio.h>
#include <stdlib.h> int main(){
5
int x=, y=, z=; printf("%d %d %d.\n", x, y, z);
system("pause");
return ;
}
这个printf函数不仅可以使用多个参数打印,还可以用来直接打印变量,但是MessageBox却不能直接打印,这个引起我的直接思考。我先想到的是建立一个缓冲区,利用这个缓冲区取打印字符数据。当然打印的函数得使用sprintf了
int main(){
int a = ;
char szBuffer[]; // 使用一个字符数组来做缓冲区
sprintf(szBuffer, "helloworld %d.\n", a);
_snprintf(szBuffer, , "helloworld %d.\n", a);
// 使用_snprintf函数比较安全,因为可以输入限定字符的个数
printf("%s.\n", szBuffer);
puts(szBuffer); // 可以使用printf中的%s将szBuffer打印出来,或者用puts直接输出
//printf("helloworld.\n");
system("pause");
return ;
}
这个缓冲区的方法如果用在MessageBox函数里面,就可以实现打印变量的方式,比如以下代码:
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
int a = ;
TCHAR szBuffer[]; // 通用版本
_stprintf(szBuffer, TEXT("hello 通用 %d"), a);
MessageBox(NULL, szBuffer, TEXT("通用"), MB_OK | MB_ICONINFORMATION);
return ;
}
但是每次都写个缓冲区来存放,并且一不下心忘记使用_snprintf函数,那就GG了,很可能发生缓冲区溢出的危险。因此,这里利用printf原先函数设计的原理,我们也来设计一个MessageBoxPrintf();函数,用这个函数来实现格式化输出的作用,要实现这个函数,首先得参照printf();函数的实现原理。
int my_printf(const char * szFormat, ...){
int iReturn;
va_list pArgs;
va_start(pArgs, szFormat);
iReturn = vprintf(szFormat, pArgs);
va_end(pArgs);
return iReturn;
}
int main(){
int x=, y=, z=;
printf("hello %d, %d, %d.\n", x, y, z);
my_printf("test_my_printf,哈哈%d %d.\n", x, y);
system("pause");
return ;
}
...表示的意思是传入的参数是可变参数个数的,va_start(pArgs, szFormat);表示指向szFormat之后的一个参数,这个函数的许多东西我现在也还没理解过来,之后再来补充,不过现在仿照这个函数我们可以自己写个MessageBoxPrintf();函数,具体代码如下:
// 自己做一个格式化的messageboxprintf对话框
int CDECL MessageBoxPrintf(TCHAR * szCaption, TCHAR * szFormat, ...){ TCHAR szBuffer[];
va_list pArglist; va_start(pArglist, szFormat);
_vsnprintf(szBuffer, sizeof(szBuffer)/sizeof(TCHAR), szFormat, pArglist);
va_end(pArglist); return MessageBox(NULL, szBuffer, szCaption, MB_OK | MB_ICONINFORMATION);
} int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ int x=, y=, z=;
int cxScreen, cyScreen; cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN); // MessageBoxW(NULL, L"helloworld", L"biaoti", MB_OK);
// MessageBoxA(NULL, TEXT("helloworld"), TEXT("biaoti"), MB_OK);
MessageBoxPrintf(TEXT("我的标题"), TEXT("hello %d %d %d"), x, y, z); // 把这个函数做好后,直接就可以输出
MessageBoxPrintf(TEXT("我的屏幕大小"), TEXT("我的屏幕宽度是:%d.\n高度是:%d.\n"), cxScreen, cyScreen); return ;
}
相当于自己设计出来一个类似printf的小工具,因为微软确实没有设计MessageBox中进行格式化输出的函数。
Windows程序设计:格式化对话框的设计的更多相关文章
- Windows 程序设计
一.Win32 API /******************************************************************** created: 2014/04/1 ...
- Windows程序设计学习笔记(一)Windows内存管理初步
学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流.因为刚学习所以可能有的地方写不不正确, ...
- Windows 程序设计(4) MFC 03 -系列学习
本文整体目录和绝大部门内容来自 [鸡啄米网站]的MFC系列文章,欢迎支持原创 (一)VS2010/MFC编程入门之前言 VC++全称是Visual C++,是由微软提供的C++开发工具,它与C++的根 ...
- 关于《Windows程序设计(第五版)》中一个实例程序的疑问
最近一直在看Charlse Petzold的<Windows程序设计>,作为一个新得不能再新的新手,只能先照着书的抄抄源码了,之前的例子一直都很正常,但昨天遇到一个很诡异的BUG. 先看实 ...
- windows 程序设计自学:添加图标资源
#include <windows.h> #include "resource.h" LRESULT CALLBACK MyWndProc( HWND hwnd, // ...
- windows程序设计笔记
2014.05.06 新建一个visual C++ -- 常规 -- 空白 的项目,用.c后缀名指定这是一个用C语言来写的windows项目.和C语言的hellworld程序做了一个比较,按照wind ...
- 《Windows程序设计第5版》学习进度备忘
书签:另外跳过的内容有待跟进 __________________学习资源: <Windows程序设计第5版珍藏版> __________________知识基础支持: _________ ...
- MFC Windows程序设计源代码免费下载
本人近期在网上找到了<MFC Windows程序设计>第二版的书内程序的源代码,特意上传CSDN上面,供学习MFC的程序猿们免费下载. 源代码下载: http://download.csd ...
- windows 程序设计 SetPolyFillMode关于ALTERNATE、WINDING的详细解释
看windows程序第五章GDI编程部分.一直卡壳在这里了. 下面我来说下自己的想法.看是否对您有帮助. 首先我们来看一个图. SetPolyFillMode(ALTERNATE); // 系统默认 ...
随机推荐
- spark Could not write all entries
使用 spark 将 dataFrame 储存到 elasticsearch 出现如下报错: Caused by: org.elasticsearch.hadoop.EsHadoopException ...
- Python内置函数(62)——sum
英文文档: sum(iterable[, start]) Sums start and the items of an iterable from left to right and returns ...
- EF架构~mysql数据库无法创建数据模型
回到目录 主要是通过vs2017+mysql.Data+Mysql.data.Entity+ef 来进行开始,当我们选择数据模型生成实体时,可以会出现以下问题: http:// 解决办法: 1.安装 ...
- C#7.0新特性
前言 微软昨天发布了新的VS 2017 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下其实2016年12月就已经公布了的C#7 ...
- 【Java基础】【26网络编程】
26.01_网络编程(网络编程概述)(了解) A:计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下, ...
- leetcode — word-ladder-ii
import java.util.*; /** * Source : https://oj.leetcode.com/problems/word-ladder-ii/ * * * Given two ...
- leetcode — remove-duplicates-from-sorted-list-ii
/** * Source : https://oj.leetcode.com/problems/remove-duplicates-from-sorted-list-ii/ * * * Given a ...
- windows资源管理器多标签打开 windows文件夹多标签浏览 浏览器tab页面一样浏览文件夹 clover win8 win10 报错 无响应问题怎么解决 clover卡死 clover怎么换皮肤
大家都知道,我们打开一堆文件夹的时候,是什么样子 “厚厚的一叠”图标堆叠在一起的,非常的不方便 那么,是不是可以像浏览器一样的tab页面展示呢? 答案是可以的 安装好就是这样子的 是不是方便漂亮了很多 ...
- AppBoxFuture(四). 随需而变-Online Schema Change
需求变更是信息化过程中的家常便饭,而在变更过程中如何尽可能小的影响在线业务是比较头疼的事情.举个车联网监控的例子:原终端设备上传车辆的经纬度数据,新的终端设备支持同时上传速度数据,而旧的车辆状态表 ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(3)- Serial Downloader模式(sdphost/MfgTool)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Serial Downloader模式. 在上一篇文章 Boot配置(BOOT Pin, eFUSE) ...