DirectX教程(1):基本Windows入门_父進程的博客-程序员信息网_directx教程

技术标签: DirectX  

Win32控制台程序 vs. Windows程序

  下面是一个简单的Win32程序,main函数是程序的起点,Windows能够向程序输入任何你认为必要的参数。

#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
}

  而Windows程序除了有类似Win32程序的mian函数一样,它还是事件驱动的。事件是指诸如用户点击鼠标、按一个键或者一个计时器归零等事情的发生。当这些事件中的任何一个发生时,Windows将这个发生的事件记录在一个消息中,并将这个消息放在该消息对应的程序的消息队列中,例如你的游戏。这个程序通过一个函数负责处理这些消息。

WinMain函数

  Windows程序的WinMain函数就类似于Win32控制台程序的main函数,这是程序的起点,里面可以进行一些基本的初始化操作,例如创建窗口、基本的循环以及计时器的一些代码。下面是WinMain()函数的原型并对其中的参数进行介绍:

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

  WINAPI

  在intWinMain之间,是WINAPI这个词。WINAPI是一种传递参数的方式,这种方式来自于Fortran和Pascal时代。简言之,它的作用就是颠倒参数的顺序。参数通常是从右往左传,但是WINAPI将它们从左往由传递。这个细节并不重要,我们只要记住Windows程序要求这样做就行。

  HINSTANCE hInstance

  第一个参数是“handle to an instance”(实例句柄)的缩写,句柄(handle)是一个32位整数,用于表示某些内容,例如一个对象(object)。实例(instance)其实就是应用程序的副本。由于要进行多任务以及运行程序的多个副本,Windows需要跟踪哪个程序是哪个,因此Windows通过给每个应用程序的每个实例赋予一个实例句柄来到达这个目的,简单的说就是用一个整数来标识每个应用程序。当你的程序开始时,Windows会选择一个数字并传入这个参数。

  HINSTANCE hPrevInstance

  这个参数是过去遗留下来的,它表示前一个实例的句柄。这意味着,如果一个应用程序有多个副本,则hPrevInstance将包含最后一个创建的实例的句柄。
  在32位处理器出现之前,同一应用程序的多个副本是共享相同的内存空间,这使得编程变得很复杂,因此程序员常常阻止他们的应用程序运行自己的多个副本。为了避免这种情况,hPrevInstance能够先前实例的句柄,如果当前是唯一的实例,则返回NULL。这就允许程序员能够检测任何正在运行的副本。
  然而,目前的应用程序普遍都是32位,Windows为每个32位的应用程序提供了自己独立的内存空间,hPrevInstance这个参数也就过时了。它存在的目的仅仅是为了兼容性,该值在32位应用程序中都等于NULL。

  LPSTR lpCmdLine

  这个参数是一个指向字符串的长指针,该字符串包含了调用应用程序的命令行。例如,你有一个名为“MyAPP.exe”的应用程序,并在命令提示符(cmd)下运行该应用程序,你输入的命令行可能为“MyAPP.exe”或者“MyAPP.exe RunA”或者“MyAPP.exe RunB”。lpCmdLine会存储所有的输入内容,从而允许程序检查特定的参数。

  int nCmdShow

  这个参数指示创建窗口时的外观。例如,这个参数可能要求将窗口最小化、最大化或者正常化,甚至打开一个在后台运行的窗口。通常你在游戏编程中不需要用到它们,但如果你愿意,也可以使用它们。

实例程序

  下面,让我们来写一个简单的实例程序!最简单的当然是“hello world”这个程序啦!

#include <windows.h>    // include基本的Windows头文件

// 每个Windows程序都需要一个WinMain函数作为入口
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nShowCmd)
{
    
    // 使用MessageBox()创建了一个"Hello World"消息框
    MessageBox(NULL,
               L"Hello World!",
               L"Just another Hello World program!",
               MB_ICONEXCLAMATION | MB_OK);

    // 返回0给Windows
    return 0;
}

  如果你成功运行这个程序,会得到下面这个消息框:helloworld
  下面,我们将从上到下分解该程序中新出现的部分:

  #include <windows.h>

  windows.h头文件实际上就是一个容器,里面包含了许多对Windows编程有用的头文件,这样我们就不必自己添加大量的头文件。

  MessageBox()

  这个函数用于创建一个消息框,这是它的原型:

int MessageBox(HWND hWnd,
               LPCTSTR lptext,
               LPCTSTR lpcaption,
               UINT utype);

  下面将简要介绍一些它的参数:

参数 作用
HWND hWnd HWND 是窗口的句柄,如前面提到的一样,句柄是一个整数,用于表示一个对象。在这里,我们用于标识一个窗口。因为我们还没有创建任何窗口,因此将其设为NULL,并且Windows知道这个消息不是来自其他任何窗口,而是来自桌面
LPCTSTR lptext 这个参数是一个指向16位字符串的指针,该字符串表示消息框文本
LPCTSTR lpcaption 这个参数也是一个指向16位字符串的指针,该字符串表示消息框标题
UINT utype 这个参数用于确定消息框的样式,该参数有多个类型的值,并且可以通过OR操作符结合使用

  返回值

  在游戏编程中,通常不需要返回值,因为错误消息只有一个方向可以进入:退出。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hjc132/article/details/104777631

智能推荐

Maven 阿里云镜像配置_干干脆脆的小饼干6688的博客-程序员信息网

&lt;mirror&gt; &lt;id&gt;nexus-aliyun&lt;/id&gt; &lt;mirrorOf&gt;*,!jeecg,!jeecg-snapshots&lt;/mirrorOf&gt; &lt;name&gt;Nexus aliyun&lt;/name&gt; &lt;url&gt;http://maven.aliyun.com/nexus/content/groups/public&lt;/url&gt; &lt;/mirror&gt;

Hive基本DDL操作_fengge18306的博客-程序员信息网

1、数据库的DDL操作(1)创建数据库数据库在HDFS上的默认存储路径是/user/hive/warehouse/数据库名.dbhive &gt; create database db_hive; 两者等价 hive &gt; create database if not exists db_hive;(用if not exists判断是否已存在该数据库)(2)显示所有数据库...

undefined的几种情况_放错位的天才的博客-程序员信息网

1.变量声明了,但是没有赋值;2.一个变量声明了,并且赋值了undefined;var a = undefined;3.一个对象中,获取某个不存在的属性,值也是undefined转载于:https://www.cnblogs.com/zmdblog/p/10321788.html...

Xcode更新 提示空间不足的几种解决办法_凯撒大帝jin的博客-程序员信息网_xcode 更新 空间不足

Xcode更新 提示空间不足剩余空间提示空间不足空间看起来很足,为什么会提示空间不够呢?也是初次碰到这个问题,具体原因不太清楚,猜测可能跟Xcode本身计算空间方式有关,也有可能从关于本机-&gt;存储空间,看到的不是真实的剩余空间。解决办法:一、删除一些文件,释放空间1、 删除如下目录~/Library/Developer/Xcode/iOS DeviceSupport的老旧设备,一个占大概3G的空间,进入之后,可以使用命令查看一下当前目下的文件占用的空间大小:du -sh删除了一部分

Ubuntu 安装 cnpm_veiTian的博客-程序员信息网_ubuntu安装cnpm

目录一. 安装 npm1.下载 npm2.解压 .xz 文件3.移动文件并重命名4.创建软链接5.查看版本号二.安装 cnpm1.下载 cnpm2.创建软链接3.查看 cnpm信息一. 安装 npm1.下载 npm进入 http://nodejs.cn/download/ 找到合适的版本,复制下载链接,在命令行输入指令下载。wget https://npm.taobao.org/mirrors/node/v14.9.0/node-v14.9.0-linux-x64.tar.xz2.解压 .xz

import pycharm setting_pycharm导入源码的具体步骤_neo_will_mvp的博客-程序员信息网_import pycharm settings

pycharm导入源码的方法:1、打开pycharm,依次点击File、Settings选项;2、点击打开Project Structure选项;3、点击Add Content Root选项,根据需要添加源码文件路径即可。具体方法:首先选中File选项卡,点击Settings选项;然后点击Project Structure选项;最后添加想要导入的文件路径即可。...

随便推点

树莓派2B设置固定ip_zhangjianying的博客-程序员信息网

​​不要修改/etc/network/interfaces文件在/etc/dhcpcd.conf文件后面增加interface eth0static ip_address=192.168.31.88/24static routers=192.168.31.1static domain_name_servers=192.168.31.1然后重启网络或树莓派...

Android开发技巧总结_孙朝阳的博客-程序员信息网_android 开发技巧

1、获取全局Context 编写Application public class MyApplication extends Application { private static Context context; @Override public void onCreate() { //获取Context co...

量产omv系统_二叉树不是树_ZJY的博客-程序员信息网_omv查看ip

0 前言希望将一台主机中的omv系统(基于debian)迁至另一台主机,共需要以下几个步骤:备份源主机的系统分区为镜像(img)存储至U盘(容量至少大于系统分区)目标主机安装完整debian系统,包含EFI分区、系统分区、交换分区、数据分区恢复镜像至目标主机中的系统分区(而非整个硬盘),保留目标主机debian系统的grub引导修复目标主机的grub引导omv设置更新总体思想:分区(源主机)——镜像(U盘)——分区(目标主机)补充工作:在目标主机上修复grub引导1 前期准备再生

求快速幂(反复平方法+快速幂算法)_SDAU_20175962的博客-程序员信息网_反复平方法

https://www.luogu.org/problemnew/show/P1226反复平方法板子(加取余)#include&amp;amp;amp;lt;iostream&amp;amp;amp;gt;using namespace std;typedef long long ll;ll poww(ll a, ll b,ll n){ ll d=1,t=a; while(b&amp;amp;amp;gt;0) { ...

开创学习的四核时代-iTOP-4412开发板开源硬件平台_迅为电子的博客-程序员信息网

iTOP-4412开发板现在比较热门的开发板,笔者近期入了一套。也推荐给初学ARM的朋友学习,4412开发板搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与超大容量,独家配备三星S5M8767电源管理,接口丰富,性能强劲。另外迅为专为开发板初学者量身打造的手把手全视频讲义,让高端ARM开发像单片机一样简单。

【转】数据预处理之独热编码(One-Hot Encoding)_weixin_30586257的博客-程序员信息网

原文链接:http://blog.csdn.net/dulingtingzi/article/details/51374487问题由来在很多机器学习任务中,特征并不总是连续值,而有可能是分类值。例如,考虑一下的三个特征:["male","female"]["from Europe","from US","from Asia"]["uses Firefox","u...

推荐文章

热门文章

相关标签