Войти
ПрограммированиеФорумОбщее

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

Страницы: 1 2 3 4 5 Следующая »
#0

Всё вроде нормально рендерится, но когда хватаю за край окна и растягиваю его, экран заливается белым. Как сделать так, чтобы во время растяжения окна изображение рендерилось тоже  ?

25 июля 2017


#1

Смотри что делают в движках при смене разрешения/размер окна и делай это после каждого получения сообщения об изменении окна.

25 июля 2017

#2

std::cin
Пробовал уже. В WM_SIZING вставлял код прям как ты говоришь. Всё равно та же шляпа.

25 июля 2017

#3

раб вакуумной лампы
В WndProc:

case WM_SIZE:
  g_windowWidth = LOWORD(lParam); 
  g_windowHeight = HIWORD(lParam);
  break;

25 июля 2017

#4

Funtik
> g_windowWidth
У меня таких  переменных вообще нет, есть структура
    window->window_width = LOWORD(lParam);
    window->window_heigh = HIWORD(lParam);

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

25 июля 2017

#5

раб вакуумной лампы
Должно работать, у меня же работает!
Показывай код!

25 июля 2017

#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;

}

25 июля 2017

#7

раб вакуумной лампы
Зачем ты загнал две переменные в структуру (ширину и высоту окна) ? У меня они глобальные, если не использую класс Application.
Ну и потом где у тебя glViewport() ???
Должно быть как-то так:

void game()
{
   glViewport(0, 0, window_width, window_height);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  ...
}

25 июля 2017

#8

Funtik

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

25 июля 2017

#9

раб вакуумной лампы
> Может это как-то связано с WM_PAINT?
нет

25 июля 2017

#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);

  }
}

25 июля 2017

#11

раб вакуумной лампы
Добавь ты уже обработку WM_PAINT.

case WM_PAINT:
   ValidateRect(hWnd, NULL);
   return 0;

25 июля 2017

#12

nes
WM_PAINT тут ни при чом

25 июля 2017

#13

Проблема была решена. Всем спасибо. К сожалению, студия зависла (ожидает завершения внутренней операции). Поэтому код скину только потом.

25 июля 2017

#14

раб вакуумной лампы
> Поэтому код скину только потом.
Жду :) у меня та же байда и хочется её решить!

25 июля 2017

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумОбщее

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