DirectX 9窗口不显示

时间:2014-07-25 02:10:37

标签: c++ directx-9

我正在尝试创建一个简单的DirectX 9程序,它创建一个窗口模式窗口并显示它(窗口中没有任何东西会被绘制)。当我编译程序时,我没有错误。当我运行程序时,窗口不显示,程序终止。

/*
* A simple DirectX 9 program to create a windowed mode window with nothing drawn on it. No errors when compiled or ran, but no window  * pops up and program terminates almost immediately.
*/

#include <Windows.h>
#include <d3d9.h>
#include <time.h>
#include <iostream>

using namespace std;

//program settings
const string APPTITLE = "Direct3D_Windowed";
const int SCREENW = 1024;
const int SCREENH = 768;


//Direct3D object
LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;

bool gameOver = false;

//macro to detect key presses
#define KEY_DOWN(vk_code)((GetAsyncKeyState(vk_code) & 0x8000) ? 1:0)

/*
* Game initialization function
*/
bool Game_Init(HWND window)
{

    //init Direct3D
    d3d = Direct3DCreate9(D3D_SDK_VERSION);
    if (d3d == NULL)
    {
        return 0;
    }

    //set Direct3D presentation parameters
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    d3dpp.BackBufferCount = 1;

    d3dpp.BackBufferWidth = SCREENW;
    d3dpp.BackBufferHeight = SCREENH;
    d3dpp.hDeviceWindow = window;

    //create Direct3D device
    d3d->CreateDevice(
        D3DADAPTER_DEFAULT,
        D3DDEVTYPE_HAL,
        window,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &d3dpp,
        &d3ddev);

    if (d3ddev == NULL)
    {
        return 0;
    }

    return true;
}

/*
* Game update function
*/
void Game_Run(HWND hwnd)
{
    //make sure the Direct3D device is valid
    if (!d3ddev)
    {
        return;
    }

    //clear the backbuffer to bright green
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0);

    //start rendering
    if (d3ddev->BeginScene())
    {
        //do something?

        //stop rendering
        d3ddev->EndScene();

        //copy back buffer on the screen
        d3ddev->Present(NULL, NULL, NULL, NULL);
    }

    //check for escape key (to exit program)
    if (KEY_DOWN(VK_ESCAPE))
    {
        PostMessage(hwnd, WM_DESTROY, 0, 0);
    }
}

/*
* Game shutdown function
*/
void Game_End(HWND hwnd)
{

    //free the memory
    if (d3ddev)
    {
        d3ddev->Release();
    }
    if (d3d)
    {
        d3d->Release();
    }
}

/*
* Windows event handling function
*/
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_DESTROY:
        gameOver = true;
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hWnd, msg, wParam, lParam);
}

/*
* Main Windows entry function
*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //set the new window's properties
    WNDCLASSEX wc;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WinProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = NULL;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = APPTITLE.c_str();
    wc.hIconSm = NULL;
    RegisterClassEx(&wc);

    //create a new window
        HWND window = CreateWindow(
        APPTITLE.c_str(),       //window class
        APPTITLE.c_str(),       //title bar
        //fullscreen mode
        //WS_EX_TOPMOST | WS_VISIBLE | WS_POPUP,
        //windowed mode 
        WS_OVERLAPPEDWINDOW,    //window style
        CW_USEDEFAULT,          //x position of window
        CW_USEDEFAULT,          //y position of window
        640,                    //width of the window
        480,                    //height of the window
        NULL,                   //parent window
        NULL,                   //menu
        hInstance,              //appkication instance
        NULL);                  //window parameters


    //was there an error creating the window?
    if (window == 0)
    {
        return 0;
    }

    //display the window
    ShowWindow(window, nCmdShow);
    UpdateWindow(window);

    //initialize the game
    if (!Game_Init(window))
    {
        return 0;
    }

    //main message loop
    MSG message;
    while (!gameOver)
    {
        if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&message);
            DispatchMessage(&message);
        }
        Game_Run(window);
    }

    Game_End(window);

    return message.wParam;
}

1 个答案:

答案 0 :(得分:0)

设置窗口属性时,需要设置cbSize成员。

wc.cbSize = sizeof(WNDCLASSEX);