• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SDL2 skalowanie okna

0 głosów
252 wizyt
pytanie zadane 31 grudnia 2024 w Inne języki przez niezalogowany
edycja 1 stycznia 2025

Witam napisalem szkielet aplikacji sdl z pustym oknem ale pojawil sie problem podczas skalowania okna

tlo sie nie skaluje , dopiero aktualizuje sie po puszczeniu myszy.

Jak moge ten problem rozwiazac ?

 

program project1;

{$mode objfpc}{$H+}

uses
  SDL2, SDL2_image, SysUtils;

var
  Window: PSDL_Window;
  Renderer: PSDL_Renderer;
  Texture: PSDL_Texture = nil;  // tekstura
  Event: TSDL_Event;
  Running: Boolean;
  ImageFile: String;
  WindowWidth, WindowHeight: Integer;
  ImageWidth, ImageHeight: Integer;
  DestRect: TSDL_Rect;

procedure UpdateDestRect();
begin
  // Dokonaj aktualizacji rozmiarów prostokąta docelowego
  if ImageWidth > ImageHeight then
  begin
    DestRect.w := WindowWidth;  // Ustal szerokość okna
    DestRect.h := (ImageHeight * DestRect.w) div ImageWidth;  // Zachowaj proporcje
  end
  else
  begin
    DestRect.h := WindowHeight;  // Ustal wysokość okna
    DestRect.w := (ImageWidth * DestRect.h) div ImageHeight;  // Zachowaj proporcje
  end;

  // Wyśrodkowanie obrazu
  DestRect.x := (WindowWidth - DestRect.w) div 2;
  DestRect.y := (WindowHeight - DestRect.h) div 2;
end;

procedure LoadTexture(FileName: String);
var
  Surface: PSDL_Surface;
begin
  if Texture <> nil then
  begin
    SDL_DestroyTexture(Texture);
  end;

  // Ładowanie obrazka
  Surface := IMG_Load(PChar(FileName));
  if Surface = nil then
  begin
    WriteLn('Failed to load image: ', IMG_GetError);
    Exit;
  end;

  // Tworzenie tekstury z powierzchni
  Texture := SDL_CreateTextureFromSurface(Renderer, Surface);
  SDL_FreeSurface(Surface);

  if Texture = nil then
  begin
    WriteLn('Failed to create texture: ', SDL_GetError);
  end
  else
  begin
    // Uzyskanie wymiarów załadowanego obrazu
    SDL_QueryTexture(Texture, nil, nil, @ImageWidth, @ImageHeight);
    UpdateDestRect();  // Aktualizuj prostokąt docelowy przy załadowaniu nowego obrazu
  end;
end;

begin
  if SDL_Init(SDL_INIT_VIDEO) < 0 then
  begin
    WriteLn('Unable to initialize SDL: ', SDL_GetError);
    Exit;
  end;

  // Tworzenie skalowalnego okna
  WindowWidth := 800;
  WindowHeight := 600;
  Window := SDL_CreateWindow('Drop Image Example', SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WindowWidth, WindowHeight, SDL_WINDOW_ALLOW_HIGHDPI or SDL_WINDOW_RESIZABLE);
  if Window = nil then
  begin
    WriteLn('Unable to create window: ', SDL_GetError);
    SDL_Quit;
    Exit;
  end;

  Renderer := SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED);
  if Renderer = nil then
  begin
    WriteLn('Unable to create renderer: ', SDL_GetError);
    SDL_DestroyWindow(Window);
    SDL_Quit;
    Exit;
  end;

  // Pętla główna programu
  Running := True;
  while Running do
  begin
    while SDL_PollEvent(@Event) <> 0 do
    begin
      case Event.type_ of
        SDL_QUITEV:
          Running := False;
        SDL_DROPFILE:
          begin
            ImageFile := string(Event.drop.file_);
            LoadTexture(ImageFile);
            SDL_free(Event.drop.file_);  // Zwolnienie pamięci z SDL
          end;
        SDL_WINDOWEVENT:
          if Event.window.event = SDL_WINDOWEVENT_RESIZED then
          begin
            WindowWidth := Event.window.data1;  // Nowa szerokość
            WindowHeight := Event.window.data2;  // Nowa wysokość
            UpdateDestRect(); // Aktualizacja prostokąta docelowego podczas zmiany rozmiaru okna
          end;
      end;
    end;

    // Rysowanie białego tła
    SDL_SetRenderDrawColor(Renderer, 255, 255, 255, 255);
    SDL_RenderClear(Renderer);

    if Texture <> nil then
    begin
      // Rysowanie tekstury z zachowaniem proporcji
      SDL_RenderCopy(Renderer, Texture, nil, @DestRect);
    end;

    SDL_RenderPresent(Renderer);
  end;

  // Sprzątanie
  if Texture <> nil then SDL_DestroyTexture(Texture);
  SDL_DestroyRenderer(Renderer);
  SDL_DestroyWindow(Window);
  SDL_Quit;
end.
end.

 

komentarz 2 stycznia 2025 przez TOWaD Mądrala (6,770 p.)

O ile dobrze się oriętuje, to nie masz podpiętego odswierzania okna pod przesuwanie myszy. To taki luźny pomysł.

dopiero aktualizuje sie po puszczeniu myszy.

komentarz 2 stycznia 2025 przez niezalogowany

@Pawel82, tak tylko ze nic nie dziala

SDL_WINDOWEVENT_RESIZED
SDL_WINDOWEVENT_SIZE_CHANGED

SDL_WINDOWEVENT_EXPOSED

SDL_UpdateWindowSurface(SDLWindow);

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 288 wizyt
pytanie zadane 5 października 2016 w HTML i CSS przez DariuszH Gaduła (3,100 p.)
0 głosów
1 odpowiedź 588 wizyt
pytanie zadane 15 lipca 2021 w C i C++ przez BartoszKX Nowicjusz (160 p.)
+1 głos
3 odpowiedzi 653 wizyt
pytanie zadane 16 marca 2016 w C i C++ przez Gandalf Obywatel (1,260 p.)

93,691 zapytań

142,609 odpowiedzi

323,215 komentarzy

63,215 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...