Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2013, 11:09   #1
L.M.
Пользователь
 
Регистрация: 27.06.2011
Сообщений: 16
Печаль Как сделать из этого скринсейвер (C++ с использованием OpenGL)

Что нужно дописать, чтобы из этой программы сделать скринсейвер(заставку,хранитель экрана)?
Что-то на найденных примерах у меня разобраться не получилось. помогите пожалуйста!
PHP код:
#include <windows.h>  
#include <GL/glut.h>  
#include <GL/glaux.h> 
#include <GL/glu.h> 

unsigned int tex[1];

float rotx,roty,rotz;

float LightAmbient[]= { 0.5f0.5f0.5f1.0f };
float LightPosition[]= { 0.0f0.0f5.0f1.0f }; 
float LightDiffuse[]= { 1.0f1.0f1.0f1.0f };  

void LoadTexs() 

{
    
// Загрузка картинки:
    
AUX_RGBImageRec *tex1;
    
tex1 auxDIBImageLoad("iseu.bmp");
    
// Создание текстуры:
    
glGenTextures(1, &tex[0]);
    
glBindTexture(GL_TEXTURE_2Dtex[0]);

    
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    
glTexImage2D(GL_TEXTURE_2D03tex1->sizeXtex1->sizeY0,

        
GL_RGBGL_UNSIGNED_BYTEtex1->data);

}

void init() 



    
LoadTexs(); 
    
glEnable(GL_TEXTURE_2D);
    
glClearColor (0.00.00.00.0);
    
glClearDepth(1.0); 
    
glDepthFunc(GL_LESS); 
    
glEnable(GL_DEPTH_TEST); 
    
glShadeModel (GL_SMOOTH);
    
glTranslatef(0.0f,0.0f,-5.0f);
    
//параметры освещения 
    
glLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient); 
    
glLightfv(GL_LIGHT1,GL_POSITION,LightPosition);
    
glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse); 

    
glEnable(GL_LIGHT1);
    
glEnable(GL_LIGHTING);
    
glEnable (GL_COLOR_MATERIAL);

    
glColorMaterial (GL_FRONT,GL_AMBIENT_AND_DIFFUSE);

}

void display(void)

{

    
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    
glPushMatrix();//сохранение матрицы
    
glTranslatef(0.0f,0.0f,-1.5f); // премещение по Z
    
glRotatef(rotx,1.0,0.0,0.0);  // вращение по оси X
    
glTranslatef(0.0f,0.0f,-0.5f); 
    
glRotatef(roty,0.0,1.0,0.0); // вращение по оси Y
    
glRotatef(rotz,0.0,0.0,1.0); // вращение по оси Z

    
glBegin(GL_QUADS);

    
glNormal3f0.0f0.0f1.0f);// Передняя грань
    
glTexCoord2f(0.0f0.0f); glVertex3f(-1.0f, -1.0f1.0f);
    
glTexCoord2f(1.0f0.0f); glVertex3f1.0f, -1.0f1.0f); 
    
glTexCoord2f(1.0f1.0f); glVertex3f1.0f1.0f1.0f); 
    
glTexCoord2f(0.0f1.0f); glVertex3f(-1.0f1.0f1.0f); 

    
glNormal3f0.0f0.0f,-1.0f);// Задняя грань
    
glTexCoord2f(1.0f0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); 
    
glTexCoord2f(1.0f1.0f); glVertex3f(-1.0f1.0f, -1.0f); 
    
glTexCoord2f(0.0f1.0f); glVertex3f1.0f1.0f, -1.0f); 
    
glTexCoord2f(0.0f0.0f); glVertex3f1.0f, -1.0f, -1.0f); 

    
glNormal3f0.0f1.0f0.0f);// Верхняя грань
    
glTexCoord2f(0.0f1.0f); glVertex3f(-1.0f1.0f, -1.0f); 
    
glTexCoord2f(0.0f0.0f); glVertex3f(-1.0f1.0f1.0f); 
    
glTexCoord2f(1.0f0.0f); glVertex3f1.0f1.0f1.0f); 
    
glTexCoord2f(1.0f1.0f); glVertex3f1.0f1.0f, -1.0f); 

    
glNormal3f0.0f,-1.0f0.0f);// Нижняя грань
    
glTexCoord2f(1.0f1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); 
    
glTexCoord2f(0.0f1.0f); glVertex3f1.0f, -1.0f, -1.0f); 
    
glTexCoord2f(0.0f0.0f); glVertex3f1.0f, -1.0f1.0f); 
    
glTexCoord2f(1.0f0.0f); glVertex3f(-1.0f, -1.0f1.0f); 

    
glNormal3f1.0f0.0f0.0f);// Правая грань
    
glTexCoord2f(1.0f0.0f); glVertex3f1.0f, -1.0f, -1.0f);
    
glTexCoord2f(1.0f1.0f); glVertex3f1.0f1.0f, -1.0f); 
    
glTexCoord2f(0.0f1.0f); glVertex3f1.0f1.0f1.0f); 
    
glTexCoord2f(0.0f0.0f); glVertex3f1.0f, -1.0f1.0f); 

    
glNormal3f(-1.0f0.0f0.0f);// Левая грань
    
