一、什么是 Win32

Win32 是指 Microsoft Windows 操作系统的 32 位环境,与 Win64 都为 Windows 常见环境。

这里再介绍下 Win32 Application 和 Win32 Console Application 之间的区别:

1、程序不同

  • Win32 Application 是标准 windows 程序,完全拥有 windows 的特性,可以通过鼠标点击窗口来完成控制。

  • Win32 Console Application 是控制台应用程序,类似于 MS-DOS 窗口,只能运行命令行程序,不具备消息响应机制。

2、入口函数不同

  • Win32 Application 入口函数是 WinMain(),它具有消息响应机制,可以运行图形化的 C++ 程序。

  • Win32 Console Application 入口函数是 main(),可以访问部分 windows API 函数,如果你编写传统的 C 程序,必须建立 Win32 Console 程序。

二、最简单的程序

创建一个 win32 应用程序 工程,功能是显示一个消息框,随便提示一些文字就可以了。具体的创建工程的步骤可以参考:创建一个最简单的win32应用程序 。代码如下:

#include <Windows.h>

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

我们再看一下效果:

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

三、分析一下

3.1 头文件

#include <Windows.h>

windows.h 是一个最重要的包含文件,它囊括了若干其他 Windows 头文件,其中的某些头文件又包含另外的一些头文件。

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

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

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

3.2 程序入口

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

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

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

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

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

3.2 MessageBox函数

最后我们看一下最主要的 MessageBox 函数。

MessageBox 函数是用来显示短信息的。尽管形式比较单一,MessageBox 所显示的小

小窗口实际上也是一个对话框。

我们也研究一下它的几个参数:

  • MessageBox的第一个参数通常是一个窗口句柄。我们先不管它。

  • 第二个参数就是将要在信息框里出现的文本字符串。

  • 第三个参数是将要在标题栏上显示的文本字符串。而且在这个程序中,我们把所有的字符串都打包到 TEXT 宏代码里面,就是用TEST("XXX")把它包裹起来。一般来说,并不需要把所有的字符串都打包到 TEXT 宏代码里面,之所以这样做是因为这样在把程序转换成 Unicode 时会方便很多。

  • 第四个参数是以前缀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 // 重试和取消

参考:

通过一个最简单的程序入门Windows编程

Win32 程序开发入门:一个最简单的Win32程序的更多相关文章

  1. 微信小程序开发入门教程(三)---小程序云开发支付功能

    支付(shoukuan)功能真的很重要!由于我还没有商户号,以下代码未实际验证 1.服务端 进入云开发,新建云函数pay(应该也可以在开发者工具编写后上传) 编写后端代码index.js这里用到第三方 ...

  2. JNI编程(一) —— 编写一个最简单的JNI程序

    来自:http://chnic.iteye.com/blog/198745 忙了好一段时间,总算得了几天的空闲.貌似很久没更新blog了,实在罪过.其实之前一直想把JNI的相关东西整理一下的,就从今天 ...

  3. 微信小程序开发入门教程

    做任何程序开发要首先找到其官方文档,微信小程序目前还在邀请内测阶段,目前官方放出了部分开发文档,经过笔者一天的查看和尝试,感觉文档并不全面,但是通过这些文档已经能够看出其大概面貌了.闲话不多说,我们先 ...

  4. MVVM之旅(1)创建一个最简单的MVVM程序

    这是MVVM之旅系列文章的第一篇,许多文章和书喜欢在开篇介绍某种技术的诞生背景和意义,但是我觉得对于程序员来说,一个能直接运行起来的程序或许能够更直观的让他们了解这种技术.在这篇文章里,我将带领大家一 ...

  5. JNI编程(一) —— 编写一个最简单的JNI程序(转载)

    转自:http://chnic.iteye.com/blog/198745 忙了好一段时间,总算得了几天的空闲.貌似很久没更新blog了,实在罪过.其实之前一直想把JNI的相关东西整理一下的,就从今天 ...

  6. scala程序开发入门

    scala程序开发入门,快速步入scala的门槛: 1.Scala的特性: A.纯粹面向对象(没有基本类型,只有对象类型).Scala的安装与JDK相同,只需要解压之后配置环境变量即可:B.Scala ...

  7. 在VS中手工创建一个最简单的WPF程序

    如果不用VS的WPF项目模板,如何手工创建一个WPF程序呢?我们来模仿WPF模板,创建一个最简单的WPF程序. 第一步:文件——新建——项目——空项目,创建一个空项目. 第二步:添加引用,Presen ...

  8. 【并发编程】一个最简单的Java程序有多少线程?

    一个最简单的Java程序有多少线程? 通过下面程序可以计算出当前程序的线程总数. import java.lang.management.ManagementFactory; import java. ...

  9. 微信小程序开发:学习笔记[7]——理解小程序的宿主环境

    微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器

随机推荐

  1. 3、netty第二个例子,使用netty建立客户端,与服务端通讯

    第一个例子中,建立了http的服务器端,可以直接使用curl命令,或者浏览器直接访问. 在第二个例子中,建立一个netty的客户端来主动发送请求,模拟浏览器发送请求. 这里先启动服务端,再启动客户端, ...

  2. 通过程序调用微信公众号发消息api返回48001

    自己的订阅号,尝试通过写程序来给用户发消息.结果呢,接口返回报错:errcode=48001,errmsg = api unauthorized hint: [ZlPULa02942276!] 去微信 ...

  3. Linux之恢复误删除文件

    前言每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有 bug.那么如果真的删除了不该删除的文件,比如数据库.日志或执 ...

  4. 阿里云RDS for SQL Serrver关于权限的一个严重Bug

    阿里云RDS for SQL Server的账号管理有不少小Bug,而且有一个很严重的Bug:任何普通账号,都能创建数据库.注意,我这里是说任意普通账号,任意任意普通账号!任意任意普通账号!重要的事情 ...

  5. Object-defineProperty ES5

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. Object.defineProperty(obj, prop, ...

  6. [CodeForces-1225A] Forgetting Things 【构造】

    [CodeForces-1225A] Forgetting Things [构造] 标签: 题解 codeforces题解 构造 题目描述 Time limit 2000 ms Memory limi ...

  7. React躬行记(1)——函数式编程

    函数式编程是React的精髓,在正式讲解React之前,有必要先了解一下函数式编程,有助于更好的理解React的特点.函数式编程(Functional Programming)不是一种新的框架或工具, ...

  8. 四步解决linux上sublime无法输入中文的问题

    转载请标明博客的地址 本人博客和github账号,如果对你有帮助请在本人github项目AioSocket上点个star,激励作者对社区贡献 个人博客:https://www.cnblogs.com/ ...

  9. web安全知识整理

    常见漏洞 sql注入 原理:SQL注入攻击是通过将恶意的SQL查询语句插入到应用的输入参数中,欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息 分类: 注入类型:字符型, 数字型 提 ...

  10. iOS中点击按钮复制指定内容

    话不多说,直接上图和代码: