Flying Cow
Меню сайта
Вход:
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Категории раздела
Cтатьи наших пользователей [0]
Движки и конструкторы [35]
Наши игры [2]
Полезные статьи общего назначения [3]
Главная » Статьи » Полезные статьи общего назначения

Каркас оконного OpenGL приложения на примере вращающегося куба
Данное приложение изначально создавалось как курсовая работа на 3 курсе, использует библиотеки opengl32.lib и glu32.lib. Данный код - пример заведомо рабочего приложения OpenGL и ничего более.

wina.cpp
/////////////////////////////////////////////////////////////////////////////////////////

/// wina.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"
#include <gl/gl.h>        // OpenGL
#include <gl/glu.h>    // GLU

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;                                // current instance
TCHAR szTitle[MAX_LOADSTRING];                                // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];

static HWND hWnd, hdwnd, hownd;                        // The title bar text
static HDC hdc;
static HGLRC hRC;        // Это контекст рендеринга
BOOL keys[256];        // это массивчик, который нам пригодится
            // для обработки нажатия клавиш
GLfloat Trot;
GLfloat Qrot;

float ro=0,x=0,y=0,z=0,ug=0;

GLvoid Initial(GLsizei Width, GLsizei Height);       
// по названию ясно, это инициализация всей страны (т.е. OpenGL)

GLvoid Resize(GLsizei Width, GLsizei Height);
// эта маленькая функция будет вызываться при получении окном сообщения WM_SIZE

GLvoid Draw(GLvoid);    // это центр вселенной для OpenGL

// Foward declarations of functions included in this code module:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc1(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    MSG msg;
//    HACCEL hAccelTable;

    // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_WINA, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
