0
#include <Windows.h>
#include <d3dx9.h>
#include <sstream>
#include <string>

void initD3D(HWND hWnd);
void Render();
void cleanD3D();

LPDIRECT3D9 d3d ;
LPDIRECT3DDEVICE9 d3ddev;


LRESULT CALLBACK MainWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam, LPARAM lParam)
{
    switch(uMsg){
     case WM_DESTROY:
          PostQuitMessage(0);
          return 0;
    }
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,  HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    HWND mainWnd;
    WNDCLASSEX wndClassData;
    memset(&wndClassData, 0x00, sizeof(wndClassData));

    wndClassData.cbSize = sizeof(wndClassData);
    wndClassData.style = CS_CLASSDC;
    wndClassData.lpfnWndProc = MainWindowProc;
    wndClassData.hInstance = hInstance;
    wndClassData.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClassData.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wndClassData.lpszClassName="ColourMatchingWindow";

    RegisterClassEx(&wndClassData);

        mainWnd = CreateWindowEx(NULL,
        "wndClass",
        "ColourMatching",
        WS_OVERLAPPEDWINDOW,
        100,100,
        800,600,
        GetDesktopWindow(),
        NULL,
        hInstance,
        NULL);

    ShowWindow(mainWnd, nCmdShow);
    initD3D(mainWnd);
    MSG msg;
    for(;;){
    while(PeekMessage(&msg, NULL,0,0,PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    if(msg.message==WM_QUIT)
      break;
        Render();
    }
    cleanD3D();
    UnregisterClass("ColourMatchingWindow", hInstance);
return 0;
}

void initD3D(HWND hWnd){
    d3d = Direct3DCreate9(D3D_SDK_VERSION);

    D3DDISPLAYMODE displayMode;
    d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode);

    D3DPRESENT_PARAMETERS d3dpp;
    memset(&d3dpp, 0, sizeof(d3dpp));

    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;
    d3dpp.BackBufferFormat = displayMode.Format;
    d3dpp.BackBufferCount = 1;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

   d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);
}

//------------------------问题从这里开始------------ -

void Render(){
    d3ddev->Clear(0, NULL, (D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER), 
    D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
    d3ddev->BeginScene();
    d3ddev->EndScene();
    d3ddev->Present(NULL, NULL, NULL, NULL);  
    }

//------------------------问题结束---------- ---------

void cleanD3D(){
            d3d->Release();
            d3ddev->Release();
    }

VS2010 在render()给了我有关访问冲突的错误消息,我尝试调试代码,意识到错误可能是由于 d3ddev 没有分配给正确的值引起的,但我对它为什么没有分配感到很困惑一个合适的值,它背后的逻辑是什么?我认为一旦调用CreateDevice()就会创建 d3ddev ,但由于某些原因它不是。

4

0 回答 0