glTexCoord2f(0.0f0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); 
    
glTexCoord2f(1.0f0.0f); glVertex3f(-1.0f, -1.0f1.0f); 
    
glTexCoord2f(1.0f1.0f); glVertex3f(-1.0f1.0f1.0f); 
    
glTexCoord2f(0.0f1.0f); glVertex3f(-1.0f1.0f, -1.0f); 

    
glEnd();

    
glPopMatrix(); //вызов матрицы

    
rotx+=0.1
    
roty+=0.1
    
rotz+=0.1

    
glutSwapBuffers();

}

void reshape (int wint h)

{

    
glViewport (00, (GLsizeiw, (GLsizeih); 
    
glMatrixMode (GL_PROJECTION);
    
glLoadIdentity (); /
    
gluPerspective(60.0, (GLfloatw/(GLfloath1.020.0); 
    
glMatrixMode(GL_MODELVIEW); 
    
glLoadIdentity(); 
    
gluLookAt (0.00.53.00.00.00.00.01.00.0); 

}


int main(int argcchar** argv)

{
    
glutInit(&argcargv);
    
glutInitDisplayMode (GLUT_DOUBLE GLUT_RGB GLUT_DEPTH); 

    
glutInitWindowPosition (00); //позиция окна
    
glutCreateWindow ("DroY Cube (c) 2003 Press 'ESC' to exit");
    
init ();
    
glutFullScreen(); //полноэкранный режим
    
glutDisplayFunc(display); 
    
glutReshapeFunc(reshape);
    
glutIdleFunc(display);
    
glutMainLoop();

    return 
0;


L.M. вне форума Ответить с цитированием
Старый 03.05.2013, 16:38   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Вообще скринсейвер для винды это просто программа. Любую прогу переименуйте в bla-bla-bla.scr и поместите в правильное место и будет у вас еще один скринсейвер. На Windows XP точно работает.
Список мест:


Windows 95: C:\Windows (?)
Windows 98: C:\Windows\System or C:\Windows
Windows XP: C:\Windows or C:\Windows\System32
Windows 2000: C:\WINNT\System32
Взято отсюда
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 03.05.2013 в 16:46.
ROD вне форума Ответить с цитированием
Старый 03.05.2013, 20:35   #3
L.M.
Пользователь
 
Регистрация: 27.06.2011
Сообщений: 16
По умолчанию

так-то оно да. видала я эту статью.
но ведь ещё #include <scrnsave.h> подключается.
и добавляются 3 функции:
PHP код:
LRESULT WINAPI ScreenSaverProc (HWND hWndUINT messageWPARAM wParam
 
LPARAM lParam)

 {

 return 
0;
 }

BOOL WINAPI ScreenSaverConfigureDialog (HWND hDlgUINT messageWPARAM 
 wParam
LPARAM lParam)

 {
 return 
true;
 }

BOOL WINAPI RegisterDialogClasses (HANDLE hInst)
 {
 return 
true;
 } 
первая из которой должная являться точкой входа вместо main (в чем и есть особенность)

только вот не получается у меня справиться и запихнуть в неё то что нужно
L.M. вне форума Ответить с цитированием
Старый 03.05.2013, 20:45   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2L.M.
это просто вспомогательное апи от микрософта, чтобы создать "настоящий" скринсейвер, который можно будет настраивать через свойства экрана - заставка (или как там сейчас).
RegisterDialogClasses - регистрируешь свой диалог
ScreenSaverConfigureDialog - тут ты показываешь свой диалог настройки скринсейвера (скорость анимации и тп)
ScreenSaverProc - тут рисуешь саму анимацию
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 03.05.2013, 21:31   #5
L.M.
Пользователь
 
Регистрация: 27.06.2011
Сообщений: 16
По умолчанию

Спасибо!

у меня новая беда!!!
текстура не загружается!!!
никуда ещё ничего не перемещала,просто запустила .exe,а он мне ругается "falied to open DIB file iseu.bmp"
и дело в том,что когда в Visual Studio проект запускаю,работает!
в чем дело-то?

не одно, так другое((

Последний раз редактировалось L.M.; 03.05.2013 в 21:43.
L.M. вне форума Ответить с цитированием
Старый 03.05.2013, 21:53   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2L.M.
картинка должна лежать в той же директории, что и бинарник
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 03.05.2013, 22:12   #7
L.M.
Пользователь
 
Регистрация: 27.06.2011
Сообщений: 16
По умолчанию

фух..всё в порядке) работает!) спасибо
L.M. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
После сохранения в файл *.xls при открытии этого файла выдается предупреждение. Как от этого избавиться? A-IX-2 Общие вопросы Delphi 1 13.11.2011 20:33
Хочу сделать форму для ввода паролей! Для этого текст должен быть зашифрован в (*****) ! Как сделать vitaaly Visual C++ 2 12.02.2011 12:29
Как сделать скринсейвер на Делфи KompMAN Помощь студентам 5 25.12.2010 02:13
как сделать такое освещение(opengl) ? NiCola999 Общие вопросы C/C++ 3 20.11.2010 15:02
как удалить скринсейвер? ronich Помощь студентам 6 24.10.2007 20:36