DEVMODE dmScreenSettings;

    memset(&dmScreenSettings, 0, sizeof(DEVMODE));
    dmScreenSettings.dmSize            = sizeof(DEVMODE);
    dmScreenSettings.dmPelsWidth    = 1024;
    dmScreenSettings.dmPelsHeight    = 768;
    dmScreenSettings.dmFields        = DM_PELSWIDTH | DM_PELSHEIGHT;
    ChangeDisplaySettings(&dmScreenSettings, WS_OVERLAPPEDWINDOW );

    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);
    hdwnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About);
    //hownd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, (DLGPROC)WndProc1);
    SetFocus(hWnd);
    while(1)
    {
        while(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
        {
            if(GetMessage(&msg, NULL, 0, 0))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
            {
                return TRUE;
            }
        }
        Draw();
        SwapBuffers(hdc);
        if(keys[VK_ESCAPE]) SendMessage(hWnd, WM_CLOSE, 0, 0);
    }

    return msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage is only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(hInstance, (LPCTSTR)IDI_WINA);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = (LPCWSTR)IDC_WINA;
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

    return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
 
   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      0, 0, 1024, 768, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   //ShowWindow(hWnd, nCmdShow);
   //UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND    - process the application menu
//  WM_PAINT    - Paint the main window
//  WM_DESTROY    - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hwnd2, UINT message, WPARAM wParam, LPARAM lParam)
{
//    int wmId, wmEvent;
//    PAINTSTRUCT ps;
   
    RECT Screen;        // Это структурка в которую мы поместим размеры области экрана
    GLuint PixelFormat;    // формат пикселя

    static PIXELFORMATDESCRIPTOR pfd =
    {
        sizeof(PIXELFORMATDESCRIPTOR),// размер структуры
        1,            // версия ?
        PFD_DRAW_TO_WINDOW|    // format must support Window
        PFD_SUPPORT_OPENGL|    // format must support OpenGL
        PFD_DOUBLEBUFFER,        // must support double buffer
        PFD_TYPE_RGBA,        // требуется RGBA формат
        16,            // 16Bit color depth
        0, 0, 0, 0, 0, 0,        // Color bits ignored ?
        0,            // No Alpha buffer
        0,            // shift bit ignored
        0,            // no accumulation buffer
        0, 0, 0, 0,        // accumulation buffer bits ignored
        16,            // 16bit z-buffer (depth buffer)
        0,            // no stencil buffer
        0,            // no auxiliary buffer
        PFD_MAIN_PLANE,        // main drawing layer
        0,            // reserved
        0, 0, 0            // layer mask ignored
    };

    switch (message)
    {
    /*case WM_COMMAND:
        {
            switch (LOWORD (wParam))
    case ID_32771: CreateDialog(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About); break;
                //DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About); break;
        }
        break;*/
        case WM_CREATE:            // на этапе создания приложения мы должны настроить
                    // формат пикселей и инициализироваит библиотеку
        hdc = GetDC(hwnd2);        // получаем контекст windows

        // Следующие несколько строк настраивают формат пикселей
        PixelFormat = ChoosePixelFormat(hdc, &pfd);

        if(!PixelFormat){
            MessageBox(0, (LPCWSTR)"Can't find suitable PixelFormat",
                (LPCWSTR)"Error", MB_OK|MB_ICONERROR);
            PostQuitMessage(0);
            break;
        }

        if(!SetPixelFormat(hdc, PixelFormat, &pfd)) {
            MessageBox(0, (LPCWSTR)"Can't set The PixelFormat",
                (LPCWSTR)"Error", MB_OK|MB_ICONERROR);
            PostQuitMessage(0);
            break;
        }
        hRC = wglCreateContext(hdc);    // создаем контекст рендеринга
        if(!hRC) {
            MessageBox(0, (LPCWSTR)"Can't Create Render Device Context",
                (LPCWSTR)"Error",MB_OK|MB_ICONERROR);
            PostQuitMessage(0);
            break;
        }
        if(!wglMakeCurrent(hdc, hRC)) {    // устанавливаем его текущим
            MessageBox(0, (LPCWSTR)"Can't set current Render Device Context",
                (LPCWSTR)"Error",MB_OK|MB_ICONERROR);
            PostQuitMessage(0);
            break;
        }

        GetClientRect(hwnd2, &Screen);    // получаем клиентскую область
        Initial(Screen.right, Screen.bottom);// инициализация OpenGL
        break;
    case WM_CLOSE:
    case WM_DESTROY:                // по CLOSE и/или DESTROY
        ChangeDisplaySettings(NULL, 0);    // восстанавливаем установки

        wglMakeCurrent(hdc, NULL);        // устанавливаем обычный device context
        wglDeleteContext(hRC);        // удаляем контекст рендеринга
        ReleaseDC(hwnd2, hdc);        // освобождаем device context

        PostQuitMessage(0);
        break;
    case WM_SIZE:                // ну это для resize ( хотя как сделать resize
                        // для fuulscreen application я не знаю ;) )
        Resize(LOWORD(lParam), HIWORD(lParam));
        break;
    default:
        return( DefWindowProc(hwnd2, message, wParam, lParam));
    }
    return(0);

}
//char *str = new char;
char str[20];
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    str[0] = '0';
    switch (message)
    {
        case WM_INITDIALOG:
                return TRUE;

        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return TRUE;
            }
            switch (LOWORD(wParam))
            {
                case IDC_ROTATION:
                {
                SendMessage(GetDlgItem(hdwnd, IDC_EDIT1),EM_GETLINE,0,(LPARAM)str);
                x = atof(str);
                //x = (int)str - (int)'0';
                SendMessage(GetDlgItem (hdwnd, IDC_EDIT2),EM_GETLINE,0,(LPARAM)str);
                y = atof(str);
                //y = (int)str - (int)'0';
                SendMessage(GetDlgItem (hdwnd, IDC_EDIT3),EM_GETLINE,0,(LPARAM)str);
                z = atof(str);
                //z = (int)str - (int)'0';
                ro = 1;
                } break;
                case IDC_ROTED: {} break;
                case IDC_STOP: ro = 0; break;
            }
            break;
    }
    return FALSE;
}

