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

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

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

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


#1
4:54, 25 июля 2017

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

#2
5:12, 25 июля 2017

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

#3
5:18, 25 июля 2017

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

case WM_SIZE:
  g_windowWidth = LOWORD(lParam); 
  g_windowHeight = HIWORD(lParam);
  break;
#4
5:36, 25 июля 2017

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

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

#5
5:44, 25 июля 2017

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

#6
8:01, 25 июля 2017

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;

}

#7
8:22, 25 июля 2017

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

void game()
{
   glViewport(0, 0, window_width, window_height);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  ...
}
#8
8:31, 25 июля 2017

Funtik

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

#9
8:36, 25 июля 2017

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

#10
10:23, 25 июля 2017

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

  }
}
#11
11:13, 25 июля 2017

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

case WM_PAINT:
   ValidateRect(hWnd, NULL);
   return 0;
#12
11:37, 25 июля 2017

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

#13
11:55, 25 июля 2017

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

#14
13:03, 25 июля 2017

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

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

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