【DirectX11-Tutorial】运行第一个win32程序A Primer of Basic Windows

DirectX11-Tutorial

本系列主要参考此博客的文章,同时会加上一点个人实践过程。

========================================== 分割线 ==========================================

<span style="font-family:Microsoft YaHei;font-size:14px;">#include <stdio.h>
// include the standard input/output header file

void main(void)
// our program starts here
{
    printf("Hello World!");
 // print "Hello World!" into the console
    return;
// return void to windows
}
 </span>

上述是我们学习C语言时开始的控制台程序,以下通过对比来开始写第一个WIN32应用程序。代码中,函数中main()用来启动应用程序,简单来说main()会告诉计算机开始程序,同时系统可以给你需要的参数来启动应用。在windows程序中,不同的是它具有两个功能。第一个是win32控制台main()函数,另一个是允许Windows程序事件驱动。当事件发生时,windows将会记录信息,并且将信息放在队列中。

为了开始写我们的windows程序,我能需要在功能前面加上WinMain()。

The WinMain() Function相当于控制台中的main()函数。他是应用程序开始的地方,在这里可以进行基本的初始化。通常只是用代码创建一个窗口,而且是一些基本回路。

以下是 WinMain() 应用的示例:

<span style="font-family:Microsoft YaHei;font-size:14px;">int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow);</span>

理解代码之前先了解一下在int和WinMain 之间WINAPI这个词,这是一个传递 Fortran and Pascal参数的方法。就是反向传递参数。它们通常从右至左的传递,但是WINAPI可以使它们从左至右传递。细节原因不是特别重要,Windows需要这种传递方式。

<span style="font-family:Microsoft YaHei;font-size:14px;">HINSTANCE hInstance,</span>

第一个语句中HINSTANCE 是“handle to an instance”的缩写。Handle是一个32为整数识别对象。instance是应用的一个复制实例。由于多任务处理和运行一个程序的多个副本的能力,Windows需要一种方法来跟踪程序。通过给每个实例程序"handle to an instance",或者从其他程序中标识每一个程序。当开始程序的时候,Windows选取一个号码并且把它放到这个参数之中。

<span style="font-family:Microsoft YaHei;font-size:14px;">HINSTANCE hPrevInstance,</span>

第二个语句代表着处理过去的实例,如果存在打开多个应用副本的情况,从理论上讲,hPrevInstance将会组织过去的实例被打开。

之前的32位处理器、Windows95版本之前的方式,从同样应用复制的多个实例被阻住去占用同样的内存空间。当很多程序员想要从运行多个副本中保证他们的程序正常运行的时候,会变特很复杂。为了避免这一点,hPrevInstance 将会处理以前的实例同时在只有一个实例的情况下返回空值,这允许程序员监测任何正在运行的副本。虽然现在我们依然使用32位的应用,但是Windows为每一个应用提供他们自己的内存空间,所以hPrevInstance
已经过时了。它仅仅由于向后兼容性而存在,这在每一个程序中等同于空值,而非其他副本的存在。

<span style="font-family:Microsoft YaHei;font-size:14px;">LPSTR lpCmdLine,</span>

这个语句是一个string型的长指针,负责命令行调用应用程序。举个例子,如果想要创建一个名为 "MyApp.exe" 的应用,并且在开始菜单中运行命令行,你需要运行"MyApp.exe" 、"MyApp.exe RunA"或者"MyApp.exe RunB"。在任何一种情况下, lpCmdLine将存储整个输入的内容,允许程序检测特定的参数。这在一个游戏的程序运行类似安全模式这种特殊情况下非常有用的方式,Windowed模式、软件渲染模式、作弊模式或者任何想要实现的模式。

<span style="font-family:Microsoft YaHei;font-size:14px;">int nCmdShow</span>

这个语句指的是window在创建的时候如何显示。例如,可以实现窗口最大化、最小化或正常显示,或者即便是打开一个窗口,它可以在后台运行。不一定非要使用这些功能,但是它们可以在你需要的时候使用。下面是一些常见的参数值:


Value


Description


SW_SHOWNORMAL


Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when displaying the window
for the first time.


SW_SHOW


Activates the window and displays it in its current size and position.


SW_HIDE


Hides the window and activates another window.


SW_MAXIMIZE


Maximizes the specified window.


SW_MINIMIZE


Minimizes the specified window and activates the next top-level window in the Z order.


SW_RESTORE


Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized
window.


SW_SHOWMAXIMIZED


Activates the window and displays it as a maximized window.


SW_SHOWMINIMIZED


Activates the window and displays it as a minimized window.


SW_SHOWMINNOACTIVE


Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED, except the window is not activated.


SW_SHOWNA


Displays the window in its current size and position. This value is similar to SW_SHOW, except the window is not activated.


SW_SHOWNOACTIVATE


Displays a window in its most recent size and position. This value is similar to SW_SHOWNORMAL, except the window is not actived.

下面将在VS2015中实现运行第一个win32程序。

打开VS2015,在菜单栏中点击文件-新建项目,在模板中选择WIN32控制台应用程序。

这里其实有一些疑惑,照理说应该创建窗口模式而非控制台模式,但是在选项过程中如果直接在应用程序类型中选择Windows应用程序,结果显示的并不正确。

而最终实现的方式是新建的时候创建控制台应用程序,然后在创建好的项目中单击项目名称右键-属性打开项目的属性页。

然后再连接器(linker)-系统(system)中点击子系统选择窗口,这样的方式实现的最终效果。

以下是实现的代码。

<span style="font-family:Microsoft YaHei;font-size:14px;">// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>    // include the basic windows header file

// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nShowCmd)
{
	// create a "Hello World" message box using MessageBox()
	MessageBox(NULL,
		L"Hello World!",
		L"Just another Hello World program!",
		MB_ICONEXCLAMATION | MB_OK);

	// return 0 to Windows
	return 0;
}

</span>

结果如下图所示:

<span style="font-family:Microsoft YaHei;font-size:14px;">#include <windows.h></span>

这个windows.h头文件只是一个包含许多Windows程序可用头文件的容器,这样就不需要手段去添加许多头文件了。

<span style="font-family:Microsoft YaHei;font-size:14px;">MessageBox()</span>

这个函数创建了在demo中可见的信息盒子。以下是创建的代码部分。

<span style="font-family:Microsoft YaHei;font-size:14px;">int MessageBox(HWND hWnd,
               LPCTSTR lptext,
               LPCTSTR lpcaption,
               UINT utype);</span>

下面我们可以快速的了解一下各个语句含义:

<span style="font-family:Microsoft YaHei;font-size:14px;">HWND hWnd,</span>

HWND是一个窗口的handle,上面提到handle是整数标识对象,在这种情况下,识别一个窗口。由于没有手动创建的窗口,设置为空值,同时系统知道没有除了桌面以外的窗口传递来的信息。

<span style="font-family:Microsoft YaHei;font-size:14px;">LPCTSTR lptext,</span>

16位string型的指针,其中指向信息盒子中的文字。

<span style="font-family:Microsoft YaHei;font-size:14px;">LPCTSTR lpcaption,</span>

16位string型指针指向标题文字,及信息的说明文字。

<span style="font-family:Microsoft YaHei;font-size:14px;">UINT utype</span>

此参数确定消息框的样式,以下是可以在这个参数添加的常用值列表。


Value


Description


MB_CANCELTRYCONTINUE


The message box contains three push buttons: Cancel, Try Again, Continue.


MB_OK


The message box contains one push button: OK. This is the default.


MB_OKCANCEL


The message box contains two push buttons: OK and Cancel.


MB_RETRYCANCEL


The message box contains two push buttons: Retry and Cancel.


MB_YESNO


The message box contains two push buttons: Yes and No.


MB_YESNOCANCEL


The message box contains three push buttons: Yes, No, and Cancel.

要在消息框中显示一个图标,需要指定下列值之一:


Value


Description


MB_ICONINFORMATION


An icon consisting of a lowercase letter
i in a circle appears in the message box.


MB_ICONEXCLAMATION


An exclamation-point icon appears in the message box.


MB_ICONERROR


A stop-sign icon appears in the message box.

Return Value

在游戏程序中,通常不需要返回值,因为错误的信息仅仅有一个去处。然而,返回值仍然是需要知道的。下列是返回值列表:


Value


Button Pressed


IDCANCEL


The ‘Cancel‘ button was selected.


IDTRYAGAIN


The ‘Try Again‘ button was selected.


IDCONTINUE


The ‘Continue‘ button was selected.


IDNO


The ‘No‘ button was selected.


IDYES


The ‘Yes‘ button was selected.


IDOK


The ‘OK‘ button was selected.

时间: 2024-08-06 20:18:27

【DirectX11-Tutorial】运行第一个win32程序A Primer of Basic Windows的相关文章

OD调试1--第一个win32程序

OD调试一:第一个Win32程序的修改 在软件开发的过程中,程序员会使用一些调试工具,以便高效地找出软件中存在的错误.而在逆向分析领域,分析者也会利用相关的调试工具来分析软件的行为并验证分析结果.由于操作系统都会提供完善的调试接口,所以利用各类调试工具可以非常方便灵活地观察和控制目标软件.在使用调试工具分析程序的过程中,程序会按调试者的意愿以指令为单位执行. 调试逆向分为动态分析技术和静态分析技术. 动态分析技术指的是使用调试工具加载程序并运行,随着程序运行,调试者可以随时中断目标的指令流程,以

运行第一个Hadoop程序,WordCount

系统: Ubuntu14.04 Hadoop版本: 2.7.2 参照http://www.cnblogs.com/taichu/p/5264185.html中的分享,来学习运行第一个hadoop程序. 在hadoop的安装文件夹 /usr/local/hadoop下创建input文件夹 [email protected]:/usr/local/hadoop$ mkdir ./input 然后copy几个文档到input文件夹中作为WordCount的输入 [email protected]:/u

cocos2dx-3.2 运行第一个android程序

第一步,下载各种环境. 搭建android的java开发环境,android环境的搭建(包括ADT,eclipse 和 android SDK)网上有很多教程,这里不再赘述. NDK (这个简单,从官网下载后解压,然后把解压路径 设置到环境变量的path中即可) ANT (这个简单,从官网下载后解压,然后把解压路径+bin 这个路径 设置到环境变量的path中即可) Cocos2dx-3.2 (这个安装网上也有好多) Python (安装时,选完安装路径后,会有个选择组建的界面,这个界面的最后一

OpenCV学习笔记(一)安装及运行第一个OpenCV程序

1.下载及安装 OpenCV是一套开源免费的图形库,主要有C/C++语言编写,官网: http://opencv.org/ .在 http://opencv.org/downloads.html 可以找到个版本和各种平台的程序包.OpenCV的Windows平台安装包是放在SourceForge.net网站. 我下了2.4.4版,大概217M.安装包其实就是一个压缩包,安装过程就是解压到某个文件夹.我是安装到 E:\Soft\opencv 目录,安装后文件夹如下: 我们只需要关注“build”文

一起学libcef--搭建自己的libcef运行环境(Win32程序,错误C2220解决方案)

转自 http://blog.csdn.net/wangshubo1989/article/details/50180413 现在就来讲讲如何在自己的win32程序中搭建libcef运行环境. 首先就是建一个空的win32项目,例如名字为TestLibCef. 1. cefsimple目录(注意是拷贝文件夹)拷贝到新工程下并包含在项目中(注意,是TestLibCef\TestLibCef文件夹下) 2. 并在TestLibCef\TestLibCef文件夹下,新建一个dll文件夹 源码把Debu

Java学习(三)运行第一个JFreeChartDemo程序

在上一次的学习中,我们完成了Java开发的基本配置,那么接下来,下载安装一个Java的IDE就可以了,比如像我一样安装myeclipse 2013或者eclipse,都可以.接下来我将以myeclipse 2013为集成开发环境,运行我们的第一个java程序,不过它与图形相关,所以需要引用JFreeChart这个库. 一.新建一个java项目 File--->New--->Project: 在出现的对话框中选择Java Project,然后命名之后next,最后finish就可以了. 二.新建

【Java】使用记事本运行第一个Java程序

要编写java程序,java sdk必不可少,mac OS系统自带sdk,如果觉得版本太低,可以去官网下载最新的. 打开终端,新建一个HelloWorld.java文件: vim HelloWorld.java 开始编写程序,如图:(为了大家更好的学习,请参照图动手敲代码,舍弃复制粘贴的快感) 接下来保存关闭,终端输入: javac HelloWorld.java 可以看到多出来一个.class文件,这是java编译出来的字节码文件 执行 java HelloWorld 你成功的运行了第一个ja

运行第一个Python程序

Python的三种运行方式 交互式解释器 在终端输入python3 进入python交互式解释器 输入exit()退出交互式解释器 命令行脚本 创建python脚本 通过命令执行程序 python hello.py 集成开发环境(IDE) 通过集成开发环境编辑执行python程序 比如PyCharm.vscode 第一个python程序 方式一 命令行输入python3 进入交互式解释器 输入print("hello", "world") 即可运行 方式二 原文地址

【菜鸟入门】安装配置eclipse 并编写运行第一个Java程序

不得不吐槽一下,安装配置这eclipse真是太费劲了...下面总结一下,以便下次再安装 本人 win10系统,64位机 一.在官网下载eclipse安装包 文件名:eclipse-inst-win64.exe 网址:https://www.eclipse.org/downloads/download.php?file=/oomph/epp/oxygen/R/eclipse-inst-win64.exe //建议下载前点击"Select Another Mirror",选择一个国内镜像,