Windows编程简介-DX的Windows编程基础

要使用Direct3D API(应用程序编程接口),有必要创建一个带有主窗口的Windows(Win32)应用程序,我们将在其中呈现我们的3D场景。本文可作为使用本机Win32 API编写Windows应用程序的介绍。通俗讲,Win32 API是一组低级函数和结构,以C编程语言向我们公开接口,使我们能够创建Windows应用程序。例如,要定义一个窗口类,我们填写一个Win32 API WNDCLASS结构的实例;创建一个窗口,我们使用Win32 API的CreateWindow函数; 为了通知Windows显示特定的窗口,我们使用Win32 API函数ShowWindow

Windows编程是一个巨大的课题,本文仅介绍使用Direct3D所需的部分。对于Windows编程感兴趣的读者可以参考Charles Petzold编写的《Programming Windows》第5版。使用Microsoft技术的另一个宝贵资源是MSDN库,它通常包含在Microsoft的Visual Studio中,也可以通过www.msdn.microsoft.com在线阅读。一般来说,如果您想要了解有关Win32函数或结构的更多信息,请转至MSDN并搜索该函数或结构以获取完整文档。如果本文中提到Win32函数或结构,并且没有详细说明它,请你在MSDN中查看函数的含义。

学习目标:
1.理解Windows编程中使用的事件驱动编程模型。
2.学习创建使用Direct3D必需的Windows应用程序所需的底层代码。

为了避免混淆,我们将使用大写’W’来指代Windows操作系统,我们将使用小写’w’来指代在Windows中运行的特定窗口。

1、概述

顾名思义,Windows编程的主要主题之一就是编程窗口。Windows应用程序的许多组件都是窗口,例如主应用程序窗口,菜单,工具栏,滚动条,按钮和其他对话框控件。因此,Windows应用程序通常由多个窗口组成。 在开始更完整的讨论之前我们先来了解一下Windows编程概念的简要概述。

1.1资源

在Windows中,多个应用程序可以同时运行。因此,硬件资源(如CPU周期,内存,甚至显示器屏幕)必须在多个应用程序之间共享。为了防止由于多个应用程序在没有任何组织的情况下访问/修改资源而导致混乱,Windows应用程序不能直接访问硬件。Windows的主要工作之一是管理目前实例化的应用程序并处理它们之间的资源分配。因此,为了让我们的应用程序做一些可能影响另一个正在运行的应用程序的事情,它必须通过Windows实现。例如,要显示一个窗口,你必须调用Win32 API函数ShowWindow; 您也无法直接读写内存。

1.2事件,消息队列,消息和消息循环

Windows应用程序遵循事件驱动的编程模型。通常情况下,Windows应用程序挂起并等待事件发生。事件可以通过多种方式产生; 一些常见的例子是按键,鼠标点击,以及窗口创建,调整大小,移动,关闭,最小化,最大化或变得可见。

发生事件时,Windows会向应用程序发送消息,并将消息添加到应用程序的消息队列中,消息队列只是存储应用程序消息的优先级队列。 应用程序不断地检查消息队列中的消息循环中的消息,并且当它接收到消息时,它会将消息分派到消息所针对的特定窗口的窗口过程中。 (请记住,应用程序可以包含多个窗口。)每个窗口都有一个关联的函数,称为窗口过程。窗口过程是我们实现的函数,它包含要响应特定消息而执行的代码。例如,我们可能想在按Escape键时销毁一个窗口。在我们的窗口过程中,我们会写:

case WM_KEYDOWN:
    if(wParam == VK_ESCAPE)
        DestroyWindow(ghMainWnd);
    return 0;

窗口不处理的消息应该被转发到默认的窗口过程,然后处理该消息。Win32 API提供默认的窗口过程,称为DefWindowProc

总而言之,用户或应用程序会做一些事情来产生事件。 操作系统发现事件针对的应用程序,并向应用程序发送一条消息作为回应。 然后将消息添加到应用程序的消息队列中。应用程序不断地检查消息队列中的消息。 当它收到一条消息时,应用程序将它分派到消息所针对的窗口的窗口过程中。 最后,窗口过程响应该消息执行指令。

图(A.1)总结了事件驱动的编程模型


图A.1 事件驱动的编程模型。

1.3 GUI

大多数Windows程序都提供了一个用户可以使用的GUI(图形用户界面)。一个典型的Windows应用程序有一个主窗口,一个菜单,工具栏和其他一些控件。图A.2显示并标识了一些常见的GUI元素。 对于Direct3D游戏编程,我们不需要花哨的GUI。 事实上,我们所需要的只是一个主窗口,客户区将用于渲染我们的3D世界。


图A.2 典型的Windows应用程序GUI。客户区是应用程序的整个大型白色矩形空间。通常,这个区域是用户查看大部分程序输出的地方。当我们编写Direct3D应用程序时,我们将3D场景渲染到窗口的客户区。

1.4 Unicode

本质上,Unicode(http://unicode.org/)使用16位值来表示一个字符。 这使我们能够代表更大的字符集来支持国际字符和其他符号。 对于C ++中的Unicode,我们使用宽字符类型wchar_t。在32位和64位Windows中,wchar_t是16位。当使用宽字符时,我们必须在一个字符串前加大写字母L; 例如:

const wchar_t* wcstrPtr = L“Hello, World!”;

L告诉编译器将字符串视为一个宽字符的字符串(即为wchar_t而不是char)。另一个重要的问题是我们需要使用字符串函数的宽字符版本。例如,要获得字符串的长度,我们需要使用wcslen而不是strlen; 复制一个字符串我们需要使用wcscpy而不是strcpy; 为了比较两个字符串,我们需要使用wcscmp而不是strcmp。这些函数的宽字符版本使用wchar_t指针而不是char指针。C ++标准库还提供了字符串类的宽字符版本:std :: wstring。Windows头文件WinNT.h也定义了:

typedef wchar_t WCHAR; // wc, 16-bit UNICODE character

2、基本的WINDOWS应用程序

以下是一个功能齐全但简单的Windows程序的代码。尽量结合注视读懂代码。之后我会对代码进行详细讲解。建议您使用VS创建项目,手动输入代码,编译代码并将其作执行。请注意,对于Visual C ++,您必须创建一个“Win32应用程序项目”,而不是“Win32控制台应用程序项目”。

//=====================================================================
// Win32Basic.cpp by Frank Luna (C) 2008 All Rights Reserved.
//
// Illustrates the minimal amount of the Win32 code needed for
// Direct3D programming.
//=====================================================================
// Include the windows header file; this has all the Win32 API
// structures, types, and function declarations we need to program
// Windows.
#include <windows.h>
// The main window handle; this is used to identify a
// created window.
HWND ghMainWnd = 0;
// Wraps the code necessary to initialize a Windows
// application. Function returns true if initialization
// was successful, otherwise it returns false.
bool InitWindowsApp(HINSTANCE instanceHandle, int show);
// Wraps the message loop code.
int Run();
// The 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值