Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: OpenGL и C++  (Прочитано 19697 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« : 21-04-2009 20:24 » 

Инициализация OpenGL. Код:
Код:
#include <windows.h>

#include <tchar.h> // Для макроса _T

// Подключаем библиотеки OpenGL
#include <gl\gl.h>    // OpenGL32
#include <gl\glu.h>   // GLu32
//#include <gl\glaux.h> // GLaux

// Прототипы функций
LRESULT  CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
GLvoid ReSizeGLScene( GLsizei, GLsizei );
int InitGL( GLvoid );
int DrawGLScene( GLvoid );
GLvoid KillGLWindow( GLvoid );
BOOL CreateGLWindow( LPCWSTR title, int width, int height, int bits, bool fullscreenflag );

namespace { // Глобальные переменные
    const int screenw = 1024,
              screenh = 768;
    HGLRC hRC = NULL;       // Постоянный контекст рендеринга
    HDC hDC = NULL;         // Приватный контекст устройства GDI
    HWND hWnd = NULL;       // Здесь будет хранится дескриптор окна
    HINSTANCE hInstance;    // Здесь будет хранится дескриптор приложения
    bool keys[256];         // Массив, используемый для операций с клавиатурой
    bool active = true;     // Флаг активности окна, установленный в true по умолчанию
    bool fullscreen = true; // Флаг режима окна, установленный в полноэкранный по умолчанию
}

int WINAPI WinMain( HINSTANCE hInstance, // Дескриптор приложения
    HINSTANCE hPrevInstance,             // Дескриптор родительского приложения
    LPSTR lpCmdLine,                     // Параметры командной строки
    int nCmdShow )                       // Состояние отображения окна
{
    MSG  msg;          // Структура для хранения сообщения Windows
    BOOL done = false; // Логическая переменная для выхода из цикла
   
    // Спрашивает пользователя, какой режим экрана он предпочитает
    if( MessageBox( NULL, "Хотите ли Вы запустить приложение в полноэкранном режиме?",
            "Запустить в полноэкранном режиме?", MB_YESNO | MB_ICONQUESTION) == IDNO )
    {
        fullscreen = false; // Переключаем переменную fullscreen в оконный режим
    }
   
    // Создать наше OpenGL окно
    if( !CreateGLWindow( (WCHAR*) "OpenGL", screenw, screenh, 32, fullscreen ) )
    {
        return 0; // Выйти, если окно не может быть создано
    }

    while( !done ) // Цикл продолжается, пока done не равно true
    {
        if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) // Есть ли в очереди какое-нибудь сообщение?
        {
            if( msg.message == WM_QUIT ) // Мы поучили сообщение о выходе?
            {
                PostQuitMessage( 0 ); // В учебнике вызвана не была, но описывалась
                done = true; // Если так, done=true
            }
            else // Если нет, обрабатывает сообщения
            {
                TranslateMessage( &msg ); // Переводим сообщение
                DispatchMessage( &msg );  // Отсылаем сообщение
            }
        }
        else // Если нет сообщений
        {
            // Прорисовываем сцену.
            if( active )          // Активна ли программа?
            {
                if(keys[VK_ESCAPE]) // Было ли нажата клавиша ESC?
                {
                    done = true;    // ESC говорит об останове выполнения программы
                }
                else                // Не время для выхода, обновим экран.
                {
                    DrawGLScene();      // Рисуем сцену
                    SwapBuffers( hDC ); // Меняем буфер (двойная буферизация)
                }
            }
            // Меняем полноэкранный режим на экранный если нажато F11
            if( keys[VK_F11] ) // Была ли нажата F11?
            {
                keys[VK_F11] = false;      // Если так, меняем значение ячейки массива на false
                KillGLWindow();           // Разрушаем текущее окно
                fullscreen = !fullscreen; // Переключаем режим
                // Пересоздаём наше OpenGL окно
                if( !CreateGLWindow( (WCHAR*) _T("OpenGL"), screenw, screenh, 32, fullscreen ) )
                {
                    return 0; // Выходим, если это невозможно
                }
            }
        }
    }
    // done = false - завершаем работу приложения (корректно уничтожаем GL-окно)
    KillGLWindow();                // Разрушаем окно
    return ( msg.wParam );              // Выходим из программы
}

LRESULT CALLBACK WndProc( HWND  hWnd, // Дескриптор нужного окна
    UINT  uMsg,     // Сообщение для этого окна
    WPARAM  wParam, // Дополнительная информация
    LPARAM  lParam) // Дополнительная информация
{
    switch ( uMsg ) // Проверка сообщения для окна
    {
        case WM_ACTIVATE:           // Проверка сообщения активности окна
        {
            if( !HIWORD( wParam ) ) // Проверить состояние минимизации
            {
                active = true;      // Программа активна
            }
            else
            {
                active = false;     // Программа теперь не активна
            }
            return 0;               // Возвращаемся в цикл обработки сообщений
        }
        case WM_SYSCOMMAND:           // Перехватываем системную команду
        {
            switch ( wParam )         // Останавливаем системный вызов
            {
                case SC_SCREENSAVE:   // Пытается ли запустится скринсейвер?
                case SC_MONITORPOWER: // Пытается ли монитор перейти в режим сбережения энергии?
                return 0;             // Предотвращаем это
            }
            break; // Выход
        }
        case WM_CLOSE:            // Мы получили сообщение о закрытие?
        {
            PostQuitMessage( 0 ); // Отправить сообщение о выходе
            return 0;             // Вернуться назад
        }
        case WM_KEYDOWN:         // Была ли нажата кнопка?
        {
            keys[wParam] = true; // Если так, мы присваиваем этой ячейке true
            return 0;            // Возвращаемся
        }
        case WM_KEYUP:            // Была ли отпущена клавиша?
        {
            keys[wParam] = false; //  Если так, мы присваиваем этой ячейке false
            return 0;             // Возвращаемся
        }
        case WM_SIZE:                                        // Изменены размеры OpenGL окна
        {
            ReSizeGLScene( LOWORD(lParam), HIWORD(lParam) ); // Младшее слово=Width, старшее слово=Height
            return 0;                                        // Возвращаемся
        }
    }
   
    // Пересылаем все необработанные сообщения DefWindowProc
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
}

GLvoid ReSizeGLScene( GLsizei width, GLsizei height ) // Изменить размер и инициализировать окно GL
{
    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();                   // Сброс матрицы вида модели
}

int InitGL( GLvoid ) // Все установки касаемо OpenGL происходят здесь
{
    glShadeModel( GL_SMOOTH );              // Разрешить плавное цветовое сглаживание
   
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);   // Очистка экрана в черный цвет
   
    glClearDepth( 1.0f );                   // Разрешить очистку буфера глубины
    glEnable( GL_DEPTH_TEST );              // Разрешить тест глубины
    glDepthFunc( GL_LEQUAL );               // Тип теста глубины
   
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); // Улучшение в вычислении перспективы
   
    return true; // Инициализация прошла успешно
}

int DrawGLScene( GLvoid ) // Здесь будет происходить вся прорисовка
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // Очистить экран и буфер глубины
    glLoadIdentity(); // Сбросить текущую матрицу
   
    /* Вставка для рисования */

    return true; // Прорисовка прошла успешно
}

