使用 wxhaskell 绘制缩放位图

发布于 2024-12-02 08:56:20 字数 267 浏览 3 评论 0原文

图像查看器示例展示了如何在 ScrolledWindow 中显示图像。

如果我想在可用空间中显示图像,并根据需要缩放位图,该怎么办?

我的谷歌搜索在这一点上让我失败了。

编辑:我以为我有 scrolledWindowSetScale 的东西,但看起来它在这里没有帮助。

The imageviewer example shows how to display an image in a ScrolledWindow.

What if I want to display the image in the available space, scaling the bitmap as needed?

My google-fu failed me on this one.

edit: I thought I had something with scrolledWindowSetScale, but it looks like it's not going to help here.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

绻影浮沉 2024-12-09 08:56:20

有些人向我指出了 wxCore 中的函数,这样我就可以找到一个可行的解决方案。

在原始示例中进行绘图的函数是:

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

使用 wxCore 中的 dcSetUserScale ,我能够将其修改为以这种方式缩放:(

sw 是scrolledWindow )

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

Some people pointed me to functions in wxCore, so I could find a solution that works.

The function that does the drawing in the original example is:

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

using dcSetUserScale from wxCore, I was able to modify it to scale that way:

( sw is the scrolledWindow )

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文