一、最简单的程序

我们首先先一个最简单的Windows程序,功能是显示一个消息框,随便提示一些文字就可以了。
看一下代码:

#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL,TEXT("随便提示一些内容就可以了!哈哈哈!"),     //内容TEXT("这里是标题!"),        //标题名称0);return 0;
}

我们再看一下效果:

接下来我们从头开始剖析这个简单的小程序。

二、分析一下

① 头文件

#include <Windows.h>

开头的是在几乎所有用C语言编写的程序中都有的预处理器(preprocessor)指令:#include<windows.h>
windows.h是一个最重要的包含文件,它囊括了若干其他Windows头文件,其中的某些头文件又包含另外的一些头文件。

下列几个是最重要也是最基本的头文件:

  • WINDEF.H 基本数据类型定义。
  • WINNT.H 支持 Unicode的类型定义。
  • WINBASE.H 内核函数。
  • WINUSER.H 用户界面函数。
  • WINGDI.H 图形设备接口函数。

这些头文件定义了Windows的所有数据类型、函数调用、数据结构以及常量标识符。

② 程序入口

main是C程序的入口,而Windows程序的入口是WinMain,它总是这个样子的:

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

我们看一下winbase.h中的声明:

int
WINAPI
WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd);

我们可以看到是有一些区别的。 第三个参数在WINBASE.H中定义为LPSTR,而我们却把它改成了PSTR. 这两种数据类型在WINNT.H中都声明为指向字符串的指针。前缀LP代表长指针(Long Pointer),它是16位Windows的产物。另外就是我们改动的WinMain声明中的两个参数名。

WinMain函数的返回值被定义为int
WINAPI标识符在WINDEF.H中定义,它规定了一种函数调用约定。而我们绝大多数Windows函数调用都定义成WiNAPI。

我们再来研究一下它的参数部分:

HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd

第一个参数一般叫做“实例句柄”(Instance Handle)。在Windows程序中,句柄无非就是一个数值,程序里用它来标识某些东西。比如在我们这个例子里,这个句柄就唯一标识了 我们的这个程序。
实际上在某些Windows程序中,把句柄当作调用参数是必须的。比如在早期的Windows版本中,当多路并发运行同一个程序时,就需要为那个程序创建多个实例。同一程序的所有的实例都共享代码和只读存储。一个程序可以通过查看hPrevInstance,也就是第二个参数从而知道是否有它的其他实例正在运行。它也就可以因此跳过某些零散杂务步骤,把一些数据从前一个实例搬到自己的数据区来。但是在32位Windows 中,这一概念已不再采用。 因此WinMain的第二个参数通常总是NULL(定义为0)。
WinMain的第三个参数是用来运行程序的命令行(Command Line)。有些Windows程序
在启动时用它来把文件装入内存。
WinMain的第四个参数用来指明程序最初如何显示或正常显示,或最大化到全屏,或最小化显示在任务栏上。

③ MessageBox函数

最后我们看一下最主要的MessageBox函数。
MessageBox函数是用来显示短信息的。尽管形式比较单一,MessageBox所显示的小
小窗口实际上也是一个对话框。

我们也研究一下它的几个参数:
MessageBox的第一个参数通常是一个窗口句柄。我们先不管它。
第二个参数就是将要在信息框里出现的文本字符串。
第三个参数是将要在标题栏上显示的文本字符串。
而且在这个程序中,我们把所有的字符串都打包到TEXT宏代码里面,就是用TEST("XXX")把它包裹起来。一般来说,并不需要把所有的字符串都打包到TEXT宏代码里面,之所以这样做是因为这样在把程序转换成Unicode时会方便很多。
MessageBox的第四个参数是以前缀MB_打头的一些常量的组合。WINUSER.H中定义了这些相关常量。比如下面的这些,你可以任选一个来表示在对话框里希望用哪种按钮:

#define MB_OK                    0X00000000L     //ok
#define MB_OKCANCEL             0x00000001L     //ok和取消
#define MB_ABORTRETRYIGNORE     0x00000002L     //中止、重试和取消
#define MB_YESNOCANCEL          0x00000003L     //yes/no/取消
#define MB_YESNO                0X00000004L     //yes和no
#define MB_RETRYCANCEL          0x00000005L     //重试和取消

当你把第四个参数选成0时,那就只显示0K按钮。我们还可以用OR(|)运算符把一个上述按钮常量跟一些其他的常量组合起来。
比如下面的来描述哪个按钮为默认按钮:

#define MB_DEFBUTTON1    0x00000000L
#define MB_DEFBUTTON2   0x00000100L
#define MB_DEFBUTTON3   0x00000200L
#define MB_DEFBUTTON4   0x00000300L

你还可以用下列某个常量来指定消息框中所显示的图标:

#define MB_ICONHAND              0x00000010L     //错误
#define MB_ICONQUESTION         0x00000020L     //疑问
#define MB_ICONEXCLAMATION      0x00000030L     //警告
#define MB_ICONASTERISK         0x00000040L     //感叹号

这些图标当中,有些还另有别名:

#define MB_ICONWARNING       MB_ICONEXCLAMATION
#define MB_ICONERROR        MB_ICONHAND
#define MB_ICONINFORMATION  MB_ICONASTERISK
#define MB_ICONST0P         MB_ICONHAND

我们可以尝试一下:
第一个:

MessageBox(NULL,TEXT("随便提示一些内容就可以了!哈哈哈!"),       //内容TEXT("这里是标题!"),        //标题名称MB_YESNOCANCEL | MB_DEFBUTTON2 | MB_ICONQUESTION);
return 0;

效果:

第二个:

MessageBox(NULL,TEXT("随便提示一些内容就可以了!哈哈哈!"),       //内容TEXT("这里是标题!"),        //标题名称MB_RETRYCANCEL | MB_DEFBUTTON3 | MB_ICONHAND);
return 0;

效果:

三、总结

相信通过这个简单的例子和讲解,你已经对Windows编程有了一个初步的大体的印象。虽然系统提供了众多的选项,但是我们可能还是觉得不太够,如我们暂时不知道怎么调整窗口的大小,颜色等等。我们后面就会学习怎么样随意的格式化我们的MessageBox,使我们的Windows程序变得丰富多彩。

通过一个最简单的程序入门Windows编程相关推荐

  1. Java入门知识,写一个最简单java程序

    本文目录 一.Java语言的简介 二.写一个最简单Java程序 1.Notepad配置 2.最简单的Java程序 3.代码分析 4.编译与编译常见错误 5.执行java程序 一.Java语言的简介 0 ...

  2. easy一个极为简单的程序(1)

    easyx一个极为简单的程序(1) 最近我看到一个叫easyx的函数库,我便仔细看了看,作了一个极为简单的程序. 这个程序可以以不同颜色,不同次数,每次增加1/20屏幕分辨率的速度增大画图窗口(看起来 ...

  3. matlab程序 如何使用,如何使用MATLAB创建一个最简单的程序

    <如何使用MATLAB创建一个最简单的程序>由会员分享,可在线阅读,更多相关<如何使用MATLAB创建一个最简单的程序(4页珍藏版)>请在人人文库网上搜索. 1.如何使用MAT ...

  4. 简单画图程序(windows程序设计)

    1)按"L"后,用鼠标拖拽能在屏幕上画直线:1)按"L"后,用鼠标拖拽能在屏幕上画直线:1)按"L"后,用鼠标拖拽能在屏幕上画直线: 2)按 ...

  5. python的简单程序代码_小白学编程?从一个简单的程序开始学习Python编程

    笔者思虑再三还是决定选择图文(因为百家的视频发布画质真不怎么样[囧]). 笔者学习编程的时间也挺长的,因为业余,因为时间不多,各种原因,自学编程的路特别难走.然后笔者发现,自己能为小白贡献一些力量,然 ...

  6. 用C++做一个特小型恶意程序

    用C++做一个特小型恶意程序 #include <windows.h> #include <ctime> #include <cstdlib> using name ...

  7. Windows编程课程学习笔记

    一. Windows程序内部运行机制--Windows编程课程学习笔记 二. MFC框架程序分析--Windows编程课程学习笔记 三. 简单绘图--Windows编程课程学习笔记 四. 文本编程-- ...

  8. Windows编程—Windows驱动中定时器的使用

    文章目录 Windows编程-Windows驱动中定时器的使用 前言 代码 简单版 升级版 程序效果 Windows编程-Windows驱动中定时器的使用 前言 定时器操作是应用编程中非常常见的操作, ...

  9. Windows API入门系列之五 -一个正儿八经的SDK程序

    上一篇,讲了一个简单的SDK程序的多种版本的编写,弹出了一个窗口,显示了我们计算1到10的结果,计算的程序不是重点,重点在于,一:让大家认识到Unicode版本的程序和ASCII版本的程序在编程方面的 ...

  10. java入门篇(一)如何编写一个简单的程序

    最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...

最新文章

  1. GTX1080 安装 CUDA 7.5
  2. Java中的单例模式
  3. 用Play 1.x 实现简单云计算多租户设计(Use Play 1.x To Achieve Multi-Tenancy Design)
  4. 如何在Oracle11中配置st_shapelib
  5. webdriver+python 对三大浏览器的支持
  6. ALV Styles in Field catalogue using OOPS
  7. Mybatis逆向工程自动生成代码文件
  8. 关于C#日期格式化问题
  9. 1.大数据架构详解:从数据获取到深度学习 --- 大数据的本质
  10. 5个免费可商用的图片素材网站,赶快收藏
  11. [免费专栏] 车联网基础理论之车联网安全常见术语科普
  12. jQuery-WEUI的Uploader实现上传多张图片并且限制上传数量的方法
  13. 【C++]参数的缺省值
  14. 【PASA集群管理神器】Glang竟然可以做出那么惊艳的系统
  15. oracle Day1
  16. JasperReports初体验
  17. 加强计算机安全 网络安全教育,中学生网络安全教育
  18. 安卓通知栏管理详解及分析 NotificationListenerService
  19. ESP32使用micropython心得
  20. vue中使用vue-typed-js

热门文章

  1. 详尽Ubuntu18安装搜狗输入法教程
  2. Qt上位机 实现串口助手和网络助手
  3. Mac 升级 catalina 后无法创建文件,Read-only file system
  4. 用ICC编译MP3编码器LAME
  5. python ffmpeg转码_使用FFMPEG进行HTML5 /和实时转码
  6. c++ find()
  7. 微信小程序源代码基本文件类型
  8. java反编译工具Java Decompiler
  9. Linux 常用命令 权限管理命令
  10. 「离散数学」是一门什么样的学科