XLT.cpp
上传用户:yunyi28
上传日期:2021-04-25
资源大小:6978k
文件大小:10k
源码类别:

分形几何

开发平台:

Visual C++

  1. // XLT.cpp : 定义应用程序的入口点。
  2. //
  3. #pragma once
  4. #include <windows.h> // Header File For Windows
  5. #include <stdio.h> // Header file for standard input output (IE, "FILE") (NEW)
  6. #include <stdlib.h>
  7. #include "XLT.h"
  8. #include "opengl.h"
  9. #include "Script.h"
  10. #define MAX_LOADSTRING 100
  11. // 全局变量:
  12. //HINSTANCE hInst; // 当前实例
  13. //TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
  14. //TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
  15. HDC hDC=NULL;
  16. HWND hWnd=NULL;
  17. //HGLRC hRC=NULL;
  18. //HWND hWnd=NULL;
  19. opengl *m_opengl;
  20. bool pause=true;
  21. void GameLoop();
  22. void Init();
  23. void NewWindow(HWND hWnd);
  24. int Width=800;
  25. int Height=600;
  26. int bits=16;
  27. // 此代码模块中包含的函数的前向声明:
  28. /*
  29. ATOM MyRegisterClass(HINSTANCE hInstance);
  30. BOOL InitInstance(HINSTANCE, int);
  31. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  32. INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  33. */
  34. LRESULT CALLBACK MsgProc(HWND, UINT, WPARAM, LPARAM);
  35. void NewWindow(HWND hWnd)
  36. {
  37. bool b_fullscreen=true;
  38. DWORD dwExStyle;
  39. DWORD dwStyle;
  40. RECT windowRect;
  41. int nX=0,nY=0;
  42. dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;
  43. dwStyle=WS_OVERLAPPEDWINDOW;
  44. int wid=GetSystemMetrics(SM_CXSCREEN);
  45. int hei=GetSystemMetrics(SM_CYSCREEN);
  46. nX=(wid-Width)/2,nY=(hei-Height)/2;
  47. AdjustWindowRectEx(&windowRect,dwStyle,false,dwExStyle);
  48. char cc[]="tml";
  49. WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,cc,NULL};
  50. RegisterClassEx(&wc);
  51.     HWND hWnd2=CreateWindowEx(NULL,cc,"OpenGL",dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,nX,nY,Width,Height,NULL,NULL,NULL,NULL);
  52. ShowWindow(hWnd2,SW_SHOWDEFAULT);
  53. // m_opengl->init(hWnd2,Width,Height);
  54. // m_opengl->ClearUI();
  55. }
  56. int WINAPI WinMain(HINSTANCE hInst,
  57.                      HINSTANCE hPrevInstance,
  58.                      LPTSTR    lpCmdLine,
  59.                      int       nCmdShow)
  60. {
  61. bool b_fullscreen=true;
  62. DWORD dwExStyle;
  63. DWORD dwStyle;
  64. RECT windowRect;
  65. int nX=0,nY=0;
  66. dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;
  67. dwStyle=WS_OVERLAPPEDWINDOW;
  68. int wid=GetSystemMetrics(SM_CXSCREEN);
  69. int hei=GetSystemMetrics(SM_CYSCREEN);
  70. nX=(wid-Width)/2,nY=(hei-Height)/2;
  71. AdjustWindowRectEx(&windowRect,dwStyle,false,dwExStyle);
  72. char cc[]="tml";
  73. WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,cc,NULL};
  74. RegisterClassEx(&wc);
  75.     hWnd=CreateWindowEx(NULL,cc,"OpenGL",dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,nX,nY,Width,Height,NULL,NULL,hInst,NULL);
  76. ShowWindow(hWnd,SW_SHOWDEFAULT);
  77. m_opengl->init(hWnd,Width,Height);
  78. /*bool fullscreen=true;
  79. DWORD dwExStyle;
  80. DWORD dwStyle;
  81. int width=GetSystemMetrics(SM_CXSCREEN);
  82. int height=GetSystemMetrics(SM_CYSCREEN);
  83. if (fullscreen) // Attempt Fullscreen Mode?
  84. {
  85. DEVMODE dmScreenSettings; // Device Mode
  86. memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared
  87. dmScreenSettings.dmSize=sizeof(dmScreenSettings); // Size Of The Devmode Structure
  88. dmScreenSettings.dmPelsWidth = width; // Selected Screen Width
  89. dmScreenSettings.dmPelsHeight = height; // Selected Screen Height
  90. dmScreenSettings.dmBitsPerPel = bits; // Selected Bits Per Pixel
  91. dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
  92. // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
  93. if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
  94. {
  95. // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
  96. if (MessageBox(NULL,(LPCWSTR)"The Requested Fullscreen Mode Is Not Supported BynYour Video Card. Use Windowed Mode Instead?",(LPCWSTR)"NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
  97. {
  98. fullscreen=FALSE; // Windowed Mode Selected.  Fullscreen = FALSE
  99. }
  100. else
  101. {
  102. // Pop Up A Message Box Letting User Know The Program Is Closing.
  103. MessageBox(NULL,(LPCWSTR)"Program Will Now Close.",(LPCWSTR)"ERROR",MB_OK|MB_ICONSTOP);
  104. return FALSE; // Return FALSE
  105. }
  106. }
  107. }
  108. if (fullscreen) // Are We Still In Fullscreen Mode?
  109. {
  110. dwExStyle=WS_EX_APPWINDOW; // Window Extended Style
  111. dwStyle=WS_POPUP; // Windows Style
  112. // ShowCursor(FALSE); // Hide Mouse Pointer
  113. }
  114. else
  115. {
  116. dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style
  117. dwStyle=WS_OVERLAPPEDWINDOW; // Windows Style
  118. }
  119. //AdjustWindowRectEx(&windowRect,dwStyle,false,dwExStyle);
  120. char cc[]="tml";
  121. WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,(LPCWSTR)cc,NULL};
  122. RegisterClassEx(&wc);
  123. HWND hWnd=CreateWindowEx(NULL,(LPCWSTR)cc,(LPCWSTR)"OpenGL",dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,0,0,width,height,NULL,NULL,hInst,NULL);
  124. ShowWindow(hWnd,SW_SHOWDEFAULT);*/
  125. UpdateWindow(hWnd);
  126. Init();
  127. GameLoop();
  128. return 0;
  129. }
  130. /*int APIENTRY _tWinMain(HINSTANCE hInstance,
  131.                      HINSTANCE hPrevInstance,
  132.                      LPTSTR    lpCmdLine,
  133.                      int       nCmdShow)
  134. {
  135. UNREFERENCED_PARAMETER(hPrevInstance);
  136. UNREFERENCED_PARAMETER(lpCmdLine);
  137.   // TODO: 在此放置代码。
  138. MSG msg;
  139. HACCEL hAccelTable;
  140. // 初始化全局字符串
  141. LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  142. LoadString(hInstance, IDC_XLT, szWindowClass, MAX_LOADSTRING);
  143. MyRegisterClass(hInstance);
  144. // 执行应用程序初始化:
  145. if (!InitInstance (hInstance, nCmdShow))
  146. {
  147. return FALSE;
  148. }
  149. hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_XLT));
  150. // 主消息循环:
  151. while (GetMessage(&msg, NULL, 0, 0))
  152. {
  153. if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  154. {
  155. TranslateMessage(&msg);
  156. DispatchMessage(&msg);
  157. }
  158. }
  159. return (int) msg.wParam;
  160. }
  161. */
  162. //
  163. //  函数: MyRegisterClass()
  164. //
  165. //  目的: 注册窗口类。
  166. //
  167. //  注释:
  168. //
  169. //    仅当希望
  170. //    此代码与添加到 Windows 95 中的“RegisterClassEx”
  171. //    函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
  172. //    这样应用程序就可以获得关联的
  173. //    “格式正确的”小图标。
  174. //
  175. //
  176. //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
  177. //
  178. //  目的: 处理主窗口的消息。
  179. //
  180. //  WM_COMMAND - 处理应用程序菜单
  181. //  WM_PAINT - 绘制主窗口
  182. //  WM_DESTROY - 发送退出消息并返回
  183. //
  184. //
  185. LRESULT CALLBACK MsgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  186. {
  187. switch(message)
  188. {
  189. case WM_CREATE:
  190. hDC=GetDC(hWnd);
  191. m_opengl->SetupPixelFormat(hDC);
  192. return 0;
  193. case WM_CLOSE:
  194. m_opengl->CleanUp();
  195. PostQuitMessage(0);
  196. return 0;
  197. case WM_SIZE:
  198. Height=HIWORD(lParam);
  199. Width=LOWORD(lParam);
  200. if(Height==0) Height=1;
  201. m_opengl->init(hWnd,Width,Height);
  202. return 0;
  203. case WM_DESTROY:
  204. PostQuitMessage(0);
  205. return 0;
  206. case WM_KEYUP:
  207. switch(wParam)
  208. {
  209. case VK_ESCAPE:
  210. // NewWindow(hWnd);
  211. m_opengl->CleanUp();
  212. PostQuitMessage(0);
  213. return 0;
  214. case VK_PAUSE:
  215. pause=!pause;
  216. }
  217. default:break;
  218. }
  219. return (DefWindowProc(hWnd,message,wParam,lParam));
  220. }
  221. /*
  222. ATOM MyRegisterClass(HINSTANCE hInstance)
  223. {
  224. WNDCLASSEX wcex;
  225. wcex.cbSize = sizeof(WNDCLASSEX);
  226. wcex.style = CS_HREDRAW | CS_VREDRAW;
  227. wcex.lpfnWndProc = WndProc;
  228. wcex.cbClsExtra = 0;
  229. wcex.cbWndExtra = 0;
  230. wcex.hInstance = hInstance;
  231. wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_XLT));
  232. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  233. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  234. wcex.lpszMenuName = MAKEINTRESOURCE(IDC_XLT);
  235. wcex.lpszClassName = szWindowClass;
  236. wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  237. return RegisterClassEx(&wcex);
  238. }
  239. */
  240. //
  241. //   函数: InitInstance(HINSTANCE, int)
  242. //
  243. //   目的: 保存实例句柄并创建主窗口
  244. //
  245. //   注释:
  246. //
  247. //        在此函数中,我们在全局变量中保存实例句柄并
  248. //        创建和显示主程序窗口。
  249. //
  250. /*
  251. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  252. {
  253.    HWND hWnd;
  254.    hInst = hInstance; // 将实例句柄存储在全局变量中
  255.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  256.       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  257.    if (!hWnd)
  258.    {
  259.       return FALSE;
  260.    }
  261.    ShowWindow(hWnd, nCmdShow);
  262.    UpdateWindow(hWnd);
  263.    return TRUE;
  264. }
  265. */
  266. //
  267. //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
  268. //
  269. //  目的: 处理主窗口的消息。
  270. //
  271. //  WM_COMMAND - 处理应用程序菜单
  272. //  WM_PAINT - 绘制主窗口
  273. //  WM_DESTROY - 发送退出消息并返回
  274. //
  275. //
  276. /*
  277. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  278. {
  279. int wmId, wmEvent;
  280. PAINTSTRUCT ps;
  281. HDC hdc;
  282. switch (message)
  283. {
  284. case WM_COMMAND:
  285. wmId    = LOWORD(wParam);
  286. wmEvent = HIWORD(wParam);
  287. // 分析菜单选择:
  288. switch (wmId)
  289. {
  290. case IDM_ABOUT:
  291. DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  292. break;
  293. case IDM_EXIT:
  294. DestroyWindow(hWnd);
  295. break;
  296. default:
  297. return DefWindowProc(hWnd, message, wParam, lParam);
  298. }
  299. break;
  300. case WM_PAINT:
  301. hdc = BeginPaint(hWnd, &ps);
  302. // TODO: 在此添加任意绘图代码...
  303. EndPaint(hWnd, &ps);
  304. break;
  305. case WM_DESTROY:
  306. PostQuitMessage(0);
  307. break;
  308. default:
  309. return DefWindowProc(hWnd, message, wParam, lParam);
  310. }
  311. return 0;
  312. }
  313. // “关于”框的消息处理程序。
  314. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  315. {
  316. UNREFERENCED_PARAMETER(lParam);
  317. switch (message)
  318. {
  319. case WM_INITDIALOG:
  320. return (INT_PTR)TRUE;
  321. case WM_COMMAND:
  322. if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  323. {
  324. EndDialog(hDlg, LOWORD(wParam));
  325. return (INT_PTR)TRUE;
  326. }
  327. break;
  328. }
  329. return (INT_PTR)FALSE;
  330. }
  331. */
  332. void GameLoop()
  333. {
  334. MSG msg;
  335. BOOL fmessage;
  336. PeekMessage(&msg,NULL,0U,0U,PM_NOREMOVE);
  337. while(msg.message!=WM_QUIT)
  338. {
  339. fmessage=PeekMessage(&msg,NULL,0U,0U,PM_REMOVE);
  340. if(fmessage)
  341. {
  342. TranslateMessage(&msg);
  343. DispatchMessage(&msg);
  344. }
  345. else
  346. m_opengl->Render();
  347. }
  348. }
  349. void Init()
  350. {
  351. InitData();
  352. LoadTreeTypes("../Script/TreeType.ini");
  353. LoadTreePos("../Script/M2_TreePos.pos");
  354. }