windows屏幕保护opengl程序模板

Visual Studio 2013 屏幕保护程序opengl模板

ScreenSaver.cpp

#define VC_EXTRALEAN

#include <windows.h>
#include <commctrl.h>
#include <scrnsave.h>

#include <time.h>
#include <math.h>
#include <string>
#include <time.h>

#include "resource.h"

#include <gl\GLU.h>
#include <gl\GL.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")

#pragma comment(lib, "scrnsavw.lib")
#pragma comment (lib, "comctl32.lib")

bool SetupOpenGL();

void KillGL();

void DrawGLScene();

HDC					hDC = NULL;
HGLRC				hRC = NULL;
HWND				hWnd = NULL;
HINSTANCE			hInstance;

int uTimer;

LONG WINAPI ScreenSaverProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
	// 处理屏幕保护消息
	switch (message)
	{
	case WM_CREATE:
		// 创建屏幕保护窗口消息 最先执行
		hWnd = hwnd;
		SetupOpenGL();
		// 设置定时器 (间隔为16毫秒,为了每分钟刷新60次 (1000/60 = 16)
		uTimer = SetTimer(hwnd, 1, 16, NULL);
		return 0;

	case WM_ERASEBKGND:
		// 清除屏幕保护背景
		// opengl不使用
		return 0;

	case WM_TIMER:
		// 定时器消息
		DrawGLScene();
		return 0;

	case WM_DESTROY:
		// 销毁
		KillTimer(hwnd, uTimer);
		KillGL();
		PostQuitMessage(0);
		return 0;
	}
	return DefScreenSaverProc(hwnd, message, wparam, lparam);
}

BOOL WINAPI ScreenSaverConfigureDialog(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
	return true;
}

BOOL WINAPI RegisterDialogClasses(HANDLE hmodule)
{
	return true;
}

bool SetupOpenGL()
{
	GLuint PixelFormat;	

	int width;
	int height;

	width = GetDeviceCaps(GetDC(NULL), HORZRES);
	height = GetDeviceCaps(GetDC(NULL), VERTRES);	

	RECT		WindowRect;
	WindowRect.left = (long)0;
	WindowRect.right = (long)width;
	WindowRect.top = (long)0;
	WindowRect.bottom = (long)height;		

	//设置opengl上下文
	static	PIXELFORMATDESCRIPTOR pfd =
	{
		sizeof(PIXELFORMATDESCRIPTOR),
		1,
		PFD_DRAW_TO_WINDOW |
		PFD_SUPPORT_OPENGL |
		PFD_DOUBLEBUFFER,
		PFD_TYPE_RGBA,
		24,
		0, 0, 0, 0, 0, 0,
		0,
		0,
		0,
		0, 0, 0, 0,
		16,
		0,
		0,
		PFD_MAIN_PLANE,
		0,
		0, 0, 0
	};

	if (!(hDC = GetDC(hWnd)))
	{
		KillGL();
		MessageBox(NULL, TEXT("Can't Create A GL Device Context."), TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION);
		return FALSE;
	}

	if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd)))
	{
		KillGL();
		MessageBox(NULL, TEXT("Can't Find A Suitable PixelFormat."), TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION);
		return FALSE;
	}

	if (!SetPixelFormat(hDC, PixelFormat, &pfd))
	{
		KillGL();
		MessageBox(NULL, TEXT("Can't Set The PixelFormat."), TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION);
		return FALSE;
	}

	if (!(hRC = wglCreateContext(hDC)))
	{
		KillGL();
		MessageBox(NULL, TEXT("Can't Create A GL Rendering Context."), TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION);
		return FALSE;
	}

	if (!wglMakeCurrent(hDC, hRC))
	{
		KillGL();
		MessageBox(NULL, TEXT("Can't Activate The GL Rendering Context."), TEXT("ERROR"), MB_OK | MB_ICONEXCLAMATION);
		return FALSE;
	}

	//透视矩阵
	if (height == 0){ height = 1; }
	glViewport(0, 0, width, height);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();								

	//初始化opengl一些参数
	glShadeModel(GL_SMOOTH);
	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	

	return TRUE;
}

void KillGL(GLvoid){
	ChangeDisplaySettings(NULL, 0);					// If So Switch Back To The Desktop
	if (hRC){										// Do We Have A Rendering Context?
		wglMakeCurrent(NULL, NULL);					// Release The DC And RC Contexts
		wglDeleteContext(hRC);						// Delete The RC
		hRC = NULL;									// Set RC To NULL
	}
	ReleaseDC(hWnd, hDC);							// Release The DC
}

