D3DEnv.cpp
上传用户:junlon
上传日期:2022-01-05
资源大小:39075k
文件大小:5k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // D3DEnv.cpp : 定义应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "D3DEnv.h"
  5. #include "D3DEnvClass.h"
  6. #define MAX_LOADSTRING 100
  7. // 全局变量:
  8. HINSTANCE hInst; // 当前实例
  9. TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
  10. TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
  11. // 全局变量,D3D环境对象
  12. CZFXD3DEnv g_d3dEnv;
  13. // 此代码模块中包含的函数的前向声明:
  14. ATOM MyRegisterClass(HINSTANCE hInstance);
  15. BOOL InitInstance(HINSTANCE, int);
  16. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  17. LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  18. int APIENTRY _tWinMain(HINSTANCE hInstance,
  19.                      HINSTANCE hPrevInstance,
  20.                      LPTSTR    lpCmdLine,
  21.                      int       nCmdShow)
  22. {
  23.   // TODO: 在此放置代码。
  24. MSG msg;
  25. HACCEL hAccelTable;
  26. // 初始化全局字符串
  27. LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  28. LoadString(hInstance, IDC_D3DENV, szWindowClass, MAX_LOADSTRING);
  29. MyRegisterClass(hInstance);
  30. // 执行应用程序初始化:
  31. if (!InitInstance (hInstance, nCmdShow)) 
  32. {
  33. return FALSE;
  34. }
  35. hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_D3DENV);
  36. // 主消息循环:
  37. while (GetMessage(&msg, NULL, 0, 0)) 
  38. {
  39. if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
  40. {
  41. TranslateMessage(&msg);
  42. DispatchMessage(&msg);
  43. }
  44. }
  45. return (int) msg.wParam;
  46. }
  47. //
  48. //  函数: MyRegisterClass()
  49. //
  50. //  目的: 注册窗口类。
  51. //
  52. //  注释: 
  53. //
  54. //    仅当希望在已添加到 Windows 95 的
  55. //    “RegisterClassEx”函数之前此代码与 Win32 系统兼容时,
  56. //    才需要此函数及其用法。调用此函数
  57. //    十分重要,这样应用程序就可以获得关联的
  58. //   “格式正确的”小图标。
  59. //
  60. ATOM MyRegisterClass(HINSTANCE hInstance)
  61. {
  62. WNDCLASSEX wcex;
  63. wcex.cbSize = sizeof(WNDCLASSEX); 
  64. wcex.style = CS_HREDRAW | CS_VREDRAW;
  65. wcex.lpfnWndProc = (WNDPROC)WndProc;
  66. wcex.cbClsExtra = 0;
  67. wcex.cbWndExtra = 0;
  68. wcex.hInstance = hInstance;
  69. wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_D3DENV);
  70. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  71. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  72. wcex.lpszMenuName = (LPCTSTR)IDC_D3DENV;
  73. wcex.lpszClassName = szWindowClass;
  74. wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
  75. return RegisterClassEx(&wcex);
  76. }
  77. //
  78. //   函数: InitInstance(HANDLE, int)
  79. //
  80. //   目的: 保存实例句柄并创建主窗口
  81. //
  82. //   注释: 
  83. //
  84. //        在此函数中,我们在全局变量中保存实例句柄并
  85. //        创建和显示主程序窗口。
  86. //
  87. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  88. {
  89.    HWND hWnd;
  90.    hInst = hInstance; // 将实例句柄存储在全局变量中
  91.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  92.       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  93.    if (!hWnd)
  94.    {
  95.       return FALSE;
  96.    }
  97.    // Direct3D初始化
  98.    if(FAILED(g_d3dEnv.InitD3D(TRUE, hWnd)))
  99.    return FALSE;
  100.    ShowWindow(hWnd, nCmdShow);
  101.    UpdateWindow(hWnd);
  102.    return TRUE;
  103. }
  104. //
  105. //  函数: WndProc(HWND, unsigned, WORD, LONG)
  106. //
  107. //  目的: 处理主窗口的消息。
  108. //
  109. //  WM_COMMAND - 处理应用程序菜单
  110. //  WM_PAINT - 绘制主窗口
  111. //  WM_DESTROY - 发送退出消息并返回
  112. //
  113. //
  114. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  115. {
  116. int wmId, wmEvent;
  117. // PAINTSTRUCT ps;
  118. // HDC hdc;
  119. switch (message) 
  120. {
  121. case WM_COMMAND:
  122. wmId    = LOWORD(wParam); 
  123. wmEvent = HIWORD(wParam); 
  124. // 分析菜单选择:
  125. switch (wmId)
  126. {
  127. case IDM_ABOUT:
  128. DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
  129. break;
  130. case IDM_EXIT:
  131. DestroyWindow(hWnd);
  132. break;
  133. default:
  134. return DefWindowProc(hWnd, message, wParam, lParam);
  135. }
  136. break;
  137. case WM_PAINT:
  138. //hdc = BeginPaint(hWnd, &ps);
  139. // TODO: 在此添加任意绘图代码...
  140. //EndPaint(hWnd, &ps);
  141. // 确信设备未丢失,如果丢失,函数会完成重置设备功能
  142. g_d3dEnv.MakeSureNotLost();
  143. // 清除屏幕
  144. g_d3dEnv.m_pd3dDevice->Clear(  0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 1.0f, 0 );
  145. g_d3dEnv.m_pd3dDevice->Clear(  0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0,0,0,0), 1.0f, 0 );
  146. // 开始渲染
  147. g_d3dEnv.m_pd3dDevice->BeginScene();
  148. // 在此渲染你要呈现的场景
  149. // .....
  150. g_d3dEnv.m_pd3dDevice->EndScene();
  151. // 将后台缓冲的数据搬到屏幕
  152. g_d3dEnv.m_pd3dDevice->Present( NULL, NULL, NULL, NULL );
  153. break;
  154. case WM_DESTROY:
  155. PostQuitMessage(0);
  156. // 释放D3D接口资源
  157. g_d3dEnv.Release();
  158. break;
  159. default:
  160. return DefWindowProc(hWnd, message, wParam, lParam);
  161. }
  162. return 0;
  163. }
  164. // “关于”框的消息处理程序。
  165. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  166. {
  167. switch (message)
  168. {
  169. case WM_INITDIALOG:
  170. return TRUE;
  171. case WM_COMMAND:
  172. if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
  173. {
  174. EndDialog(hDlg, LOWORD(wParam));
  175. return TRUE;
  176. }
  177. break;
  178. }
  179. return FALSE;
  180. }