一、什么是 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. Linux(Centos7)下redis5集群搭建和使用

    1.简要说明 2018年十月 Redis 发布了稳定版本的 5.0 版本,推出了各种新特性,其中一点是放弃 Ruby的集群方式,改为 使用 C语言编写的 redis-cli的方式,是集群的构建方式复杂 ...

  2. diango url的命名和反向解析

    url的命名和反向解析 静态路由 url(r'^login/', views.login,name='login'), 反向解析ht 模板 {% url 'login' %} --> '/app ...

  3. s3c2440裸机-代码重定位、清bss的改进和位置无关码

    1.代码重定位的改进 用ldr.str代替ldrb, strb加快代码重定位的速度. 前面重定位时,我们使用的是ldrb命令从的Nor Flash读取1字节数据,再用strb命令将1字节数据写到SDR ...

  4. redis实现分布式锁--工具类

    1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  5. WSGI与uWSGI的应用场景与使用方法

    WSGI  /与/  uWSGI 在阿里云上部署项目时,在通信中我们都会用到wsgi与uWSGI,这此我就带大家来了解一下wsgi与uWSGI. 对了,上次有个朋友问我Django的生命周期是什么?我 ...

  6. 基于 CAS 无锁实现的 Disruptor.NET 居然慢于 BlockingCollection,是真的吗?

    StackOverflow 有人说自己的Disruptor.NET 代码比 BlockingCollection 还有慢 2 倍,并且把完整代码贴出,楼下几个老外也的回复说了一堆,但是没研究出个所以然 ...

  7. java之方法的重载(overload)

    什么是重载? 在任何一个类中,允许存在一个以上的同名的方法,只要它们的参数个数或者参数类型不同即可: 重载的特点? 与返回值无关,只看参数列表.且参数列表必须不同(参数个数或参数类型).调用时,根据方 ...

  8. Ubuntu18.04 下最好用的gif录制工具peek

    最近在写代码,需要找一个ubuntu下的录制屏幕工具,尝试了几个,发现peek是最好用的.这里就给大家推荐一下. 一 安装: 该软件是一个在gihtub上的开源软件,源码路径: https://git ...

  9. 推荐几本高质量的Python书籍--附github下载路径

    一 为什么要分享? 最近碰到了一些人和事,感触挺大的.就是发现很多类似自己的软件工程师,一旦工作三五年之后,工作中算是一个熟练工,但是进步的脚步突然慢了下来,虽然你在工作中仍旧很努力.到底是什么原因呢 ...

  10. ycsb 测试Hbase性能

    下载 github:https://github.com/brianfrankcooper/YCSB/releases/tag/0.10.0 wget https://github.com/brian ...