GLvoid Initial(GLsizei Width, GLsizei Height)
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);// устанавливаем цвет для очистки буфера цвета
    glClearDepth(1.0);        // устенавливаем параметр для очистки буфера глубины
    glDepthFunc(GL_LESS);    // настройка Z буфера
    glEnable(GL_DEPTH_TEST);    // и, наконец, включение

    glShadeModel(GL_SMOOTH);    // выбираете режим затенения ( flat или smooth )

    glMatrixMode(GL_PROJECTION);// устанавливаем текушей матрицей матрицу проекта
    glLoadIdentity();        // обнуляем эту самую матрицу


    // настраиваем перспективу ( вот она, функция из glu32 )
    gluPerspective(45.0f, (GLfloat)Width / (GLfloat)Height, 0.1f, 100.0f);
    glMatrixMode(GL_MODELVIEW);    // и переключаемся в модельную матрицу
}

GLvoid Resize(GLsizei Width, GLsizei Height)
{
    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);
}

GLvoid Draw(GLvoid)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glTranslatef(0.0f, 0.0f, -5.0f);
    glRotatef(Trot, x, y, z);   
    glBegin(GL_LINE_STRIP);
        glColor3f(0.0f,1.0f,0.0f);   
        glVertex3f( 1.0f, 1.0f, 1.0f);
        glVertex3f( 1.0f, -1.0f, 1.0f);
        glVertex3f( -1.0f, -1.0f, 1.0f);
        glVertex3f( -1.0f, 1.0f, 1.0f);
        glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glEnd();
glBegin(GL_LINE_STRIP);
        glColor3f(1.0f,0.5f,0.0f);
        glVertex3f( 1.0f, 1.0f, -1.0f);
        glVertex3f( 1.0f, -1.0f, -1.0f);
        glVertex3f( -1.0f, -1.0f, -1.0f);
        glVertex3f( -1.0f, 1.0f, -1.0f);
        glVertex3f( 1.0f, 1.0f, -1.0f);
glEnd();
glBegin(GL_LINE_STRIP);
        glColor3f(1.0f,0.0f,0.0f);
        glVertex3f( 1.0f, 1.0f, 1.0f);
        glVertex3f(1.0f, 1.0f, -1.0f);
glEnd();
glBegin(GL_LINE_STRIP);
        glColor3f(1.0f,1.0f,0.0f);
        glVertex3f( 1.0f,-1.0f, 1.0f);
        glVertex3f(1.0f,-1.0f,-1.0f);
glEnd();
glBegin(GL_LINE_STRIP);
        glColor3f(0.0f,0.0f,1.0f);   
        glVertex3f(-1.0f, 1.0f, 1.0f);
        glVertex3f(-1.0f, 1.0f,-1.0f);
 glEnd();
glBegin(GL_LINE_STRIP);
        glColor3f(1.0f,0.0f,1.0f);   
        glVertex3f( -1.0f, -1.0f, 1.0f);
        glVertex3f( -1.0f, -1.0f, -1.0f);
    glEnd();
   
    glEnd();
    if (ug) {Trot = ug/100; ug = 0;} else Trot += 0.3f * ro;
}

//////////////////////////////////////////////////////////////////////
wina.h
///////////////////////////////////////////////////////////////////////
#pragma once

#include "resource.h"

/////////////////////////////////////////////////////////////////////
Resource.h
////////////////////////////////////////////////////////////////////
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by wina.rc
//
#define IDC_MYICON                      2
#define IDD_WINA_DIALOG                 102
#define IDS_APP_TITLE                   103
#define IDD_ABOUTBOX                    103
#define IDM_ABOUT                       104
#define IDD_ABOUTBOX1                   104
#define IDM_EXIT                        105
#define IDI_WINA                        107
#define IDI_SMALL                       108
#define IDC_WINA                        109
#define IDR_MAINFRAME                   128
#define IDD_DIALOG1                     129
#define IDC_EDIT1                       1000
#define IDC_EDIT2                       1001
#define IDC_EDIT3                       1002
#define IDC_ROTATION                    1003
#define IDC_ROTED                       1004
#define IDC_BUTTON3                     1005
#define IDC_STOP                        1005
#define IDC_BUTTON4                     1006
#define IDC_BUTTON5                     1007
#define ID_32771                        32771
#define IDC_STATIC                      -1

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC                     1
#define _APS_NEXT_RESOURCE_VALUE        130
#define _APS_NEXT_COMMAND_VALUE         32772
#define _APS_NEXT_CONTROL_VALUE         1008
#define _APS_NEXT_SYMED_VALUE           110
#endif
#endif

//////////////////////////////////////////////////////////////////////////
wina.rc
///////////////////////////////////////////////////////////////////////////
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Russian resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif //_WIN32

/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

IDC_WINA MENU
BEGIN
    POPUP "Файл"
    BEGIN
        MENUITEM "E&xit",                       IDM_EXIT
        MENUITEM "Меню",                        ID_32771
    END
END


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_ABOUTBOX DIALOGEX 0, 0, 233, 161
STYLE DS_ABSALIGN | DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_SYSMENU
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    LTEXT           "made by robesh",IDC_STATIC,9,111,133,8,SS_NOPREFIX
    LTEXT           "Copyright (C) 2011",IDC_STATIC,7,137,114,8
    EDITTEXT        IDC_EDIT1,33,18,102,12,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT2,33,33,102,12,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT3,33,49,100,12,ES_AUTOHSCROLL
    PUSHBUTTON      "Вращение",IDC_ROTATION,36,68,71,17
    PUSHBUTTON      "Стоп",IDC_STOP,38,88,66,16
END

IDD_ABOUTBOX1 DIALOGEX 0, 0, 343, 179
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "About wina"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    LTEXT           "Вращение куба Беженцев Р.В. 8ВТб-1",IDC_STATIC,7,152,133,8,SS_NOPREFIX
    LTEXT           "Copyright (C) 2011",IDC_STATIC,173,150,114,8
    DEFPUSHBUTTON   "OK",IDOK,286,158,50,14,WS_GROUP
    EDITTEXT        IDC_EDIT1,33,18,102,12,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT2,33,33,102,12,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT3,35,49,100,11,ES_AUTOHSCROLL
    PUSHBUTTON      "Вращение",IDC_ROTATION,36,68,71,17
    PUSHBUTTON      "Поворот",IDC_ROTED,38,90,68,17
    PUSHBUTTON      "Стоп",IDC_STOP,39,111,66,16
    PUSHBUTTON      "Button4",IDC_BUTTON4,7,129,56,18
    PUSHBUTTON      "Button5",IDC_BUTTON5,74,129,60,17
END

IDD_DIALOG1 DIALOGEX 233, 0, 461, 437
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE | WS_SYSMENU
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_ABOUTBOX, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 226
        TOPMARGIN, 7
        BOTTOMMARGIN, 154
    END

    IDD_ABOUTBOX1, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 336
        TOPMARGIN, 7
        BOTTOMMARGIN, 172
    END

    IDD_DIALOG1, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 454
        TOPMARGIN, 7
        BOTTOMMARGIN, 176
    END
END
#endif    // APSTUDIO_INVOKED

#endif    // Russian resources
/////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32

/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_WINA                ICON                    "wina.ico"
IDI_SMALL               ICON                    "small.ico"

/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//

IDC_WINA ACCELERATORS
BEGIN
    "?",            IDM_ABOUT,              ASCII,  ALT
    "/",            IDM_ABOUT,              ASCII,  ALT
END


#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE
BEGIN
    "#ifndef APSTUDIO_INVOKED\r\n"
    "#include ""targetver.h""\r\n"
    "#endif\r\n"
    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "#include ""windows.h""\r\n"
    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "\0"
END

3 TEXTINCLUDE
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// String Table
//

STRINGTABLE
BEGIN
    IDS_APP_TITLE           "wina"
    IDC_WINA                "WINA"
END

#endif    // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED


Категория: Полезные статьи общего назначения | Добавил: robesh (10.06.2011)
Просмотров: 1750 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
Наш опрос
Оцените мой сайт
Всего ответов: 52
Друзья

Браузерные Игры

Сообщество КОМА

Copyright Flying Cow © 2024Сайт создан в системе uCoz