PMG

Форумы по созданию игр
Текущее время: 19 апр 2024 02:54

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Рисование в дочернем окне через OpenGL ??
СообщениеДобавлено: 13 июл 2012 19:44 
Не в сети
Новичок

Зарегистрирован: 13 июл 2012 19:42
Сообщения: 4
У меня появились проблемы с этим, то есть я делаю все как для обычного окна, но оно получается белым и ничего не рисует ? в чем может быть проблема ? Есть какие то особенности рисования в дочернем окне ??


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование в дочернем окне через OpenGL ??
СообщениеДобавлено: 14 июл 2012 19:27 
Не в сети
Новичок

Зарегистрирован: 13 июл 2012 19:42
Сообщения: 4
ну вообщем я сначала регестрирую класс основного окна
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);

потом на сообщение WM_CREATE создаю дочернее
child = CreateWindow("static","CLASS", WS_CHILD | WS_VISIBLE |WS_CAPTION | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,10,10,400,300,main,NULL,hInst,NULL);
ShowWindow(child,SW_SHOW);
UpdateWindow(child);

И вот WndProc Дочернего окна
LRESULT CALLBACK WndChild(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
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_CREATE:
hDC = GetDC(child); // Получить контекст устройства для окна
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(hWnd, &Screen);
InitGL(400, 300);
break;
case WM_DESTROY:
case WM_CLOSE:
ChangeDisplaySettings(NULL, 0);

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

PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wParam, lParam));
}
return 0;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование в дочернем окне через OpenGL ??
СообщениеДобавлено: 16 июл 2012 11:25 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
выложи весь проект, пожалуйста.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование в дочернем окне через OpenGL ??
СообщениеДобавлено: 16 июл 2012 15:05 
Не в сети
Новичок

Зарегистрирован: 13 июл 2012 19:42
Сообщения: 4
Код:
#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;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование в дочернем окне через OpenGL ??
СообщениеДобавлено: 18 июл 2012 11:38 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Если можно просто весь проект с *.vcproj и исходником в виде архива. Чтобы мог у себя на компе разархивировать, скомпилировать, посмотреть что к чему...

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рисование в дочернем окне через OpenGL ??
СообщениеДобавлено: 19 июл 2012 12:31 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Попробывал скомпилировать код - не получилось... А так анализировать, что не правильно - довольно сложно.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 41


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB