DirectX 10教程2:创建一个框架和窗口

这篇教程介绍了如何创建一个DirectX 10编程的基础框架,包括WinMain方法、System类、Input类和Graphics类的详细设计。框架简化了程序结构,处理窗体功能、用户输入和图形代码。通过理解这个框架,读者可以为后续的DirectX 10教程打下基础。
摘要由CSDN通过智能技术生成


源代码下载:dx10tut02.zip

在开始DirectX 10编程之前,我推荐你创建一个简单的框架,这个框架用于处理基本的窗体功能,并可以非常容易地进行扩展。因为本教程的目的是为了演示DirectX 10的各项功能,因此我会将框架的代码尽量精简。

框架

框架包含4个项目。它有一个WinMain方法处理程序的入口点,有一个system类封装了整个应用程序,并可以从WinMain方法中调用,在system类中我们还使用了一个input类处理用户输入,一个graphics类处理DirectX图形代码。框架结构如下图所示:

框架结构

图1 框架结构

下面我们看一下在main.cpp文件中的WinMain方法。

WinMain

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Filename: main.cpp
#include "systemclass.h"
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pScmdline, int iCmdshow)
{
     SystemClass* System;
     bool result;
     
     // 创建system对象。
     System = new SystemClass;
     if (!System)
     {
         return 0;
     }
     
     //初始化并运行system对象。
     result = System->Initialize();
     if (result)
     {
         System->Run();
     }
     
     // 关闭并释放system对象。
     System->Shutdown();
     
     delete System;
     System = 0;
     return 0;
}

WinMain方法相当简单。我们创建了system对象并进行初始化,如果初始化成功则调用system类的Run方法。Run方法运行自己的循环过程并执行所有的程序代码。当Run方法完成后,关闭system对象并进行清除。这样我们就简化了程序结构,将整个程序封装在了system类中。下面看一下system类的头文件。

Systemclass.h

1
2
3
4
5
// Filename: systemclass.h
#ifndef _SYSTEMCLASS_H_
#define _SYSTEMCLASS_H_

我们定义了WIN32_LEAN_AND_MEAN,这样就可以通过排除某些不常用的API减小Win32头文件,可以加速程序生成过程。


1
2
3
4
///
// PRE-PROCESSING DIRECTIVES //
///
#define WIN32_LEAN_AND_MEAN

需要包含Windows.h头文件,这样我们就可以调用方法创建/销毁窗口,并可以使用其他有用的win32方法。


1
2
3
4
//
// INCLUDES //
//
#include <windows.h>

我们还包含了框架中另两个类的头文件,这样我们就可以在system类中使用它们。


1
2
3
4
5
///
// MY CLASS INCLUDES //
///
#include "inputclass.h"
#include "graphicsclass.h"

类的定义很简单。有Initialize,Shutdown和Run方法,它们可以被定义在这个类中的WinMain调用。还有一些私有方法可以在这个方法中被调用。还包含了一个MessageHandler方法用于处理来自于windows系统的消息。最后有一些私有变量m_Input和m_Graphics指向处理输入和图形的两个对象。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Class name: SystemClass
class SystemClass
{
public :
     SystemClass();
     SystemClass( const SystemClass&);
     ~SystemClass();
 
     bool Initialize();
     void Shutdown();
     void Run();
 
     LRESULT CALLBACK MessageHandler( HWND , UINT , WPARAM , LPARAM );
 
private :
     bool Frame();
     void InitializeWindows( int &, int &);
     void ShutdownWindows();
 
private :
     LPCWSTR m_applicationName;
     HINSTANCE m_hinstance;
     HWND m_hwnd;
 
     InputClass* m_Input;
     GraphicsClass* m_Graphics;
};
 
 
/
// FUNCTION PROTOTYPES //
/
static LRESULT CALLBACK WndProc( HWND , UINT , WPARAM , LPARAM );
 
 
/
// GLOBALS //
/
static SystemClass* ApplicationHandle = 0;
 
 
#endif

这个类中还包含了WndProc方法和ApplicationHandle指针,这样我们就可以将窗体消息处理重定向到system类中的MessageHandler方法。下面看一下system类的源文件:

Systemclass.cpp

1
2
3
4
// Filename: systemclass.cpp
#include "systemclass.h"

在类的构造函数中将对象指针初始化为null。这很重要,因为如果这些对象的初始化过程失败,那么以后的Shutdown方法会试图清理这些对象,如果这个对象不为null,程序就会认为它是已经正确创建的对象,需要被清理。将所有指针和变量初始化为null是一个编程的好习惯,如果你不进行这个步骤,某些释放操作可能会失败。


1
2
3
4
5
SystemClass::SystemClass()
{
     m_Input = 0;
     m_Graphics = 0;
}

下面的代码我创建了一个空的复制构造函数和一个空的析构函数。在这个类中我们不需要它们,但如果没有定义,一些编译器会自动帮你生成这两个函数,所以我将它们设为空白。你还会注意到在析构函数中没有清理任何对象,这个步骤是在Shutdown方法中进行的。这样做的理由是我无法确定清理操作是否会被调用,某些windows函数(例如ExitThread())不会调用类析构函数,可能导致内存泄露。


1
2
3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值