Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SDl window resize problem #151

Open
pst-82 opened this issue Jan 1, 2025 · 7 comments
Open

SDl window resize problem #151

pst-82 opened this issue Jan 1, 2025 · 7 comments

Comments

@pst-82
Copy link

pst-82 commented Jan 1, 2025

Hello how can I fix the problem that is visualized in the picture when resizing the sdl window.
What do I need to do to make it scale with the window ?
SDL_WINDOWEVENT: if Event.window.event = SDL_WINDOWEVENT_RESIZED then begin WindowWidth := Event.window.data1; WindowHeight := Event.window.data2; UpdateDestRect(); end;
Code not working

sdl2_screen

@suve
Copy link
Collaborator

suve commented Jan 1, 2025

You need to post more code.

  • How do you set up the SDL window?
  • What does your rendering function look like?

@pst-82
Copy link
Author

pst-82 commented Jan 1, 2025

program project1;

{$APPTYPE GUI}

uses
  sdl2, sdl2_image, Windows;

var
  SDLWindow: PSDL_Window;
  SDLRenderer: PSDL_Renderer;
  Running: Boolean;
  Event: TSDL_Event;

  WindowWidth, WindowHeight: Integer;

begin
  // Inicjalizacja SDL
  if SDL_Init(SDL_INIT_VIDEO) < 0 then
  begin
    MessageBox(0, 'SDL could not initialize!', 'Error', MB_ICONERROR or MB_OK);
    Halt(1);
  end;

  // Ustawienia początkowe okna
  WindowWidth := 800;
  WindowHeight := 600;

  // Tworzenie okna SDL
  SDLWindow := SDL_CreateWindow('SDL window', SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WindowWidth, WindowHeight, SDL_WINDOW_RESIZABLE);
  if SDLWindow = nil then
  begin
    MessageBox(0, 'Window could not be created!', 'Error', MB_ICONERROR or MB_OK);
    SDL_Quit;
    Halt(1);
  end;

  // Tworzenie renderera
  SDLRenderer := SDL_CreateRenderer(SDLWindow, -1, SDL_RENDERER_ACCELERATED or SDL_RENDERER_PRESENTVSYNC);
  if SDLRenderer = nil then
  begin
    MessageBox(0, 'Renderer could not be created!', 'Error', MB_ICONERROR or MB_OK);
    SDL_DestroyWindow(SDLWindow);
    SDL_Quit;
    Halt(1);
  end;


   // Pętla główna aplikacji
  Running := True;
  while Running do
  begin
    // Obsługa zdarzeń
    while SDL_PollEvent(@Event) <> 0 do
    begin
      case Event.type_ of
        SDL_QUITEV:
          Running := False;
        SDL_KEYDOWN:
          if Event.key.keysym.sym = SDLK_ESCAPE then
            Running := False;
        SDL_WINDOWEVENT:
          case Event.window.event of
            SDL_WINDOWEVENT_RESIZED:
              begin


              end;
          end;
    end;

   // Renderowanie tła
    SDL_SetRenderDrawColor(SDLRenderer, 72, 69, 71, 255); // Szary kolor
    SDL_RenderClear(SDLRenderer); // Wypełnij całe okno

    // Zaktualizuj ekran
    SDL_RenderPresent(SDLRenderer);
  end;

  // Sprzątanie zasobów
  SDL_DestroyRenderer(SDLRenderer);
  SDL_DestroyWindow(SDLWindow);
  SDL_Quit;
end.

@pst-82
Copy link
Author

pst-82 commented Jan 2, 2025

Does anyone have any idea how this problem can be solved ?

@suve
Copy link
Collaborator

suve commented Jan 2, 2025

Is this the actual code, though? It fails to compile for me because of an unclosed block.

while Running do
begin // <-- 1st block opened
    while SDL_PollEvent(@Event) <> 0 do
    begin // <-- 2nd block opened
      case Event.type_ of // <-- 3rd block opened
        SDL_QUITEV:
          Running := False;
        SDL_KEYDOWN:
          if Event.key.keysym.sym = SDLK_ESCAPE then
            Running := False;
        SDL_WINDOWEVENT:
          case Event.window.event of // <-- 4th block opened
            SDL_WINDOWEVENT_RESIZED:
              begin // <-- 5th block opened


              end; // <-- close 5th block
          end; // <-- close 4th block
    end; // <-- close 3rd block

    SDL_SetRenderDrawColor(SDLRenderer, 72, 69, 71, 255);
    SDL_RenderClear(SDLRenderer);

    // Zaktualizuj ekran
    SDL_RenderPresent(SDLRenderer);
  end; <-- close 2nd block

After I added another end; to the event handling bit, it works and resizes fine.

@pst-82
Copy link
Author

pst-82 commented Jan 2, 2025

program project1;

{$APPTYPE GUI}

uses
  sdl2, sdl2_image, Windows;

var
  SDLWindow: PSDL_Window;
  SDLRenderer: PSDL_Renderer;
  Running: Boolean;
  Event: TSDL_Event;

  WindowWidth, WindowHeight: Integer;

begin
  // Inicjalizacja SDL
  if SDL_Init(SDL_INIT_VIDEO) < 0 then
  begin
    MessageBox(0, 'SDL could not initialize!', 'Error', MB_ICONERROR or MB_OK);
    Halt(1);
  end;

  // Ustawienia początkowe okna
  WindowWidth := 800;
  WindowHeight := 600;

  // Tworzenie okna SDL
  SDLWindow := SDL_CreateWindow('SDL window', SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WindowWidth, WindowHeight, SDL_WINDOW_RESIZABLE);
  if SDLWindow = nil then
  begin
    MessageBox(0, 'Window could not be created!', 'Error', MB_ICONERROR or MB_OK);
    SDL_Quit;
    Halt(1);
  end;

  // Tworzenie renderera
  SDLRenderer := SDL_CreateRenderer(SDLWindow, -1, SDL_RENDERER_ACCELERATED or SDL_RENDERER_PRESENTVSYNC);
  if SDLRenderer = nil then
  begin
    MessageBox(0, 'Renderer could not be created!', 'Error', MB_ICONERROR or MB_OK);
    SDL_DestroyWindow(SDLWindow);
    SDL_Quit;
    Halt(1);
  end;


   // Pętla główna aplikacji
  Running := True;
  while Running do
  begin
    // Obsługa zdarzeń
    while SDL_PollEvent(@Event) <> 0 do
    begin
      case Event.type_ of
        SDL_QUITEV:
          Running := False;
        SDL_KEYDOWN:
          if Event.key.keysym.sym = SDLK_ESCAPE then
            Running := False;
        SDL_WINDOWEVENT:
          case Event.window.event of
            SDL_WINDOWEVENT_RESIZED:
              begin


              end;
          end;
    end;

    end;

   // Renderowanie tła
    SDL_SetRenderDrawColor(SDLRenderer, 72, 69, 71, 255); // Szary kolor
    SDL_RenderClear(SDLRenderer); // Wypełnij całe okno

    // Zaktualizuj ekran
    SDL_RenderPresent(SDLRenderer);
  end;



  // Sprzątanie zasobów
  SDL_DestroyRenderer(SDLRenderer);
  SDL_DestroyWindow(SDLWindow);
  SDL_Quit;
end.

I mean that the window scales only the background does not scale at the same time as the window

@suve
Copy link
Collaborator

suve commented Jan 2, 2025

Hmm. I'm getting the exact same behaviour with an analogue C program - SDL does not create any events while dragging the window corner, only when I finish resizing the window (i.e. let go of the dragging action). You might be better off asking about this in the SDL forums.

@pst-82
Copy link
Author

pst-82 commented Jan 2, 2025

Thanks for the hint

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants