手寫Tutorial 01例子是創建Windows窗口,并創建D3D設備。 97行,PeekMessage(&msg , 0 , 0 , 0 , PM_REMOVE)第二個參數如果改成PeekMessage(&msg , hWnd , 0 , 0 , PM_REMOVE)就會出現無法退出程序的問題!請注意! 44行,g_pd3dDevice->Present(0 , 0 , 0 , 0);這句話千萬不要漏掉哦!否則就會顯示花瓶! ??1 #include?<d3dx9.h> ??2 ??3 #define?SAFE_RELEASE(o)?{if(o){o->Release();o=0;}} ??4 ??5 LPDIRECT3D9?g_pD3D?=?0; ??6 LPDIRECT3DDEVICE9?g_pd3dDevice?=?0; ??7 ??8 //?創建D3D設備 ??9 HRESULT?InitD3D(HWND?hWnd) ?10  { ?11 ????//?創建D3D?SDK ?12 ????if(NULL?==?(g_pD3D?=?Direct3DCreate9(D3D_SDK_VERSION))) ?13 ????????return?E_FAIL; ?14 ?15 ?16 ????D3DPRESENT_PARAMETERS?d3dpp; ?17 ????memset(&d3dpp?,?0?,?sizeof(d3dpp)); ?18 ????d3dpp.Windowed?=?true; ?19 ????d3dpp.BackBufferFormat?=?D3DFMT_UNKNOWN; ?20 ????d3dpp.SwapEffect?=?D3DSWAPEFFECT_DISCARD; ?21 ?22 ????RECT?rect; ?23 ????GetClientRect(hWnd?,?&rect); ?24 ????d3dpp.BackBufferWidth?=?rect.right?-?rect.left; ?25 ????d3dpp.BackBufferHeight?=?rect.bottom?-?rect.top; ?26 ?27 ????if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT ?28 ????????,?D3DDEVTYPE_HAL ?29 ????????,?hWnd ?30 ????????,?D3DCREATE_HARDWARE_VERTEXPROCESSING ?31 ????????,?&d3dpp?,?&g_pd3dDevice ?32 ????????))) ?33 ????????return?E_FAIL; ?34 ???? ?35 ????return?S_OK; ?36 } ?37 ?38 //?渲染 ?39 void?Render() ?40  { ?41 ????//?清空成藍色 ?42 ????g_pd3dDevice->Clear(0?,?0?,?D3DCLEAR_TARGET?,?D3DCOLOR_XRGB(0?,?0?,?255)?,?1.0f?,?0); ?43 ????//?顯示 ?44 ????g_pd3dDevice->Present(0?,?0?,?0?,?0); ?45 } ?46 ?47 //?清除占有的內存 ?48 void?CleanUp() ?49  { ?50 ????SAFE_RELEASE(g_pD3D); ?51 } ?52 ?53 //?消息處理 ?54 LRESULT?WINAPI?MsgProc(HWND?hWnd?,?UINT?message?,?WPARAM?wParam?,?LPARAM?lParam) ?55  { ?56 ????switch(message) ?57 ???? { ?58 ????case?WM_DESTROY: ?59 ????????CleanUp(); ?60 ????????PostQuitMessage(0); ?61 ????????return?0; ?62 ????????break; ?63 ????default: ?64 ????????break; ?65 ????} ?66 ????return?DefWindowProc(hWnd,?message?,?wParam?,?lParam); ?67 } ?68 ?69 //?Windows入口 ?70 int?WINAPI?WinMain(IN?HINSTANCE?hInstance,?IN?HINSTANCE?hPrevInstance,?IN?LPSTR?lpCmdLine,?IN?int?nShowCmd) ?71  { ?72 ????WNDCLASS?wndClass; ?73 ????memset(&wndClass?,?0?,?sizeof(wndClass)); ?74 ????wndClass.hInstance?=?hInstance; ?75 ????wndClass.lpszClassName?=?"Tutorial01"; ?76 ????wndClass.style?=?0; ?77 ????wndClass.lpfnWndProc?=?MsgProc; ?78 ????//?注冊窗口類 ?79 ????RegisterClass(&wndClass); ?80 ?81 ????//?創建窗口 ?82 ????HWND?hWnd?=?CreateWindow("Tutorial01"?,?"Tutorial01?:?CreateDevice"?,?WS_OVERLAPPEDWINDOW? ?83 ????????,?0?,?0?,?512?,?512?,?GetDesktopWindow() ?84 ????????,?0?,?wndClass.hInstance?,?0); ?85 ?86 ????//?顯示窗口 ?87 ????ShowWindow(hWnd?,?SW_SHOWDEFAULT); ?88 ????UpdateWindow(hWnd); ?89 ?90 ????if(SUCCEEDED(InitD3D(hWnd))) ?91 ???? { ?92 ????????//?消息循環 ?93 ????????MSG?msg; ?94 ????????memset(&msg?,?0?,?sizeof(msg)); ?95 ????????while(msg.message?!=?WM_QUIT) ?96 ???????? { ?97 ????????????if(PeekMessage(&msg?,?0?,?0?,?0?,?PM_REMOVE)) ?98 ???????????? { ?99 ????????????????DispatchMessage(&msg); 100 ????????????????TranslateMessage(&msg); 101 ????????????} 102 ????????????else 103 ???????????? { 104 ????????????????Render(); 105 ????????????} 106 ????????} 107 ????} 108 109 ????CleanUp(); 110 ????UnregisterClass("Tutorial01"?,?wndClass.hInstance); 111 ????return?0; 112 } 113 114 115
|