Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / winAPI c++ Во время растягивания окна пропадает изображение

winAPI c++ Во время растягивания окна пропадает изображение

Страницы: 1 2 3 4 5 Следующая »
раб вакуумной лампыПостоялецwww25 июля 20174:46#0
Всё вроде нормально рендерится, но когда хватаю за край окна и растягиваю его, экран заливается белым. Как сделать так, чтобы во время растяжения окна изображение рендерилось тоже  ?
std::cinУчастникwww25 июля 20174:54#1
Смотри что делают в движках при смене разрешения/размер окна и делай это после каждого получения сообщения об изменении окна.
раб вакуумной лампыПостоялецwww25 июля 20175:12#2
std::cin
Пробовал уже. В WM_SIZING вставлял код прям как ты говоришь. Всё равно та же шляпа.
FuntikПостоялецwww25 июля 20175:18#3
раб вакуумной лампы
В WndProc:
case WM_SIZE:
  g_windowWidth = LOWORD(lParam); 
  g_windowHeight = HIWORD(lParam);
  break;
раб вакуумной лампыПостоялецwww25 июля 20175:36#4
Funtik
> g_windowWidth
У меня таких  переменных вообще нет, есть структура
    window->window_width = LOWORD(lParam);
    window->window_heigh = HIWORD(lParam);

Но в таком виде не работает.

FuntikПостоялецwww25 июля 20175:44#5
раб вакуумной лампы
Должно работать, у меня же работает!
Показывай код!
раб вакуумной лампыПостоялецwww25 июля 20178:01#6
Funtik

Структура с разрешением окна

struct wndstr
{
public:
  wndstr() {};
  virtual ~wndstr() {};

  int window_width;
  int window_heigh;

};
wndstr* window_a = new wndstr();

Код изменения размера окна

void resize() {

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  glOrtho(0.0, 1024.0, 0.0, 768.0, -10.0, 100.0);

  glMatrixMode(GL_MODELVIEW);

}

Цикл рендера в WinMain

  while (msg.message != WM_QUIT)
  {
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
    else
      game();
  }

Код главного цикла игры

void game()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glPushMatrix();

  gluLookAt(0.0, 0.0, 20.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0);
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);



  glPopMatrix();
  SwapBuffers(g_hDC);
}

Код WndProc полностью

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch (message)
  {


  case WM_SIZE: {

    window_a->window_width = LOWORD(lParam);
    window_a->window_heigh = HIWORD(lParam);

    resize();

  }break;
  
  case WM_SIZING:
  {

  }break;




  default: {
    return DefWindowProc(hWnd, message, wParam, lParam);
  }break;

  }

  return 0;

}

FuntikПостоялецwww25 июля 20178:22#7
раб вакуумной лампы
Зачем ты загнал две переменные в структуру (ширину и высоту окна) ? У меня они глобальные, если не использую класс Application.
Ну и потом где у тебя glViewport() ???
Должно быть как-то так:
void game()
{
   glViewport(0, 0, window_width, window_height);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  ...
}
раб вакуумной лампыПостоялецwww25 июля 20178:31#8
Funtik

Да пробовал уже по всякому, не работает. Может это как-то связано с WM_PAINT ? У меня там вообще никакого кода нет.

FuntikПостоялецwww25 июля 20178:36#9
раб вакуумной лампы
> Может это как-то связано с WM_PAINT?
нет

раб вакуумной лампыПостоялецwww25 июля 201710:23#10
Funtik

Этот листинг скачал на иностранном сайте.
Те же фаберже. Вид ортогональный.
При попытке растянуть окно, вьюпорт остаётся тем же размером, только на белом фоне, который появляется там, где растянуто окно.

const char ClassName[] = "MainWindowClass";
HWND hWnd;
HDC hDC;
HGLRC hRC;
RECT ScreenRect;
RECT ClientRect;
float RotateX, RotateY, RotateZ;


void intPixelFormat()
{
  PIXELFORMATDESCRIPTOR pfd;
  memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));

  pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
  pfd.nVersion = 1;
  pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  pfd.iPixelType = PFD_TYPE_RGBA;
  pfd.cColorBits = 48; 
  pfd.cDepthBits = 32;

  g_hDC = GetDC(g_hWnd);
  GLuint iPixelFormat = ChoosePixelFormat(g_hDC, &pfd);

  if (iPixelFormat != 0) {
    PIXELFORMATDESCRIPTOR bestMatch_pfd;
    DescribePixelFormat(g_hDC, iPixelFormat, sizeof(pfd), &bestMatch_pfd);

    if (bestMatch_pfd.cDepthBits < pfd.cDepthBits)
    {
      return;
    }

    if (SetPixelFormat(g_hDC, iPixelFormat, &pfd) == FALSE)
    {
      DWORD dwErrorCode = GetLastError();
      return;
    }
  }
  else
  {
    DWORD dwErrorCode = GetLastError();
    return;
  }

  g_hRC = wglCreateContext(g_hDC);
  wglMakeCurrent(g_hDC, g_hRC);


  glClearColor( 0.9,0.5,0.1, 0.0f);
  //resize();

}
void SetGLProjection(int Width, int Height)
{

  if (Height == 0)
    Height = 1;

  glViewport(0, 0, Width, Height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0, (float)Width / (float)Height, 1.0, 200.0);

}
void SetGLView(int Width, int Height)
{

  SetGLProjection(Width, Height);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

}
void InitGL(int Width, int Height)
{

  SetGLView(Width, Height);



  glCullFace(GL_BACK);

  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

  glClearDepth(1.0);

  glDepthFunc(GL_LESS);

  glEnable(GL_DEPTH_TEST);

  glShadeModel(GL_SMOOTH);

  glEnable(GL_NORMALIZE);

  glEnable(GL_CULL_FACE);



  GLfloat light_ambient[] = { 0.2, 0.2, 0.2, 1.0 };

  glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);

  GLfloat light_position[] = { 200.0, 200.0, 200.0, 1.0 };

  glLightfv(GL_LIGHT0, GL_POSITION, light_position);

  glEnable(GL_LIGHTING);

  glEnable(GL_LIGHT0);



  GLfloat mat_ambient[] = { 0.1, 0.5, 1.0, 1.0 };

  GLfloat mat_diffuse[] = { 0.1, 0.5, 1.0, 1.0 };

  glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);

  glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

}
void ResizeGLScene(int Width, int Height)
{

  SetGLView(Width, Height);

}
void DrawGLScene(void)
{

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  GLfloat light_position[] = { 200.0, 200.0, 200.0, 1.0 };
  glLightfv(GL_LIGHT0, GL_POSITION, light_position);


  glPushMatrix();

  glTranslatef(0.0, 0.0, -5.0);
  glRotatef(RotateX, 1, 0, 0);
  glRotatef(RotateY, 0, 1, 0);
  glRotatef(RotateZ, 0, 0, 1);

  glBegin(GL_QUADS);

  glNormal3f(0.0, 0.0, 1.0);
  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);

  glNormal3f(0.0, 0.0, -1.0);
  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);

  glNormal3f(0.0, 1.0, 0.0);
  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);

  glNormal3f(0.0, -1.0, 0.0);
  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);

  glNormal3f(1.0, 0.0, 0.0);
  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);

  glNormal3f(-1.0, 0.0, 0.0);
  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();



  glPopMatrix();



  RotateX += 0.1;
  RotateY += -0.2;
  RotateZ += 0.3;

}
bool CreateGLContexts(HWND hWnd, HDC& hDC, HGLRC& hRC)
{

  static PIXELFORMATDESCRIPTOR pfd;
  pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
  pfd.nVersion = 1;
  pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  pfd.iPixelType = PFD_TYPE_RGBA;
  pfd.cColorBits = 48;   //          32 
  pfd.cRedBits = 0;
  pfd.cRedShift = 0;
  pfd.cGreenBits = 0;
  pfd.cGreenShift = 0;
  pfd.cBlueBits = 0;
  pfd.cBlueShift = 0;
  pfd.cAlphaBits = 0;
  pfd.cAlphaShift = 0;
  pfd.cAccumBits = 0;
  pfd.cAccumRedBits = 0;
  pfd.cAccumGreenBits = 0;
  pfd.cAccumBlueBits = 0;
  pfd.cAccumAlphaBits = 0;
  pfd.cDepthBits = 32;  //           16 
  pfd.cStencilBits = 0;
  pfd.cAuxBuffers = 0;
  pfd.iLayerType = PFD_MAIN_PLANE;
  pfd.bReserved = 0;
  pfd.dwLayerMask = 0;
  pfd.dwVisibleMask = 0;
  pfd.dwDamageMask = 0;
  hDC = GetDC(hWnd);

  intPixelFormat();
  int PixelFormat = ChoosePixelFormat(hDC, &pfd);


  if (!PixelFormat)
    return FALSE;

  if (!SetPixelFormat(hDC, PixelFormat, &pfd))
    return FALSE;

  hRC = wglCreateContext(hDC);

  if (!hRC)
    return FALSE;

  if (!wglMakeCurrent(hDC, hRC))
    return FALSE;

  return TRUE;

}
void ReleaseGLContexts(HWND hWnd, HDC hDC, HGLRC hRC)
{
  ChangeDisplaySettings(NULL, 0);
  wglMakeCurrent(hDC, NULL);
  wglDeleteContext(hRC);
  ReleaseDC(hWnd, hDC);
}

LRESULT CALLBACK WndProc(HWND    hWnd,
  UINT    Msg,
  WPARAM  wParam,
  LPARAM  lParam)
{

  switch (Msg)
  {

  case WM_CREATE:

    if (CreateGLContexts(hWnd, hDC, hRC))
    {
      GetClientRect(hWnd, &ClientRect);
      InitGL(ClientRect.right, ClientRect.bottom);
    }
    else
      PostQuitMessage(0);

    break;



  case WM_KEYDOWN:

    switch (wParam)
    {

    case VK_ESCAPE:
    case VK_RETURN:
    case VK_SPACE:

      SendMessage(hWnd, WM_CLOSE, 0, 0);

      break;

    }

    break;



  case WM_SIZE:

    GetClientRect(hWnd, &ClientRect);
    ResizeGLScene(ClientRect.right, ClientRect.bottom);

    break;
  case WM_SIZING:


    break;


  case WM_CLOSE:

    ReleaseGLContexts(hWnd, hDC, hRC);
    DestroyWindow(hWnd);

    break;



  case WM_DESTROY:

    PostQuitMessage(0);

    break;



  default:

    return (DefWindowProc(hWnd, Msg, wParam, lParam));

  }

  return (0);

}


INT WINAPI WinMain(HINSTANCE  hInstance,
  HINSTANCE  hPrevInstance,
  LPSTR      lpCmdLine,
  INT        nCmdShow)
{

  WNDCLASSEXW    wc;

  wc.cbSize = sizeof(WNDCLASSEXW);
  wc.style = 0;
  wc.lpfnWndProc = (WNDPROC)WndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = hInstance;
  wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(NULL));
  wc.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(NULL));
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  wc.lpszMenuName = NULL;
  wc.lpszClassName = (LPCWSTR)ClassName;

  if (!RegisterClassEx(&wc))
    return 0;

  GetWindowRect(GetDesktopWindow(), &ScreenRect);

  hWnd = CreateWindowExW(
    0,
    (LPCWSTR)ClassName,
    L"7777",
    WS_OVERLAPPEDWINDOW,
    (ScreenRect.right - 500) / 2, (ScreenRect.bottom - 500) / 2,
    500, 500,
    NULL,
    NULL,
    hInstance,
    NULL);

  if (!hWnd)
    return 0;

  ShowWindow(hWnd, SW_SHOW);
  UpdateWindow(hWnd);
  MSG Msg;
  while (1)
  {
    while (PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE))
    {
      if (GetMessage(&Msg, NULL, 0, 0))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
      else
        return Msg.wParam;
    }

    DrawGLScene();
    glFinish();
    SwapBuffers(hDC);

  }
}
nesПостоялецwww25 июля 201711:13#11
раб вакуумной лампы
Добавь ты уже обработку WM_PAINT.
case WM_PAINT:
   ValidateRect(hWnd, NULL);
   return 0;
раб вакуумной лампыПостоялецwww25 июля 201711:37#12
nes
WM_PAINT тут ни при чом
раб вакуумной лампыПостоялецwww25 июля 201711:55#13
Проблема была решена. Всем спасибо. К сожалению, студия зависла (ожидает завершения внутренней операции). Поэтому код скину только потом.
Daniil PetrovЗабаненwww25 июля 201713:03#14
раб вакуумной лампы
> Поэтому код скину только потом.
Жду :) у меня та же байда и хочется её решить!
Страницы: 1 2 3 4 5 Следующая »

/ Форум / Программирование игр / Общее

Тема в архиве.

2001—2018 © GameDev.ru — Разработка игр