在 Haskell 中 GTK 的 DrawingArea 上绘制文本

发布于 2024-10-21 15:57:14 字数 314 浏览 6 评论 0原文

我有一个 DrawingArea ,可以使用诸如 drawRectangledrawLine 等基元在其上进行绘制。如何在该区域上绘制文本?我最感兴趣的是快速输出一行文本的东西。

Graphics.UI.Gtk.Gdk.Drawable.layoutLine 似乎是我想要的,但它需要一个 Graphics.Rendering.Pango.Layout.LayoutLine 作为输入。如何构建 LayoutLine

还有比这样做更好的选择吗?

谢谢!

I have a DrawingArea onto which I can draw using primitives such as drawRectangle and drawLine. How do I draw text onto that area? I'm most interested in something that quickly outputs a single line of text.

Graphics.UI.Gtk.Gdk.Drawable.layoutLine seems to be what I want, but it wants a Graphics.Rendering.Pango.Layout.LayoutLine as input. How do I construct that LayoutLine?

Are there better alternatives than doing it this way?

Thanks!

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

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

发布评论

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

评论(2

温柔戏命师 2024-10-28 15:57:14

我不知道你是否会考虑使用开罗。如果是这样,我认为函数 showText 可能就是您正在寻找的。在写入文本之前,使用 cairo 函数 moveTo 移动到特定位置。这是我能制作的最简单的工作示例之一:

import Graphics.UI.Gtk
import Graphics.Rendering.Cairo

main :: IO ()
main = do
    initGUI
    window      <- windowNew
    drawingArea <- drawingAreaNew
    containerAdd window drawingArea

    drawingArea `onExpose` (\_ -> renderScene drawingArea)
    window `onDestroy` mainQuit

    windowSetDefaultSize window 640 480
    widgetShowAll window
    mainGUI

renderScene :: DrawingArea -> IO Bool
renderScene da = do
    dw <- widgetGetDrawWindow da
    renderWithDrawable dw $ do setSourceRGBA 0.5 0.5 0.5 1.0
                               moveTo 100.0 100.0
                               showText "HelloWorld"
    return True

我发现以下内容是一个很好的指南,尽管它不适用于 Haskell:

I don't know if you would consider using Cairo. If so, I think the function showText may be what you are looking for. Use the cairo function moveTo to move to a specific location before writing the text. This is one of the simplest working examples I can produce:

import Graphics.UI.Gtk
import Graphics.Rendering.Cairo

main :: IO ()
main = do
    initGUI
    window      <- windowNew
    drawingArea <- drawingAreaNew
    containerAdd window drawingArea

    drawingArea `onExpose` (\_ -> renderScene drawingArea)
    window `onDestroy` mainQuit

    windowSetDefaultSize window 640 480
    widgetShowAll window
    mainGUI

renderScene :: DrawingArea -> IO Bool
renderScene da = do
    dw <- widgetGetDrawWindow da
    renderWithDrawable dw $ do setSourceRGBA 0.5 0.5 0.5 1.0
                               moveTo 100.0 100.0
                               showText "HelloWorld"
    return True

I found the following to be an excellent guide, even though it was not for Haskell:
http://zetcode.com/tutorials/cairographicstutorial/cairotext/

懷念過去 2024-10-28 15:57:14

我已经找到了用 Pango 来做到这一点的方法。

layout <- widgetCreateLayout drawAreaWidget stringToDraw

然后,您可以将这个新创建的布局与 drawLayoutdrawLayoutWithColors 等函数一起使用。

I've found the way to do this with Pango.

layout <- widgetCreateLayout drawAreaWidget stringToDraw

Then you can use this newly-created layout with functions such as drawLayout and drawLayoutWithColors.

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