für einen kleinen Image-Viewer, den ich nur schreibe, um PureBASIC ein bisschen besser kennenzulernen, möchte ich gern folgendes erreichen:
Ein Bild, dessen Dimensionen entweder Höher oder Breiter (oder beides) als die Ausmaße des Desktops sind, soll unter Beibehaltung der Seitenverhältnisse skaliert angezeigt werden.
Dabei soll das Bild _immer_ die Desktophöhe haben (abzüglich Höhe der Titelleiste und der Taskleiste).
Hier wird die Fenstergröße ohne Taskleiste und Titelleiste berechnet:
Code: Alles auswählen
Procedure CalcNewWindowHeight()
hWnd = FindWindow_("Shell_TrayWnd", 0)
GetWindowRect_(hWnd, @RECT)
NewWindowHeight = RECT\top
GetWindowRect_(WindowID(), @RECT)
NewWindowHeight = NewWindowHeight - (RECT\bottom - WindowHeight())
EndProcedure
Und hier sitzt noch irgendwo ein Fehler:
Code: Alles auswählen
Procedure ShowImage()
UseImage(ImgID)
If ImageHeight() > NewWindowHeight And ImageWidth() > DesktopWidth(0)
y_ratio.f = NewWindowHeight / ImageHeight()
ResizeImage(ImgID, ImageWidth(), ImageHeight() * y_ratio.f, #PB_Image_Smooth)
x_ratio.f = (DesktopWidth(0) / ImageWidth()) * y_ratio.f
ResizeImage(ImgID, ImageWidth() * x_ratio.f, ImageHeight(), #PB_Image_Smooth)
ts = 1
EndIf
If ImageHeight() > NewWindowHeight And ts <> 1
y_ratio.f = NewWindowHeight / ImageHeight()
ResizeImage(ImgID, ImageWidth() * y_ratio.f, ImageHeight() * y_ratio.f, #PB_Image_Smooth)
EndIf
If ImageWidth() > DesktopWidth(0) And ts <> 1
x_ratio.f = DesktopWidth(0) / ImageWidth()
ResizeImage(ImgID, ImageWidth() * x_ratio.f, ImageHeight() * x_ratio.f, #PB_Image_Smooth)
EndIf
ResizeWindow(ImageWidth(), ImageHeight())
ResizeGadget(1, 0, 0, ImageWidth(), ImageHeight())
SetGadgetState(1, UseImage(ImgID))
SetWindowTitle(0, "FastImageViewer V1.0 - Image: " + Str(nImage)+ " of " + Str(z))
FreeImage(ImgID)
EndProcedure

Könnte mir jemand Tips zur Verbesserung geben? Ich finde den/die Fehler einfach nicht...
Danke,
Matthias