在win32项目中开发的程序
小知识: 控制台应用程序运行就是dos的界面 项目一般采用了可视化开发 开发出来的东西就像QQ之类的 是有窗口界面的
程序运行结果是这样的
源代码:对第45行进行覆盖
1 #include <windows.h> //Windows的头文件 2 #include <gl\gl.h> //包含OpenGL基本库 3 #include <gl\glu.h> //包含OpenGL实用库 4 #include <gl\glaux.h> //包含OpenGL辅助库 5 #include <gl\glut.h> //包含OpenGL工具库 6 //设置程序中使用的所有变量 7 HGLRC hRC = NULL; //OpenGL着色描述表句柄 8 HDC hDC = NULL; //设备描述表句柄 9 HWND hWnd = NULL; //保存窗口句柄 10 HINSTANCE hInstance; //保存程序的实例 11 //增加两个全局变量来控制这两个对象的旋转。 12 GLfloat rtri; //用于三角形的角度 13 GLfloat rquad; //用于四边形的角度 14 15 bool keys[256]; //保存键盘按键的数组 16 bool active = TRUE; //口的活动标志,缺省为TRUE 17 bool fullscreen = TRUE; //全屏标志缺省,缺省设定成全屏模式 18 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //WndProc定义 19 GLvoid ReSizeGLScene(GLsizei width, GLsizei height) //重置OpenGL窗口大小 20 { 21 if (height == 0) //防止被零除 22 { 23 height = 1; 24 } //将Height设为 25 glViewport(0, 0, width, height); //重置当前的视口 26 glMatrixMode(GL_PROJECTION); //选择投影矩阵 27 glLoadIdentity(); //重置投影矩阵 28 gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f); //设置视景体 29 glMatrixMode(GL_MODELVIEW); //选择模型观察矩阵 30 glLoadIdentity(); //重置模型观察矩阵 31 } 32 int InitGL(GLvoid) //开始对OpenGL进行所有设置 33 { 34 glShadeModel(GL_SMOOTH); //启用阴影平滑 35 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //黑色背景 36 glClearDepth(1.0f); //设置深度缓存 37 glEnable(GL_DEPTH_TEST); //启用深度测试 38 glDepthFunc(GL_LEQUAL);//所作深度测试的类型 39 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //告诉系统对透视进行修正 40 return TRUE; //初始化OK 41 } 42 43 44 45 46 47 //将这段代码覆盖之后,往里面添加东西。就能进行OpenGL 48 49 50 int DrawGLScene(GLvoid) //开始进行所有的绘制 51 { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存 52 glLoadIdentity(); //重置当前的模型观察矩阵 53 return TRUE; } // 一切OK 54 55 56 57 58 59 60 61 62 GLvoid KillGLWindow(GLvoid) //正常销毁窗口 63 { 64 if (fullscreen) { //处于全屏模式吗? 65 ChangeDisplaySettings(NULL, 0); //切回桌面 66 ShowCursor(TRUE); 67 } //显示鼠标指针 68 if (hRC) { //拥有OpenGL着色描述表吗? 69 if (!wglMakeCurrent(NULL, NULL)) { 70 //能否释放DC和RC描述表? 71 MessageBox(NULL, "释放DC和RC失 败。", "关闭错误", MB_OK | MB_ICONINFORMATION); 72 } 73 if (!wglDeleteContext(hRC)){ //能否删除RC? 74 MessageBox(NULL, "释放RC失 败。", "关闭错误", MB_OK | MB_ICONINFORMATION); 75 } 76 hRC = NULL; 77 } //将RC设为NULL 78 if (hDC && !ReleaseDC(hWnd, hDC)) { 79 //能否释放DC? 80 MessageBox(NULL, "释放DC失败。", "关闭错误", MB_OK | MB_ICONINFORMATION); 81 hDC = NULL; 82 } //将DC设为NULL 83 if (hWnd && !DestroyWindow(hWnd)) { 84 //能否销毁窗口? 85 MessageBox(NULL, "释放窗口句柄失 败。", "关闭错误", MB_OK | MB_ICONINFORMATION); 86 hWnd = NULL; 87 } //将hWnd设为NULL 88 if (!UnregisterClass("OpenGL", hInstance)) { 89 //能否注销类? 90 MessageBox(NULL, "不能注销窗口类 。", " 关闭错误", MB_OK | MB_ICONINFORMATION); 91 hInstance = NULL; 92 } 93 } //hInstance为NULL 94 BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag) 95 { 96 GLuint PixelFormat; //保存查找匹配的结果 97 WNDCLASS wc; //窗口类结构 98 DWORD dwExStyle; //扩展窗口风格 99 DWORD dwStyle; //窗口风格 100 RECT WindowRect; //取得矩形的左上角和右下角的坐标值 101 WindowRect.left = (long)0; //将Left 设为 102 WindowRect.right = (long)width; //将Right设为要求的宽度 103 WindowRect.top = (long)0; //将Top设为0 104 WindowRect.bottom = (long)height; //将Bottom设为要求的高度 105 fullscreen = fullscreenflag; //设置全局全屏标志 106 hInstance = GetModuleHandle(NULL); //取得窗口实例 107 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; //移动时重画,为窗口取得DC 108 wc.lpfnWndProc = (WNDPROC)WndProc; //WndProc处理消息 109 wc.cbClsExtra = 0; //窗口类额外字节数 110 wc.cbWndExtra = 0; //窗口实例额外字节数 111 wc.hInstance = hInstance; //设置实例 112 wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); //装入缺省图标 113 wc.hCursor = LoadCursor(NULL, IDC_ARROW); //装入鼠标指针 114 wc.hbrBackground = NULL; //GL不需要背景 115 wc.lpszMenuName = NULL; //不需要菜单 116 wc.lpszClassName = "OpenGL"; //设定类名字 117 if (!RegisterClass(&wc)) //尝试注册窗口类 118 { 119 MessageBox(NULL, "注册窗口失败。", " 错误", MB_OK | MB_ICONEXCLAMATION); 120 return FALSE; //退出并返回FALSE 121 } 122 if (fullscreen) //要尝试全屏模式吗? 123 { 124 DEVMODE dmScreenSettings; //设备模式 125 memset(&dmScreenSettings, 0, sizeof(dmScreenSettings)); //确保内存为零 126 dmScreenSettings.dmSize = sizeof(dmScreenSettings); //Devmode结构大小 127 dmScreenSettings.dmPelsWidth = width; //所选屏幕宽度 128 dmScreenSettings.dmPelsHeight = height; //所选屏幕高度 129 dmScreenSettings.dmBitsPerPel = bits; //每像素所选的色彩深度 dmScreenSettings.dmFields= DM_BITSPERPEL|DM_PELSWIDTH| DM_PELSHEIGHT; 130 //尝试设置显示模式并返回结果。 131 //注: CDS_FULLSCREEN 移去了状态条。 132 if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) 133 { 134 //若模式失败,退出或在窗口内运行 135 if (MessageBox(NULL, "全屏模式在当前 显卡上设置失败!使用窗口模式? ", "OpenGL程序", MB_YESNO | MB_ICONEXCLAMATION) == IDYES) 136 { 137 fullscreen = FALSE; //选择窗口模式 138 } 139 else { 140 //弹出对话框告诉用户程序结束 141 MessageBox(NULL, "程序将被关 闭。", "错误", MB_OK | MB_ICONSTOP); 142 return FALSE; // 退出并返回FALSE 143 } 144 } 145 } 146 if (fullscreen) //仍处于全屏模式吗? 147 { 148 dwExStyle = WS_EX_APPWINDOW; //扩展窗体风格 149 dwStyle = WS_POPUP; //窗体风格 150 ShowCursor(FALSE); //隐藏鼠标指针 151 } 152 else 153 { 154 dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; //扩展窗体风格 155 dwStyle = WS_OVERLAPPEDWINDOW; // 窗体风格 156 } 157 AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); //调整窗口到要求大小 158 if (!(hWnd = CreateWindowEx(dwExStyle, //扩展窗体风格 159 "OpenGL", //类名字 160 title, //窗口标题 161 WS_CLIPSIBLINGS | //必须窗体风格属性 162 WS_CLIPCHILDREN |//必须窗体风格属性 163 dwStyle, //选择的窗体属性 164 0, 0, //窗口位置 165 WindowRect.right - WindowRect.left, //计算调整好的窗口宽度 166 WindowRect.bottom - WindowRect.top, //计算调整好的窗口高度 167 NULL, //无父窗口 168 NULL, //无菜单 169 hInstance, //实例 170 NULL))) //不向WM_CREATE传任何东西 171 { 172 KillGLWindow(); //重置显示区 173 MessageBox(NULL, "创建窗口失败。", "错误", MB_OK | MB_ICONEXCLAMATION); 174 return FALSE; 175 } //返回FALSE 176 static PIXELFORMATDESCRIPTOR pfd = //pfd 告诉窗口使用的像素格式 177 { 178 sizeof(PIXELFORMATDESCRIPTOR), //上述格式描述符的大小 179 1, //版本号 180 PFD_DRAW_TO_WINDOW | //格式支持窗口 181 PFD_SUPPORT_OPENGL | //格式必须支持OpenGL 182 PFD_DOUBLEBUFFER, //必须支持双缓冲 183 PFD_TYPE_RGBA, //申请RGBA 格式 184 bits, //选定色彩深度 185 0, 0, 0, 0, 0, 0, //忽略的色彩位 186 0, //无Alpha缓存 187 0, //忽略Shift Bit 188 0, //无累加缓存 189 0, 0, 0, 0, //忽略聚集位 190 16, //16位Z-缓存(深度缓存) 191 0, //无模板缓存 192 0, //无辅助缓存 193 PFD_MAIN_PLANE, //主绘图层 194 0, //Reserved 195 0, 0, 0 //忽略层遮罩 196 }; 197 if (!(hDC = GetDC(hWnd))) //获取设备描述表? 198 { 199 KillGLWindow(); //重置显示区 200 MessageBox(NULL, "不能创建GL设备描 述表。", "错误", MB_OK | MB_ICONEXCLAMATION); 201 return FALSE; 202 } //返回FALSE 203 if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd))) //Windows找到相应像素格式了吗? 204 { 205 KillGLWindow(); //重置显示区 206 MessageBox(NULL, "不能创建一种相匹配 的像素格式。", "错误", MB_OK | MB_ICONEXCLAMATION); 207 return FALSE; 208 } //返回FALSE 209 if (!SetPixelFormat(hDC, PixelFormat, &pfd)) //能够设置象素格式么? 210 { 211 KillGLWindow(); //重置显示区 212 MessageBox(NULL, "不能设置像素格式。 ", "错误", MB_OK | MB_ICONEXCLAMATION); 213 return FALSE; //返回FALSE 214 } 215 if (!(hRC = wglCreateContext(hDC))) //能否取得着色描述表? 216 { 217 KillGLWindow(); //重置显示区 218 MessageBox(NULL, "不能创建着色描述 表。", "错误", MB_OK | MB_ICONEXCLAMATION); 219 return FALSE; 220 } //返回FALSE 221 if (!wglMakeCurrent(hDC, hRC)) //尝试激活着色描述表 222 { 223 KillGLWindow(); //重置显示区 224 MessageBox(NULL, "不能激活当前的 OpenGL着色描述表。", "错误", MB_OK | MB_ICONEXCLAMATION); 225 return FALSE; 226 } //返回FALSE 227 ShowWindow(hWnd, SW_SHOW);//显示窗口 228 SetForegroundWindow(hWnd); //稍微提高优先级 229 SetFocus(hWnd); //设置键盘的焦点至此窗口 230 ReSizeGLScene(width, height); //设置透视GL 屏幕 231 if (!InitGL()) //初始化新建的GL窗口 232 { 233 KillGLWindow(); //重置显示区 234 MessageBox(NULL, "初始化失败。", "错误 ", MB_OK | MB_ICONEXCLAMATION); 235 return FALSE; //返回FALSE 236 } 237 return TRUE; //成功 238 } 239 LRESULT CALLBACK WndProc( 240 HWND hWnd, //窗口的句柄 241 UINT uMsg, //窗口的消息 242 WPARAM wParam, //附加的消息内容 243 LPARAM lParam) //附加的消息内容 244 { 245 switch (uMsg) { //检查Windows消息 246 case WM_ACTIVATE: //监视窗口激活消息 247 { 248 if (!HIWORD(wParam)) //检查最小化状态 249 { 250 active = TRUE; 251 } //程序处于激活状态 252 else 253 { 254 active = FALSE; 255 } //程序不再激活 256 return 0; //返回消息循环 257 } 258 case WM_SYSCOMMAND: //系统中断命令 259 { 260 switch (wParam) { //检查系统调用 261 case SC_SCREENSAVE: //屏保要运行? 262 case SC_MONITORPOWER: //显示器要进入节电模式? 263 return 0; 264 } //阻止发生 265 break; //退出 266 } 267 case WM_CLOSE: //收到Close消息? 268 { 269 PostQuitMessage(0); //发出退出消息 270 return 0; //返回 271 } 272 case WM_KEYDOWN: //有键按下么? 273 { 274 keys[wParam] = TRUE; //若是设为TRUE 275 return 0; //返回 276 } 277 case WM_KEYUP: //有键放开么? 278 { 279 keys[wParam] = FALSE;//是则设为FALSE 280 return 0; //返回 281 } 282 case WM_SIZE: //调整OpenGL窗口大小 283 { 284 ReSizeGLScene(LOWORD(lParam), HIWORD(lParam)); 285 //LoWord=Width,HiWord=Height 286 return 0; //返回 287 } 288 } 289 //向DefWindowProc传递所有未处理的消息。 290 return DefWindowProc(hWnd, uMsg, wParam, lParam); 291 } 292 int WINAPI WinMain( 293 HINSTANCE hInstance, //当前窗口实例 294 HINSTANCE hPrevInstance, //前一个窗口实例 295 LPSTR lpCmdLine, //命令行参数 296 int nCmdShow) //窗口显示状态 297 { 298 MSG msg; //Windowsx消息结构 299 BOOL done = FALSE; //退出循环的Bool变量 300 //提示用户选择运行模式 301 if (MessageBox(NULL, "你想在全屏模式下运 行吗?", "设置全屏模式?", MB_YESNO | MB_ICONQUESTION) == IDNO) 302 { 303 fullscreen = FALSE; //FALSE为窗口模式 304 } 305 //创建OpenGL窗口 306 if (!CreateGLWindow("OpenGL程序框架", 640, 480, 16, fullscreen)) 307 { 308 return 0; //失败退出 309 } 310 while (!done) //保持循环直到done=TRUE 311 { 312 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) //有消息在等待吗? 313 { 314 if (msg.message == WM_QUIT) 315 //收到退出消息? 316 { 317 done = TRUE; //是则done=TRUE 318 } 319 else //不是,处理窗口消息 320 { 321 TranslateMessage(&msg);//翻译消息 322 DispatchMessage(&msg); //发送消息 323 } 324 } 325 else //如果没有消息 326 { 327 //绘制场景。监视ESC键和来自 //的退出消息,然后调用DrawGLScene() 328 if (active) //程序激活的么? 329 { 330 if (keys[VK_ESCAPE])//ESC按下么? 331 { 332 done = TRUE; //ESC发退出信号 333 } 334 else //不是退出的时候,刷新屏幕 335 { 336 DrawGLScene(); //绘制场景 337 SwapBuffers(hDC); //交换缓存(双缓存) 338 } 339 } 340 if (keys[VK_F1]) //F1键按下了么? 341 { 342 keys[VK_F1] = FALSE; //若是,使对应的Key数组中的值为FALSE 343 KillGLWindow(); //销毁当前窗口 344 fullscreen = !fullscreen; //切换全屏/窗口模式 345 //重建OpenGL 窗口 346 // if (!CreateGLWindow("OpenGL程 序框架",640,480,16,fullscreen)) 347 // { 348 // return 0; //如果窗口未能创建,程序退出 349 // } 350 // } 351 if (!CreateGLWindow("绘制基本图元", 640, 480, 16, fullscreen)) 352 { 353 return 0; //若窗口未能创建程序退出 354 } 355 } 356 357 } 358 } 359 //关闭程序 360 KillGLWindow(); //销毁窗口 361 return (msg.wParam); //退出程序 362 }
时间: 2024-10-10 11:02:32