OpenGl в Screensaver. Как?
От: Danila_  
Дата: 18.11.02 21:41
Оценка:
Как подключить OpenGL к хранителю экрана? Ниже показан код, который выдаёт ошибку при обращении к GLU32.DLL. Что не так? Помогите сделать работу над ошибками. Подскажите, кто что знает в этом деле, please...
// ScreenQwer.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "scrnsave.h"
#include "windows.h"
#include <gl\gl.h> // Заголовочный файл для OpenGL32 библиотеки
#include <gl\glu.h> // Заголовочный файл для GLu32 библиотеки
#include <gl\glaux.h> // Заголовочный файл для GLaux библиотеки

LRESULT WINAPI ScreenSaverProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static PAINTSTRUCT ps = {NULL};
static HPEN hPen1;
static HGLRC hRC; // Постоянный контекст рендеринга
static int x_max, y_max;
//static GLfloat rtri; // Угол для треугольника

RECT Screen;
GLuint PixelFormat;
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR), // Размер этой структуры
1, // Номер версии (?)
PFD_DRAW_TO_WINDOW | // Формат для Окна
PFD_SUPPORT_OPENGL | // Формат для OpenGL
PFD_DOUBLEBUFFER, // Формат для двойного буфера
PFD_TYPE_RGBA, // Требуется RGBA формат
16, // Выбор 16 бит глубины цвета
0, 0, 0, 0, 0, 0, // Игнорирование цветовых битов (?)
0, // нет буфера прозрачности
0, // Сдвиговый бит игнорируется (?)
0, // Нет буфера аккумуляции
0, 0, 0, 0, // Биты аккумуляции игнорируются (?)
16, // 16 битный Z-буфер (буфер глубины)
0, // Нет буфера траффарета
0, // Нет вспомогательных буферов (?)
PFD_MAIN_PLANE, // Главный слой рисования
0, // Резерв (?)
0, 0, 0 // Маски слоя игнорируются (?)
};

switch(message)
{

case WM_CREATE:
// x_max = GetSystemMetrics(SM_CXSCREEN);
// y_max = GetSystemMetrics(SM_CYSCREEN);
static HDC hDC = GetDC(hWnd);
PixelFormat = ChoosePixelFormat(hDC, &pfd);
if (!PixelFormat)
{
MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR);
PostQuitMessage(0);
// Это сообщение говорит, что программа должна завершится
break; // Предтовращение повтора кода
}
if(!SetPixelFormat(hDC,PixelFormat,&pfd))
{
MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR);
PostQuitMessage(0);
break;
}
//-----------------------------------
hRC = wglCreateContext(hDC);
if(!hRC)
{
MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR);
PostQuitMessage(0);
//break;
}
if(!wglMakeCurrent(hDC, hRC))
{
MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR);
PostQuitMessage(0);
//break;
}
GetClientRect(0,&Screen);

//------------------------ Подключение OpenGL -----------------------
glClearColor(0.5f, 0.0f, 0.0f, 0.0f); // Очистка экрана в черный цвет
glClearDepth(1.0); // Разрешить очистку буфера глубины
glDepthFunc(GL_LESS); // Тип теста глубины
glEnable(GL_DEPTH_TEST); // разрешить тест глубины
glShadeModel(GL_SMOOTH); // разрешить плавное цветовое сглаживание
glMatrixMode(GL_PROJECTION); // Выбор матрицы проекции
glLoadIdentity(); // Сброс матрицы проекции
GetClientRect(hWnd, &Screen);
//int Width = Screen.right;
//int Height = Screen.bottom;
gluPerspective(45.0f,(GLfloat)x_max/(GLfloat)y_max,0.1f,100.0f);
// Вычислить соотношение геометрических размеров для окна
glMatrixMode(GL_MODELVIEW); // Выбор матрицы просмотра модели

break;

case WM_PAINT:

x_max = GetSystemMetrics(SM_CXSCREEN);
y_max = GetSystemMetrics(SM_CYSCREEN);
//center_x = x_max / 2;
//center_y = y_max / 2;*/

hDC = BeginPaint(hWnd, &ps);

if(fChildPreview)
{
SetBkColor(hDC, RGB(0, 0, 0));
SetTextColor(hDC, RGB(255, 255, 0));
char szPreview[] = "SCREEnSAVER";
TextOut(hDC, 20, 45, szPreview, strlen(szPreview));
}
else
{
glClearColor(0.5f, 0.0f, 0.0f, 0.0f); // Очистка экрана в черный цвет

//---------------------- Рисование ----------------------------

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Очистка экрана и буфера глубины
glLoadIdentity(); // Сброс просмотра
SetPixel(hDC, 100, 100, RGB(255, 0,0));
SetPixel(hDC, 50, 100, RGB(0, 255,0));
GLUquadricObj* quadricObj;
glPushMatrix();
gluSphere(quadricObj, 1,32,32);
glPopMatrix();
glTranslatef(-0.0f,2.5f,-16.0f); // Сдвиг влево и вглубь экрана
//glRotatef(rtri,1.0f,1.0f,1.0f); // Вращение пирамиды по оси Y
glBegin(GL_TRIANGLES); // Начало рисования пирамиды

//рисование треугольника
glTranslatef(-1.5f,1.0f,-10.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f); // Красный
glVertex3f( 0.0f, 1.0f, 0.0f); // Верх треугольника (Передняя)
glColor3f(0.0f,1.0f,0.0f); // Зеленный
glVertex3f(-1.0f,-1.0f, 1.0f); // Левая точка
glColor3f(0.0f,0.0f,1.0f); // Синий
glVertex3f( 1.0f,-1.0f, 1.0f); // Правая точка
//правая сторона
glColor3f(1.0f,0.0f,0.0f); // Красная
glVertex3f( 0.0f, 1.0f, 0.0f); // Верх треугольника (Правая)
glColor3f(0.0f,0.0f,1.0f); // Синия
glVertex3f( 1.0f,-1.0f, 1.0f); // Лево треугольника (Правая)
glColor3f(0.0f,1.0f,0.0f); // Зеленная
glVertex3f( 1.0f,-1.0f, -1.0f); // Право треугольника (Правая)

glEnd(); // Наполовину закончили рисовать пирамиду
// Вращение треугольника по оси Y
//rtri-=1.0f; // Увеличение переменной вращения для треугольника
}

EndPaint(hWnd, &ps);
break;

case WM_DESTROY:
case WM_CLOSE:
ChangeDisplaySettings(NULL, 0);

wglMakeCurrent(hDC,NULL);
wglDeleteContext(hRC);
ReleaseDC(hWnd,hDC);

PostQuitMessage(0);
break;

default:
return DefScreenSaverProc(hWnd, message,
wParam, lParam);
}

return 0;
}

BOOL WINAPI ScreenSaverConfigureDialog (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
return true;
}

BOOL WINAPI RegisterDialogClasses (HANDLE hInst)
{
return true;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.