一、什么是 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. Abusing SUDO Advance for Linux Privilege Escalation

    Index What is SUDO? Scenario. Sudoer FIle Syntax. Exploiting SUDO zip tar strace tcpdump nmap scp ex ...

  2. 搭建虚拟机+静态IP+XShell管理虚拟机+jdk+tomcat热部署

    第一步:搭建虚拟机 大家可以参考http://blog.csdn.net/u012453843/article/details/68947589这篇博客进行学习 第二步:配置静态IP并且要能上网 大家 ...

  3. RTP Payload Format for VP8 Video

    整体结构 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+ ...

  4. Java连载55-接口的作用、接口举例

    一.接口的作用 1.可以使项目分层,所有层都面向接口开发,开发效率提高了. 2.接口使代码和代码之间的耦合度降低,就像内存条和主板的关系,变得“可插拔”,可以随意切换. ​总结:接口和抽象类能够完成某 ...

  5. 用 Python 破解 WiFi 密码

    如今,WiFi 跟我们的生活息息相关,无处不在.没有 WiFi 的地方是没有灵魂的! ​ 然而,比没有WiFi更让人绝望的,是有满格WiFi信号却没有密码…… ​ 今天我们就来尝试下,如何利用pyth ...

  6. 【OCR技术系列之四】基于深度学习的文字识别

    上一篇提到文字数据集的合成,现在我们手头上已经得到了3755个汉字(一级字库)的印刷体图像数据集,我们可以利用它们进行接下来的3755个汉字的识别系统的搭建.用深度学习做文字识别,用的网络当然是CNN ...

  7. Python之format()函数

    Python2.6开始,新增了一种格式化字符串的函数format(),它增强了字符串的格式化功能.(官方推荐) 基本语法是通过{}和:来代替以前的% format()函数可以接收不限个参数,位置可以不 ...

  8. opencv与mfc显示图片操作,MFC的鼠标响应在opencv图片上失效,opencv滚轮事件没有响应问题描述解决。

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11588758.html 用mfc 与OPENCV编写成. 出了很多冲突异常事件导致鼠标操作没有 ...

  9. JMeter压测“java.net.BindException: Address already in use: connect”解决方法

    之前在windows机上用JMeter压测,50并发下出现大量接口报“java.net.BindException: Address already in use: connect”错误. 从字面的意 ...

  10. 关于kubernetes我们还有什么可做的?

    kubernetes在容器编排大战中由于应用的可移植性以及支持混合云/多云部署方式上的灵活性.加上开放可扩展的理念,使得周边社区非常活跃.从既有调研结果看,kubernetes已成为容器编排领域的标准 ...