Код:
#include "stdafx.h"
#include "Belphegor Engine.h"
#include <windows.h>
#include "KWnd.h"
#include "resource.h"
#include "resource1.h"
#include "windowsx.h"
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
DLGPROC WndChild(HWND, UINT, WPARAM, LPARAM);
GLvoid DrawGLScene(GLvoid);
static HGLRC hRC;
static HDC hDC;
HWND main, child;
HINSTANCE hInst;
////////////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hInst=hInstance;
MSG msg;
WNDCLASS wc, wc1;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);;
wc.lpszMenuName = NULL;
wc.lpszClassName = "Main Window";
if(!RegisterClass(&wc))
{
MessageBox(0,"Failed To Register The Window Class. wc","Error",MB_OK|MB_ICONERROR);
return FALSE;
}
main=CreateWindow("Main Window","Belphegor Engine 1.0",WS_VISIBLE | WS_OVERLAPPEDWINDOW |WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP,100,100,800,600,NULL,NULL,hInstance,NULL);
ShowWindow(main,nCmdShow);
UpdateWindow(main);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DrawGLScene();
SwapBuffers(hDC);
return msg.wParam;
}
GLvoid InitGL(GLsizei Width, GLsizei Height) // Вызвать после создания окна GL
{
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
// Очистка экрана в черный цвет
glClearDepth(1.0); // Разрешить очистку буфера глубины
glDepthFunc(GL_LESS); // Тип теста глубины
glEnable(GL_DEPTH_TEST);// разрешить тест глубины
glShadeModel(GL_SMOOTH);// разрешить плавное цветовое сглаживание
glMatrixMode(GL_PROJECTION);// Выбор матрицы проекции
glLoadIdentity(); // Сброс матрицы проекции
gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
// Вычислить соотношение геометрических размеров для окна
glMatrixMode(GL_MODELVIEW);// Выбор матрицы просмотра модели
}
GLvoid ReSizeGLScene(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 DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// очистка Экрана и буфера глубины
glLoadIdentity();
// Сброс просмотра
glTranslatef(-1.5f,0.0f,-18.0f); // Сдвинемся влево на 1.5 единицы и
// в экран на 6.0
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); // Сдвинем вправо на 3 единицы
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();
}
DLGPROC WndChild(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HWND hRenderArea = GetDlgItem(hWnd, IDC_STATIC);
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(msg)
{
case WM_INITDIALOG:
hDC = GetDC(hRenderArea); // Получить контекст устройства для окна
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;
}
else
{
MessageBox(0,"IT IS OK","OK",MB_OK|MB_ICONERROR);
}
GetClientRect(hRenderArea, &Screen);
InitGL(400, 300);
break;
case WM_DESTROY:
case WM_CLOSE:
ChangeDisplaySettings(NULL, 0);
wglMakeCurrent(hDC,NULL);
wglDeleteContext(hRC);
ReleaseDC(hRenderArea,hDC);
PostQuitMessage(0);
break;
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
child = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG1), main, (DLGPROC) WndChild);
break;
case WM_CLOSE:
DestroyWindow(hWnd);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return (DefWindowProc(hWnd, msg, wParam, lParam));
}
return 0;
}