Нарисуйте масштабированное растровое изображение с помощью wxhaskell - PullRequest
5 голосов
/ 01 сентября 2011

Пример imageviewer показывает, как отобразить изображение в ScrolledWindow.

Что если я хочу отобразить изображение в доступном пространстве, масштабируя растровое изображение по мере необходимости?

Мой гугл-фу подвел меня на этом.

edit: Я думал, что у меня что-то есть с scrolledWindowSetScale, но похоже, что здесь это не поможет.

1 Ответ

2 голосов
/ 02 сентября 2011

Некоторые люди указали мне на функции в wxCore, поэтому я мог найти решение, которое работает.

Функция, которая выполняет рисование в исходном примере:

onPaint vbitmap dc viewArea
  = do mbBitmap <- get vbitmap value
       case mbBitmap of
         Nothing -> return () 
         Just bm -> drawBitmap dc bm pointZero False []

с использованием dcSetUserScale от wxCore, я смог изменить его так, чтобы он масштабировался таким образом:

(sw - это окно прокрутки)

onPaint sw img dc viewArea = do
  mimg <- get img value
  case mimg of
    Nothing -> return ()
    Just bm -> do
      bsize <- get bm size
      vsize <- get sw size
      let scale = calcScale bsize vsize
      dcSetUserScale dc scale scale
      drawBitmap dc bm pointZero False []

calcScale :: Size -> Size -> Double
calcScale (Size bw bh) (Size vw vh) = min scalew scaleh
  where scalew = fromIntegral vw / fromIntegral bw
        scaleh = fromIntegral vh / fromIntegral bh
...