GLvoid KillGLWindow( GLvoid ) // Корректное разрушение окна
{
    if( fullscreen )                        // Мы в полноэкранном режиме?
    {
        ChangeDisplaySettings( NULL, 0 );   // Если да, то переключаемся обратно в оконный режим
        ShowCursor( true );                 // Показать курсор мышки
    }

    if( hRC )                               // Существует ли Контекст Рендеринга?
    {
        if( !wglMakeCurrent( NULL, NULL ) ) // Возможно ли освободить RC и DC?
        {
            MessageBox( NULL, "Release Of DC And RC Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION );
        }
        if( !wglDeleteContext( hRC ) )      // Возможно ли удалить RC?
        {
            MessageBox( NULL, "Release Rendering Context Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION );
        }
        hRC = NULL;                         // Установить RC в NULL
    }
   
    if( hDC && !ReleaseDC( hWnd, hDC ) )    // Возможно ли уничтожить DC?
    {
        MessageBox( NULL, "Release Device Context Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION );
        hDC=NULL;                           // Установить DC в NULL
    }
   
    if(hWnd && !DestroyWindow(hWnd))        // Возможно ли уничтожить окно?
    {
        MessageBox( NULL, "Could Not Release hWnd.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION );
        hWnd = NULL;                        // Установить hWnd в NULL
    }
   
    if( !UnregisterClass( "OpenGL", hInstance ) ) // Возможно ли разрегистрировать класс
    {
        MessageBox( NULL, "Could Not Unregister Class.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
        hInstance = NULL;                   // Установить hInstance в NULL
    }
}

BOOL CreateGLWindow( LPCWSTR title, int width, int height, int bits, bool fullscreenflag )
{
    GLuint PixelFormat; // Хранит результат после поиска
   
    WNDCLASS wc;        // Структура класса окна
   
    DWORD dwExStyle;    // Расширенный стиль окна
    DWORD dwStyle;      // Обычный стиль окна
   
    RECT WindowRect;                    // Grabs Rectangle Upper Left / Lower Right Values
    WindowRect.left = (long) 0;         // Установить левую составляющую в 0
    WindowRect.right = (long) width;    // Установить правую составляющую в Width
    WindowRect.top = (long) 0;          // Установить верхнюю составляющую в 0
    WindowRect.bottom = (long) height;  // Установить нижнюю составляющую в Height
   
    fullscreen = fullscreenflag; // Устанавливаем значение глобальной переменной fullscreen
   
    hInstance        = GetModuleHandle( NULL );             // Считаем дескриптор нашего приложения
    wc.style         = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;  // Перерисуем при перемещении и создаём скрытый DC
    wc.lpfnWndProc   = (WNDPROC) 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 = "OpenGL";                            // Устанавливаем имя классу

    if( !RegisterClass( &wc ) ) // Пытаемся зарегистрировать класс окна
    {
        MessageBox( NULL, "Failed To Register The Window Class.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
        return false; // Выход и возвращение функцией значения false
    }

    if( fullscreen ) // Полноэкранный режим?
    {
        DEVMODE dmScreenSettings; // Режим устройства
        memset( &dmScreenSettings, 0, sizeof( dmScreenSettings ) ); // Очистка для хранения установок
        dmScreenSettings.dmSize = sizeof( dmScreenSettings ); // Размер структуры Devmode
        dmScreenSettings.dmPelsWidth = width; // Ширина экрана
        dmScreenSettings.dmPelsHeight = height; // Высота экрана
        dmScreenSettings.dmBitsPerPel = bits; // Глубина цвета
        dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; // Режим Пикселя
       
        // Пытаемся установить выбранный режим и получить результат.  Примечание: CDS_FULLSCREEN убирает панель управления.
        if( ChangeDisplaySettings( &dmScreenSettings, CDS_FULLSCREEN ) != DISP_CHANGE_SUCCESSFUL )
        {
            // Если переключение в полноэкранный режим невозможно, будет предложено два варианта: оконный режим или выход.
            if( MessageBox( NULL, "The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?",
                "OpenGL", MB_YESNO | MB_ICONEXCLAMATION ) == IDYES )
            {
                fullscreen = false; // Выбор оконного режима (fullscreen = false)
            }
            else
            {
                // Выскакивающее окно, сообщающее пользователю о закрытие окна.
                MessageBox( NULL, "Program Will Now Close.", "ERROR", MB_OK | MB_ICONSTOP );
                return false; // Выход и возвращение функцией false
            }
        }
    }
   
    if(fullscreen) // Мы остались в полноэкранном режиме?
    {
        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,                        // Расширенный стиль для окна
                _T("OpenGL"),                     // Имя класса (такое же как при регистрации)
                (CHAR*) title,                    // Заголовок окна
                WS_CLIPSIBLINGS |                 // Требуемый стиль для окна
                WS_CLIPCHILDREN |                 // Требуемый стиль для окна
                dwStyle,                          // Выбираемые стили для окна
                0, 0,                             // Позиция окна
                WindowRect.right-WindowRect.left, // Вычисление подходящей ширины
                WindowRect.bottom-WindowRect.top, // Вычисление подходящей высоты
                NULL,                             // Нет родительского окна
                NULL,                             // Нет меню
                hInstance,                        // Дескриптор приложения
                NULL ) ) )                        // Не передаём ничего до WM_CREATE (???)
    {
        KillGLWindow(); // Восстановить экран
        MessageBox( NULL, "Window Creation Error.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
        return false; // Вернуть false
    }

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

    if( !( hDC = GetDC( hWnd ) ) ) // Можем ли мы получить Контекст Устройства?
    {
        KillGLWindow(); // Восстановить экран
        MessageBox( NULL, "Can't Create A GL Device Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
        return false;   // Вернуть false
    }

    if( !( PixelFormat = ChoosePixelFormat( hDC, &pfd ) ) ) // Найден ли подходящий формат пикселя?
    {
        KillGLWindow(); // Восстановить экран
        MessageBox( NULL, "Can't Find A Suitable PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
        return false;   // Вернуть false
    }

    if( !SetPixelFormat( hDC, PixelFormat, &pfd ) ) // Возможно ли установить Формат Пикселя?
    {
        KillGLWindow(); // Восстановить экран
        MessageBox( NULL, "Can't Set The PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
        return false;   // Вернуть false
    }

    if( !( hRC = wglCreateContext( hDC ) ) ) // Возможно ли установить Контекст Рендеринга?
    {
        KillGLWindow(); // Восстановить экран
        MessageBox( NULL, "Can't Create A GL Rendering Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
        return false;   // Вернуть false
    }

    if( !wglMakeCurrent( hDC, hRC ) ) // Попробовать активировать Контекст Рендеринга
    {
        KillGLWindow(); // Восстановить экран
        MessageBox( NULL, "Can't Activate The GL Rendering Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
        return false;   // Вернуть false
    }

    ShowWindow( hWnd, SW_SHOW );    // Показать окно
    SetForegroundWindow( hWnd );    // Слегка повысим приоритет
    SetFocus( hWnd );               // Установить фокус клавиатуры на наше окно
    ReSizeGLScene( width, height ); // Настроим перспективу для нашего OpenGL экрана.

    if( !InitGL() ) // Инициализация только что созданного окна
    {
        KillGLWindow(); // Восстановить экран
        MessageBox( NULL, _T("Initialization Failed."), _T("ERROR"), MB_OK | MB_ICONEXCLAMATION );
        return false;   // Вернуть false
    }

    return true; // Всё в порядке!
}

« Последнее редактирование: 22-04-2009 19:36 от Inkognito » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #1 : 21-04-2009 20:26 » 

Но запустить невозможно, так как находит ошибки без указаний строк. Как это исправить?
(JPG с ошибками вложен)

* Error.JPG (45.53 Кб - загружено 1297 раз.)
« Последнее редактирование: 21-04-2009 20:28 от Inkognito » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 21-04-2009 20:33 » 

Когда у тебя выскакивает ошибка "ֹUndefined reference", Это обозначает, что линковшик не смог определить линки на функции и переменные. Отсюда следует, ему нужно указать библиотеку (*.lib), В которой это все и определено.
« Последнее редактирование: 21-04-2009 20:35 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 21-04-2009 20:39 » 

Вот тут http://www.codenet.ru/progr/opengl/opengl_07.php для шестой студии рекомендуют
Цитата
Далее щелкаете Project->Settings->Link->Object/library modules: и добавьте туда opengl32.lib, glu32.lib и glaux.lib
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #4 : 22-04-2009 13:18 » 

Загрузил opengl32.lib и glu32.lib, и теперь не может найти reference для gluPerspective:
Цитата
[linker error] undefined reference to `gluPerspective@32'
Проблема в библиотеке?
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 22-04-2009 21:06 » 

Ага, всё ясно - ДА: библиотек glu32.lib много. У меня была на 12 кб. Теперь же я нашёл на 45 кб, вставил и всё заработало.
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #6 : 23-04-2009 21:57 » 

Создал 3D-куб, наложил на каждую грань текстуру. Общий "вес" текстур = 1 Мб. Увеличился ли при этом размер требуемой видео памяти на 1 Мб или нет?
« Последнее редактирование: 25-04-2009 17:04 от Inkognito » Записан
antiatom
Новенький

de
Offline Offline

« Ответ #7 : 29-04-2011 15:13 » new

Только начал OpenGl, написал первую прграмму

Код:
#include <GL\glut.h>
#include <GL\GL.h>



void display(void);
void init (void);

int main(int argc, char ** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(250, 250);
glutInitWindowPosition(100,100);
glutCreateWindow("hello");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_POLYGON);
glVertex3f(0.25, 0.25, 0.0);
glVertex3f(0.75, 0.25, 0.0);
glVertex3f(0.75, 0.75, 0.0);
glVertex3f(0.25 , 0.75, 0.0);
glEnd();
glFlush();
}

void init(void) {
glClearColor(0.0 , 0.0 , 0.0 , 0.0);
//glMarixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0 , 1.0);
}

при компиляции VS 2010 пишет следующее:

MSVCRTD.lib(crtexew.obj) : error LNK2019: ссылка на неразрешенный внешний символ _WinMain@16 в функции ___tmainCRTStartup


Подозреваю, что неправильно поставил Glut - скачал его отсюда http://www.xmission.com/~nate/glut/glut-3.7.6-bin.zip
и переписал 3 файла в соответствующие директории - в папках WINDOWS и VISUAL STUDIO



« Последнее редактирование: 29-04-2011 17:30 от Вад » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 29-04-2011 17:33 » 

antiatom, в Visual Studio нужно открыть свойства проекта, в дереве найти в свойствах Linker опцию Subsystem и изменить её.

Если хочется использовать функцию main, subsystem должна быть типа CONSOLE, если же хочется использовать subsystem WINDOWS, то главная функция программы должна называться WinMain (её параметры см. в MSDN).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
antiatom
Новенький

de
Offline Offline

« Ответ #9 : 01-05-2011 17:12 » 

Спасибо, всё получилось!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines