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.
