• 热门专题

Directx11教程(3) 一个最基本D3D应用程序(1)

作者:迈克老狼2012  发布日期:2012-03-21 20:34:36
Tag标签:Directx11  D3D应用程序  
  • 在上一篇程序代码的基础上,这次我们将增加2个类:

    InputClass,键盘处理的代码将放在这个类里面,GraphicsClass类,D3D渲染的代码放在这个类里。

    增加这个两个类后,应用的程序的框架如下:

     


     

    main.cpp代码如下:

     

    #include "SystemClass.h"
    
    //应用程序入口main函数 
    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; 
        }
    
    System Class类有点小变动,增加了两个成员变量m_Input,m_Graphics,分别处理输入和渲染的操作。
    
    SystemClass.h代码如下:
    
    #pragma once 
    //定义该宏能够减少windows头文件的大小,使编译器不编译一些不必要的文件,加快编译时间 
    #define WIN32_LEAN_AND_MEAN
    
    #include <windows.h>
    
    #include "InputClass.h" 
    #include "GraphicsClass.h"
    
    class SystemClass 
        { 
        public: 
            SystemClass(void); 
            SystemClass(const SystemClass &); 
            ~SystemClass(void);
    
            bool Initialize(); 
            void Shutdown(); 
            void Run();
    
            LRESULT CALLBACK MessageHandler(HWND, UINT, WPARAM, LPARAM); 
        private: 
            bool Frame(); 
            void InitializeWindows(int&, int&); 
            void ShutdownWindows();
    
            LPCWSTR m_applicationName; 
            HINSTANCE m_hinstance; 
            HWND m_hwnd;
    
           //InputClass和GraphicsClass是SystemClass的两个成员变量 
            InputClass* m_Input; 
            GraphicsClass* m_Graphics; 
        };
    
    //定义静态的回调函数以及应用程序句柄 
    //因为定义窗口类时候,必须指定窗口回调函数,所以我们用静态的回调函数WndProc 
    static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    static SystemClass* ApplicationHandle = 0;
    
    
    SystemClass.cpp代码如下:
    
    
    #include "SystemClass.h"
    
    
    SystemClass::SystemClass(void) 
        { 
        m_Input = 0; 
        m_Graphics = 0; 
        }
    
    SystemClass::SystemClass(const SystemClass &) 
        {
    
        }
    
    SystemClass::~SystemClass(void) 
        { 
        }
    
    //调用窗口初始化函数和其它一些类的初始化函数 
    bool SystemClass::Initialize() 
        { 
        int screenWidth = 0, screenHeight = 0;
    
        // 初始化窗口 
        InitializeWindows(screenWidth, screenHeight);
    
        //创建input对象处理键盘输入 
        m_Input = new InputClass; 
        if(!m_Input) 
            { 
            return false; 
            }
    
        // 初始化输入对象. 
        m_Input->Initialize();
    
        // 创建图形对象,这个对象将渲染应用程序中的所有物体 
        m_Graphics = new GraphicsClass; 
        if(!m_Graphics) 
            { 
            return false; 
            } 
        // 初始化图形对象 
        result = m_Graphics->Initialize(screenWidth, screenHeight, m_hwnd); 
        if(!result) 
            { 
            return false; 
            }
    
    
        return true; 
        }
    
    void SystemClass::Shutdown() 
        { 
        //其它类的一些销毁工作 
        if(m_Graphics) 
            { 
            m_Graphics->Shutdown(); 
            delete m_Graphics; 
            m_Graphics = 0; 
            }
    
        if(m_Input) 
            { 
            delete m_Input; 
            m_Input = 0; 
            } 
       // 执行一些销毁工作. 
        ShutdownWindows();
    
        }
    
    //处理消息 
    void  SystemClass::Run() 
        { 
        MSG msg; 
        bool done, result ;
    
    
        // 初始化消息结构. 
        ZeroMemory(&msg, sizeof(MSG));
    
        // 循环进行消息处理,如果接收到WM_QUIT. 
        done = false; 
        while(!done) 
            { 
            // 处理windows消息. 
            if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
                { 
                TranslateMessage(&msg); 
                DispatchMessage(&msg); 
                }
    
            // 接收到WM_QUIT消息,退出程序. 
            if(msg.message == WM_QUIT) 
                { 
                done = true; 
                } 
            else 
                {
    
                //我们的渲染或者其它处理,可以放在这儿 
                //.... 
                //..... 
                result = Frame(); 
                if(!result) 
                    { 
                    done = true; 
                    } 
                }
    
            }
    
        return; 
        }
    
    bool SystemClass::Frame() 
        { 
        bool result;
    
    
        //检测用户是否按下ESC键,如果按下,退出程序. 
        if(m_Input->IsKeyDown(VK_ESCAPE)) 
            { 
            return false; 
            }
    
       // 执行帧渲染函数. 
       bool result = m_Graphics->Frame(); 
        if(!result) 
            { 
            return false; 
            } 
        return true; 
        }
    
    //初始化窗口类,创建应用程序窗口 
    void SystemClass::InitializeWindows(int& screenWidth, int& screenHeight) 
        { 
        WNDCLASSEX wc; 
        DEVMODE dmScreenSettings; 
        int posX, posY;
    
       //得到应用程序对象指针 
        ApplicationHandle = this;
    
        // 得到应用程序实例句柄 
        m_hinstance = GetModuleHandle(NULL);
    
        // 应用程序名字 
        m_applicationName = L"Engine";
    
        // 设置窗口类参数. 
        wc.style         = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; 
        wc.lpfnWndProc   = WndProc; //指定回调函数 
        wc.cbClsExtra    = 0; 
        wc.cbWndExtra    = 0; 
        wc.hInstance     = m_hinstance; 
        wc.hIcon         = LoadIcon(NULL, IDI_WINLOGO); 
        wc.hIconSm       = wc.hIcon; 
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW); 
        wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //默认黑色窗口黑色背景 
        wc.lpszMenuName  = NULL; 
        wc.lpszClassName = m_applicationName; 
        wc.cbSize        = sizeof(WNDCLASSEX);
    
        // 注册窗口类 
        RegisterClassEx(&wc);
    
        // 得到windows桌面分辨率 
        screenWidth  = GetSystemMetrics(SM_CXSCREEN); 
        screenHeight = GetSystemMetrics(SM_CYSCREEN);
    
        // 根据是否全屏设置不同的分辨率. 
        if(FULL_SCREEN) 
            { 
           //全屏模式下,设置窗口大小为windows桌面分辨率. 
            memset(&dmScreenSettings, 0, sizeof(dmScreenSettings)); 
            dmScreenSettings.dmSize       = sizeof(dmScreenSettings); 
            dmScreenSettings.dmPelsWidth  = (unsigned long)screenWidth; 
            dmScreenSettings.dmPelsHeight = (unsigned long)screenHeight; 
            dmScreenSettings.dmBitsPerPel = 32;            
            dmScreenSettings.dmFields     = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
    
            // 临时设置显示设备为全屏模式,注意:应用程序退出时候,将恢复系统默认设置。 
            ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
    
            // 设置窗口的默认位置为(0,0). 
            posX = posY = 0; 
            } 
        else 
            { 
            // 窗口模式:800*600. 
            screenWidth  = 800; 
            screenHeight = 600;
    
            // 窗口位置,posX, posY窗口左上角坐标 
            posX = (GetSystemMetrics(SM_CXSCREEN) - screenWidth)  / 2; 
            posY = (GetSystemMetrics(SM_CYSCREEN) - screenHeight) / 2; 
            }
    
       // 全屏和窗口使用不同的参数. 
        if( FULL_SCREEN) 
            { 
            m_hwnd = CreateWindowEx(WS_EX_APPWINDOW, m_applicationName, m_applicationName, 
                WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_POPUP, 
                posX, posY, screenWidth, screenHeight, NULL, NULL, m_hinstance, NULL); 
            } 
        else 
            { 
            m_hwnd = CreateWindowEx(WS_EX_APPWINDOW, m_applicationName, m_applicationName, 
                WS_OVERLAPPEDWINDOW, 
                posX, posY, screenWidth, screenHeight, NULL, NULL, m_hinstance, NULL); 
            }
    
        // 显示窗口并设置其为焦点. 
        ShowWindow(m_hwnd, SW_SHOW); 
        SetForegroundWindow(m_hwnd); 
        SetFocus(m_hwnd);
    
        // 隐藏鼠标. 
        //ShowCursor(false);
    
    
        }
    
    void SystemClass::ShutdownWindows() 
        { 
        //显示光标. 
        //ShowCursor(true);
    
        // 恢复默认显示设置. 
        if(FULL_SCREEN) 
            { 
            ChangeDisplaySettings(NULL, 0); 
            }
    
        // 销毁窗口 
        DestroyWindow(m_hwnd); 
        m_hwnd = NULL;
    
        // 销毁应用程序实例. 
        UnregisterClass(m_applicationName, m_hinstance); 
        m_hinstance = NULL; 
        ApplicationHandle = NULL;
    
        return;
    
        }
    
    LRESULT CALLBACK SystemClass::MessageHandler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) 
        {
    
        switch(umsg) 
            { 
            // 检测按键消息. 
        case WM_KEYDOWN: 
            { 
            m_Input->KeyDown((unsigned int)wparam); 
            return 0; 
            }
    
        case WM_KEYUP: 
            { 
            m_Input->KeyUp((unsigned int)wparam); 
            return 0; 
            } 
            //任何其它消息发送到windows缺省处理. 
        default: 
            { 
            return DefWindowProc(hwnd, umsg, wparam, lparam); 
            } 
            } 
        }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT umessage, WPARAM wparam, LPARAM lparam) 
        { 
        switch(umessage) 
            {
    
           // 窗口销毁消息. 
        case WM_DESTROY: 
            { 
            PostQuitMessage(0); 
            return 0; 
            }
    
            // 窗口关闭消息. 
        case WM_CLOSE: 
            { 
            PostQuitMessage(0);        
            return 0; 
            }
    
            //MessageHandle过程处理其它所有消息. 
        default: 
            { 
            return ApplicationHandle->MessageHandler(hwnd, umessage, wparam, lparam); 
            } 
            } 
        }
    
    InputClass.h代码如下:
    
    #pragma once 
    class InputClass 
        { 
        public: 
            InputClass(void); 
            InputClass(const InputClass&); 
            ~InputClass(void);
    
            void Initialize();
    
            void KeyDown(unsigned int); 
            void KeyUp(unsigned int);
    
            bool IsKeyDown(unsigned int);
    
        private: 
            bool m_keys[256];//用来存放256个虚拟键是否被按下 
        }; 
    InputClass.cpp代码如下:
    
    #include "InputClass.h"
    
    
    InputClass::InputClass(void) 
        { 
        }
    
    InputClass::InputClass(const InputClass&) 
        {
    
        }
    
    InputClass::~InputClass(void) 
        { 
        }
    
    void InputClass::Initialize() 
        { 
        int i;
    
        // 初始所有的键都是非按下状态. 
        for(i=0; i<256; i++) 
            { 
            m_keys[i] = false; 
            }
    
        return; 
        }
    
    
    void InputClass::KeyDown(unsigned int input) 
        { 
        //键被按下. 
        m_keys[input] = true; 
        return; 
        }
    
    
    void InputClass::KeyUp(unsigned int input) 
        { 
        //释放按键. 
        m_keys[input] = false; 
        return; 
        }
    
    
    bool InputClass::IsKeyDown(unsigned int key) 
        { 
        // 判断键是否被按下? 
        return m_keys[key]; 
        }
    
    GraphicsClass.h代码如下:
    
    #pragma once
    
    #include <windows.h>
    
    
    ///////////// 
    // GLOBALS // 
    ///////////// 
    const bool FULL_SCREEN = false; //是否全屏 
    const bool VSYNC_ENABLED = true; //是否垂直同步 
    const float SCREEN_DEPTH = 1000.0f; //深度,远点 
    const float SCREEN_NEAR = 0.1f; //深度,近点
    
    class GraphicsClass 
        { 
        public: 
            GraphicsClass(void); 
            GraphicsClass(const GraphicsClass&); 
            ~GraphicsClass(void); 
            bool Initialize(int, int, HWND); 
            void Shutdown(); 
            bool Frame();
    
        private: 
            bool Render(); 
        };
    
    GraphicsClass.cpp代码如下:
    
    #include "GraphicsClass.h"
    
    
    GraphicsClass::GraphicsClass(void) 
        { 
        }
    
    GraphicsClass::GraphicsClass(const GraphicsClass&) 
        {
    
        } 
    GraphicsClass::~GraphicsClass(void) 
        { 
        }
    
    bool GraphicsClass:: Initialize(int screenWidth, int screenHeight, HWND hwnd) 
        {
    
        return true; 
        }
    
    void GraphicsClass::Shutdown() 
        {
    
        return; 
        }
    
    
    bool GraphicsClass::Frame() 
        {
    
        return true; 
        }
    
    
    bool GraphicsClass::Render() 
        {
    
        return true; 
        }
    
    
About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规