【发布时间】:2018-05-05 18:04:29
【问题描述】:
我有一个小项目,我尝试使用 gi-gtk 在窗口上绘图。
https://github.com/bigos/cairo-example/blob/b9480dc63d6fff3bc195d35c7422f193fc8ae7d4/src/Main.hs
我已经弄清楚如何让 gi-gtk 与 Cairo 一起工作。
https://github.com/haskell-gi/haskell-gi/wiki/Using-Cairo-with-haskell-gi-generated-bindings
但是我在获取 cairo 上下文时遇到了问题。在下面的代码中,我有两个事件。第一个事件工作正常。但是当我听到窗口对象上的按键时,我无法弄清楚如何获得在画布上绘制所需的 cairo 上下文。
win <- Gtk.windowNew WindowTypeToplevel
canvas <- Gtk.drawingAreaNew
Gtk.containerAdd win canvas
_ <- Gtk.onWidgetDraw canvas $ \context ->
renderWithContext context (updateCanvas canvas) >> pure True
_ <- Gtk.onWidgetKeyPressEvent win $ \x -> do
vvv <- Gdk.getEventKeyKeyval x
-- How do I draw on canvas here?
(putStrLn ("You have pressed key code " ++ (show vvv))) >> pure True
【问题讨论】:
-
我已经有一段时间没有编写 gtk 了。可能你只能从
onWidgetDrawdrwa,而你在小部件上使用Gtk.widgetQueueDraw 来触发绘图。这是有道理的,因为 UI 总是必须能够重绘窗口,所以无论你在onWidgetKeyPressEvent中绘制什么,如果可以的话,当用户调整窗口大小时都会丢失。