1 //HGE初始化
2 bool CALL HGE_Impl::System_Initiate()
3 {
4 OSVERSIONINFO os_ver; //操作系统版本信息
5 SYSTEMTIME tm; //系统时间
6 MEMORYSTATUS mem_st; //内存状态
7 WNDCLASS winclass;
8 int width, height;
9
10 // Log system info
11
12 System_Log("HGE Started..\n");
13
14 System_Log("HGE version: %X.%X", HGE_VERSION>>8, HGE_VERSION & 0xFF);
15 GetLocalTime(&tm); //取本地时间 UTC格式,并显示到日志中。
16 System_Log("Date: %02d.%02d.%d, %02d:%02d:%02d\n", tm.wDay, tm.wMonth, tm.wYear, tm.wHour, tm.wMinute, tm.wSecond);
17
18 System_Log("Application: %s",szWinTitle);
19 os_ver.dwOSVersionInfoSize=sizeof(os_ver);
20 GetVersionEx(&os_ver); //取当前操作系统的版本信息
21 System_Log("OS: Windows %ld.%ld.%ld",os_ver.dwMajorVersion,os_ver.dwMinorVersion,os_ver.dwBuildNumber);
22
23 GlobalMemoryStatus(&mem_st);//取内存状态
24 System_Log("Memory: %ldK total, %ldK free\n",mem_st.dwTotalPhys/1024L,mem_st.dwAvailPhys/1024L);
25
26
27 // Register window class
28 /**
29 窗口样式
30 CS_DBLCLKS 支持双击消息
31 CS_HREDRAW 水平移动或变化时候,重画
32 CS_VREDRAW 垂直移动或变化时候,重画
33 */
34 winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
35
36 winclass.lpfnWndProc = WindowProc; //消息处理过程
37 winclass.cbClsExtra = 0;
38 winclass.cbWndExtra = 0;
39 winclass.hInstance = hInstance;
40 winclass.hCursor = LoadCursor(NULL, IDC_ARROW); //装载光标
41 winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
42 winclass.lpszMenuName = NULL;
43 winclass.lpszClassName = WINDOW_CLASS_NAME;
44 if(szIcon) winclass.hIcon = LoadIcon(hInstance, szIcon); //装载图标
45 else winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //应用程序图标
46
47 if (!RegisterClass(&winclass)) {
48 _PostError("Can't register window class");
49 return false;
50 }
51
52 // Create window
53
54 width=nScreenWidth + GetSystemMetrics(SM_CXFIXEDFRAME)*2; //SM_CXFIXEDFRAME垂直边框的宽度
55 height=nScreenHeight + GetSystemMetrics(SM_CYFIXEDFRAME)*2 + GetSystemMetrics(SM_CYCAPTION);//SM_CYFIXEDFRAME 水平边框与标题的宽度
56 //下面的定义,是使自己处于屏幕的中心
57 //这里定义的是窗口模式显示的样式
58 rectW.left=(GetSystemMetrics(SM_CXSCREEN)-width)/2;
59 rectW.top=(GetSystemMetrics(SM_CYSCREEN)-height)/2;
60 rectW.right=rectW.left+width;
61 rectW.bottom=rectW.top+height;
62 styleW=WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE; //WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX;
63 //这里定义的是全屏模式显示的样式
64 rectFS.left=0;
65 rectFS.top=0;
66 rectFS.right=nScreenWidth;
67 rectFS.bottom=nScreenHeight;
68 styleFS=WS_POPUP|WS_VISIBLE; //WS_POPUP
69 //如果存在父窗口,则定义为子窗口样式
70 if(hwndParent)
71 {
72 rectW.left=0;
73 rectW.top=0;
74 rectW.right=nScreenWidth;
75 rectW.bottom=nScreenHeight;
76 styleW=WS_CHILD|WS_VISIBLE;
77 bWindowed=true;
78 }
79
80 if(bWindowed) //窗口模式
81 hwnd = CreateWindowEx(0, WINDOW_CLASS_NAME, szWinTitle, styleW,
82 rectW.left, rectW.top, rectW.right-rectW.left, rectW.bottom-rectW.top,
83 hwndParent, NULL, hInstance, NULL);
84 else //全屏模式
85 hwnd = CreateWindowEx(WS_EX_TOPMOST, WINDOW_CLASS_NAME, szWinTitle, styleFS,
86 0, 0, 0, 0,
87 NULL, NULL, hInstance, NULL);
88
89 if (!hwnd) //如果创建失败
90 {
91 _PostError("Can't create window");
92 return false;
93 }
94
95 ShowWindow(hwnd, SW_SHOW); //显示
96
97 // Init subsystems
98
99 timeBeginPeriod(1); //设置多媒体时间粒度,在这里是1毫秒
100 Random_Seed(); //初始化随机数种子
101 _InitPowerStatus();
102 _InputInit(); //输入初始化
103 if(!_GfxInit()) { System_Shutdown(); return false; } //D3D8初始化
104 if(!_SoundInit()) { System_Shutdown(); return false; } //bass.dll初始化
105
106 System_Log("Init done.\n");
107
108
109 fTime=0.0f; //HGE计时器
110 t0=t0fps=timeGetTime(); //帧率计时器 初始化
111 dt=cfps=0; //帧间计时器 初始化
112 nFPS=0; //帧率 初始化
113
114 // Show splash
115
116 #ifdef DEMO
117
118 bool (*func)();
119 bool (*rfunc)();
120 HWND hwndTmp;
121
122 if(pHGE->bDMO)
123 {
124 Sleep(200);
125 func=(bool(*)())pHGE->System_GetStateFunc(HGE_FRAMEFUNC);
126 rfunc=(bool(*)())pHGE->System_GetStateFunc(HGE_RENDERFUNC);
127 hwndTmp=hwndParent; hwndParent=0;
128 pHGE->System_SetStateFunc(HGE_FRAMEFUNC, DFrame);
129 pHGE->System_SetStateFunc(HGE_RENDERFUNC, 0);
130 DInit();
131 pHGE->System_Start();
132 DDone();
133 hwndParent=hwndTmp;
134 pHGE->System_SetStateFunc(HGE_FRAMEFUNC, func);
135 pHGE->System_SetStateFunc(HGE_RENDERFUNC, rfunc);
136 }
137
138 #endif
139
140 // Done
141
142 return true;
143 }