void DrawGLScene()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	glTranslatef(-1.5f, 0.0f, -6.0f);
	glBegin(GL_TRIANGLES);
	glVertex3f(0.0f, 1.0f, 0.0f);
	glVertex3f(-1.0f, -1.0f, 0.0f);
	glVertex3f(1.0f, -1.0f, 0.0f);
	glEnd();
	glTranslatef(3.0f, 0.0f, 0.0f);
	glBegin(GL_QUADS);
	glVertex3f(-1.0f, 1.0f, 0.0f);
	glVertex3f(1.0f, 1.0f, 0.0f);
	glVertex3f(1.0f, -1.0f, 0.0f);
	glVertex3f(-1.0f, -1.0f, 0.0f);
	glEnd();

	SwapBuffers(hDC);
}

模板代码托管在 https://github.com/tiancode/windows_opengl_screensaver_template

时间: 2024-10-14 07:37:11

windows屏幕保护opengl程序模板的相关文章

windows屏幕保护程序opengl模板

Visual Studio 2013 屏幕保护程序opengl模板 ScreenSaver.cpp #define VC_EXTRALEAN #include <windows.h> #include <commctrl.h> #include <scrnsave.h> #include <time.h> #include <math.h> #include <string> #include <time.h> #incl

Mac上如何设置使用触发角快速启动屏幕保护程序

如果您使用屏幕保护程序,它会在您的 Mac 不活跃一段时间后自动启动.您可以设定快捷方式,以便在将指针移到屏幕边角时启动屏幕保护程序. 1.在 Mac 上,选取苹果菜单 >"系统偏好设置",点按"桌面与屏幕保护程序",然后点按"屏幕保护程序". 2.点按"触发角". 3.点按要使用的角的弹出式菜单,选取"启动屏幕保护程序",然后点按"好".如果您想要结合 Control.Optio

如何在Mac上安装Apple Watch屏幕保护程序

Apple Watch Screensaver for mac是一款将mac休眠状态时的屏保换成AppleWatch表盘风格的软件,如果你不喜欢系统原生的屏保样式可以试试这款软件,看起来还是挺不错的. WATCH Screensaver for Mac(时钟屏幕保护软件) https://www.macdown.com/mac/2252.html 来MacDown下载WATCH Screensaver for Mac版镜像包下载完成双击打开,双击镜像包内的[WATCH Screensaver.s

1.一个简单的OpenGL程序

一.OpenGL介绍 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的. 如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单. 2.强大的可移植性. 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机). 而OpenGL不仅用于 Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机.各种专

canvas仿屏幕保护运动线条

canvas是H5中及其重要的一个新标签,它得出现不仅让前端做图形图表功能变得异常强大,还用极强的性能丰富前端渲染页面的能力. Life is not a problem to be solved, but a reality to be experienced.人生不是待解决的难题,而是等着我们去体验的现实. 首先canvas标签 <canvas id="c1" width="" height=""></canvas>

Windows azure Web 应用程序代理服务器&mdash;ADFS的extranet访问权限

Windows azure Web 应用程序代理服务器-ADFS的extranet访问权限 我们之前介绍了,在windows azure下配置联合身份验证服务,实现通过本地的Active Direcroty用户验证范根windows azure Active Direcroty服务,默认操作后,只有在同一个内部网络才能访问,那我们如果要外部访问的话,我们需要怎么做呢,当然按照常理我们需要将ADFS的相应的端口对外发布即可,比如80.443等.但是在官网的方法是我们需要单独部署一台proxy服务,

OpenGL学习-------visual studio 2010配置和第一个OpenGL程序讲解

OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的.如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单. 2.强大的可移植性. 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机).而OpenGL不仅用于 Windows,还可

centos 去除屏幕保护

CentOS系统在用户闲置一段时间(默认为5分钟)后,会启动屏幕保护程序(默认的屏保为黑屏),并要求重新输入密码才能回到原来的桌面. 设置屏幕保护:System -> Preferences -> Screensaver. 如果需要取消屏幕保护的锁定功能,将Lock screen when screensaver is active前面的勾去掉就可以了. -------)[linux[email protected]linuxzgf ~]$ setterm -blank 0 关闭屏保,此命令执

(转)为C# Windows服务添加安装程序

本文转载自:http://kamiff.iteye.com/blog/507129 最近一直在搞Windows服务,也有了不少经验,感觉权限方面确定比一般程序要受限很多,但方便性也很多.像后台运行不阻塞系统,不用用户登录之类.哈 哈,扯远了,今天讲一下那个怎么给Windows服务做个安装包.为什么做安装包?当然是方便了,不用每次调用InstallUtil,还有,就是看上去 正规些. 不多说了,先来看看怎么做吧.首先,当然是创建一个Windows服务的项目.这个大家应该都知道怎么做(这都不明白的留