Exemplo n.º 1
0
void LeaveAltScreen(Window *p)
{
    if (!p->w_alt.on)
        return;
    SwapAltScreen(p);
    ChangeWindowSize(p, p->w_alt.width, p->w_alt.height, p->w_alt.histheight);
    FreeAltScreen(p);
    p->w_alt.on = 0;
}
Exemplo n.º 2
0
void EnterAltScreen(Window *p)
{
    if (!p->w_alt.on) {
        /* If not already using the alternate screen buffer, then create
           a new one and swap it with the 'real' screen buffer. */
        FreeAltScreen(p);
        SwapAltScreen(p);
    } else {
        /* Already using the alternate buffer. Just clear the screen. To do so, it
           is only necessary to reset the height(s) without resetting the width. */
        p->w_height = 0;
        p->w_histheight = 0;
    }
    ChangeWindowSize(p, p->w_alt.width, p->w_alt.height, p->w_alt.histheight);
    p->w_alt.on = 1;
}
Exemplo n.º 3
0
	// 创建Render环境
	int RenderClass::CreaterRender(const wchar_t *windows_name)
	{

		GLuint		PixelFormat;						// 保存查找匹配的结果
		WNDCLASS	wc;							// 窗口类结构
		DWORD		dwExStyle;						// 扩展窗口风格
		DWORD		dwStyle;						// 窗口风格

		RECT WindowRect;							// 取得矩形的左上角和右下角的坐标值
		WindowRect.left=(long)0;						// 将Left   设为 0
		WindowRect.right=(long)width_;						// 将Right  设为要求的宽度
		WindowRect.top=(long)0;							// 将Top    设为 0
		WindowRect.bottom=(long)height_;						// 将Bottom 设为要求的高度


		hinstance_		= GetModuleHandle(NULL);			// 取得我们窗口的实例
		wc.style		= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;		// 移动时重画,并为窗口取得DC
		wc.lpfnWndProc		= (WNDPROC) window_sun_proc_;				// WndProc处理消息
		wc.cbClsExtra		= 0;						// 无额外窗口数据
		wc.cbWndExtra		= 0;						// 无额外窗口数据
		wc.hInstance		= hinstance_;					// 设置实例
		wc.hIcon		= LoadIcon(NULL, IDI_WINLOGO);			// 装入缺省图标
		wc.hCursor		= LoadCursor(NULL, IDC_ARROW);			// 装入鼠标指针
		wc.hbrBackground	= NULL;						// GL不需要背景
		wc.lpszMenuName		= NULL;						// 不需要菜单
		wc.lpszClassName	= L"OpenGL";					// 设定类名字

		if (!RegisterClass(&wc))						// 尝试注册窗口类
		{
			MessageBox(NULL,L"注册窗口失败",L"错误",MB_OK|MB_ICONEXCLAMATION);
			return FALSE;							// 退出并返回FALSE
		}
		if (full)								// 要尝试全屏模式吗?
		{
			DEVMODE dmScreenSettings;						// 设备模式
			memset(&dmScreenSettings,0,sizeof(dmScreenSettings));			// 确保内存清空为零
			dmScreenSettings.dmSize=sizeof(dmScreenSettings);			// Devmode 结构的大小
			dmScreenSettings.dmPelsWidth	= width_;				// 所选屏幕宽度
			dmScreenSettings.dmPelsHeight	= height_;				// 所选屏幕高度
			dmScreenSettings.dmBitsPerPel	= 32;					// 每象素所选的色彩深度
			dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
			// 尝试设置显示模式并返回结果。注: CDS_FULLSCREEN 移去了状态条。
			if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
			{
				// 若模式失败,提供两个选项:退出或在窗口内运行。
				if (MessageBox(NULL,L"全屏模式在当前显卡上设置失败!\n使用窗口模式?",L" G",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
				{
					full=FALSE;				// 选择窗口模式(Fullscreen=FALSE)
				}
				else
				{
					// 弹出一个对话框,告诉用户程序结束
					MessageBox(NULL,L"程序将被关闭",L"错误",MB_OK|MB_ICONSTOP);
					return FALSE;					//  退出并返回 FALSE
				}
			}
		}
		if (full)								// 仍处于全屏模式吗?
		{
			dwExStyle=WS_EX_APPWINDOW;					// 扩展窗体风格
			dwStyle=WS_POPUP;						// 窗体风格
			ShowCursor(FALSE);						// 隐藏鼠标指针
		}
		else
		{
			dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			// 扩展窗体风格
			dwStyle=WS_OVERLAPPEDWINDOW;					//  窗体风格
		}
		AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);		// 调整窗口达到真正要求的大小

		if (!(hwnd_=CreateWindowEx(	dwExStyle,				// 扩展窗体风格
			L"OpenGL",				// 类名字
			windows_name,			// 窗口标题
			WS_CLIPSIBLINGS |		// 必须的窗体风格属性
			WS_CLIPCHILDREN |		// 必须的窗体风格属性
			dwStyle,				// 选择的窗体属性
			0, 0,					// 窗口位置
			WindowRect.right-WindowRect.left,	// 计算调整好的窗口宽度
			WindowRect.bottom-WindowRect.top,	// 计算调整好的窗口高度
			NULL,					// 无父窗口
			NULL,					// 无菜单
			hinstance_,				// 实例
			NULL)))					// 不向WM_CREATE传递任何东东
		{
			KillGLWindow();							// 重置显示区
			MessageBox(NULL,L"不能创建一个窗口设备描述表",L"错误",MB_OK|MB_ICONEXCLAMATION);
			return FALSE;							// 返回 FALSE
		}
		static	PIXELFORMATDESCRIPTOR pfd=					// /pfd 告诉窗口我们所希望的东东,即窗口使用的像素格式
		{
			sizeof(PIXELFORMATDESCRIPTOR),					// 上述格式描述符的大小
			1,								// 版本号
			PFD_DRAW_TO_WINDOW |						// 格式支持窗口
			PFD_SUPPORT_OPENGL |						// 格式必须支持OpenGL
			PFD_DOUBLEBUFFER,						// 必须支持双缓冲
			PFD_TYPE_RGBA,							// 申请 RGBA 格式
			32,								// 选定色彩深度
			0, 0, 0, 0, 0, 0,						// 忽略的色彩位
			0,								// 无Alpha缓存
			0,								// 忽略Shift Bit
			0,								// 无累加缓存
			0, 0, 0, 0,							// 忽略聚集位
			16,								// 16位 Z-缓存 (深度缓存)
			0,								// 无蒙板缓存
			0,								// 无辅助缓存
			PFD_MAIN_PLANE,							// 主绘图层
			0,								// Reserved
			0, 0, 0								// 忽略层遮罩
		};
		if (!(hdc=GetDC(hwnd_)))							// 取得设备描述表了么?
		{
			KillGLWindow();							// 重置显示区
			MessageBox(NULL,L"不能创建一种相匹配的像素格式",L"错误",MB_OK|MB_ICONEXCLAMATION);
			return FALSE;							// 返回 FALSE
		}
		if (!(PixelFormat=ChoosePixelFormat(hdc,&pfd)))				// Windows 找到相应的象素格式了吗?
		{
			KillGLWindow();							// 重置显示区
			MessageBox(NULL,L"不能设置像素格式",L"错误",MB_OK|MB_ICONEXCLAMATION);
			return FALSE;							// 返回 FALSE
		}
		if(!SetPixelFormat(hdc,PixelFormat,&pfd))				// 能够设置象素格式么?
		{
			KillGLWindow();							// 重置显示区
			MessageBox(NULL,L"不能设置像素格式",L"错误",MB_OK|MB_ICONEXCLAMATION);
			return FALSE;							// 返回 FALSE
		}
		if (!(hrc=wglCreateContext(hdc)))					// 能否取得着色描述表?
		{
			KillGLWindow();							// 重置显示区
			MessageBox(NULL,L"不能创建OpenGL渲染描述表",L"错误",MB_OK|MB_ICONEXCLAMATION);
			return FALSE;							// 返回 FALSE
		}
		if(!wglMakeCurrent(hdc,hrc))						// 尝试激活着色描述表
		{
			KillGLWindow();							// 重置显示区
			MessageBox(NULL,L"不能激活当前的OpenGL渲然描述表",L"错误",MB_OK|MB_ICONEXCLAMATION);
			return FALSE;							// 返回 FALSE
		}
		ShowWindow(hwnd_,SW_SHOW);						// 显示窗口
		SetForegroundWindow(hwnd_);						// 略略提高优先级
		SetFocus(hwnd_);								// 设置键盘的焦点至此窗口
		ChangeWindowSize(width_, height_);						// 设置透视 GL 屏幕


		glewExperimental = GL_TRUE; 

		GLenum err = glewInit(); // 初始化glew库,必须在glutCreateWindow之后调用
		if(err != GLEW_OK)  // 初始化不成功?
		{
			std::cout << "glewInit 失败, 退出程序." << std::endl;
			exit(EXIT_FAILURE); // 退出程序
		}

		glClearColor(0.6f, 0.4f, 0.7f, 1.0f);

		//开启混合
		glEnable(GL_BLEND);
		//设置混合模式
		glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
		//质量最佳
		glPolygonMode(GL_FRONT, GL_NICEST);

		return 0;
	}