8

ダイアグラムライブラリとCairo/GTKバックエンドを使用してダイアグラムを描画する方法を学ぼうとしています。空白のウィンドウが表示されますが、図面がレンダリングされません。私は何が間違っているのですか?

module Main where

import Control.Monad.Trans (liftIO)
import Graphics.UI.Gtk
import Diagrams.Backend.Cairo
import Diagrams.Backend.Cairo.Gtk
import Diagrams.Prelude

main :: IO ()
main = do
  initGUI
  window <- windowNew
  canvas <- drawingAreaNew
  canvas `on` sizeRequest $ return (Requisition 1000 1000)
  set window [ containerBorderWidth := 10,
               containerChild := canvas ]
  canvas `on` exposeEvent $ renderFigure
  onDestroy window mainQuit
  widgetShowAll window
  mainGUI


renderFigure :: EventM EExpose Bool
renderFigure = do
   win <- eventWindow
   liftIO $ renderToGtk win $ toGtkCoords figure
   -- liftIO $ defaultRender win figure
   return True


figure :: Diagram Cairo R2
figure =  unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50

「defaultRender」を使用してみましたが(上記でコメントアウト)、タイプエラーが発生します。明らかに「win」は正しいタイプではありません。

ダイアグラムのチュートリアルとユーザーマニュアルを読みましたが、実際にはCairoバックエンドの使用方法を説明していません。

更新:レンダリングする楕円があります。「renderFigure」関数は次のようになります。

renderFigure :: DrawingArea -> EventM EExpose Bool
renderFigure canvas = do
   -- win <- eventWindow
   liftIO $ do
      -- diagramArea <- widgetGetDrawWindow canvas 
      -- renderToGtk diagramArea $ toGtkCoords figure
      defaultRender canvas figure
   return True

on渡されるDrawingAreaは、「 canvasexposeEvent...」設定で参照される「canvas 」です。

しかし、「renderToGtk」を使用して固定サイズの図をレンダリングすることはできません。

更新2: Joachim Breitnerの回答のおかげで、このような最小限のGTKダイアグラムプログラムが作成され、カットアンドペーストを楽しむ準備が整いました。

module Main where

import Control.Monad.Trans (liftIO)
import Graphics.UI.Gtk
import Diagrams.Backend.Cairo
import Diagrams.Backend.Cairo.Gtk
import Diagrams.Prelude

main :: IO ()
main = do
  initGUI
  window <- windowNew
  canvas <- drawingAreaNew
  canvas `on` sizeRequest $ return (Requisition 256 256)
  set window [ containerBorderWidth := 10,
               containerChild := canvas ]
  canvas `on` exposeEvent $ renderFigure
  onDestroy window mainQuit
  widgetShowAll window
  mainGUI


renderFigure :: EventM EExpose Bool
renderFigure = do
   win <- eventWindow
   liftIO $ renderToGtk win $ toGtkCoords figure
   return True


figure :: Diagram Cairo R2
figure =  unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50 # fc red  
4

2 に答える 2

6

最初のコードは実際に機能します。ただし、renderToGtkは画像を拡大縮小しないため、画像はかなり小さく、小さすぎてその線幅で表示できません。しかし、試してみてください

figure :: Diagram Cairo R2
figure =  unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50 # fc red

そしてそれは魅力のように機能します!

于 2012-08-09T18:04:42.197 に答える
2

最近のバージョンの図では、次を使用する必要があることに注意してください。

import Diagrams.Backend.Gtk

それ以外の

import Diagrams.Backend.Cairo.Gtk

figure :: Diagram Cairo

それ以外の

figure :: Diagram Cairo R2

結果は次のようになります。

module Main where

import Control.Monad.Trans (liftIO)
import Graphics.UI.Gtk
import Diagrams.Backend.Cairo
import Diagrams.Backend.Gtk
import Diagrams.Prelude

main :: IO ()
main = do
  initGUI
  window <- windowNew
  canvas <- drawingAreaNew
  canvas `on` sizeRequest $ return (Requisition 256 256)
  Graphics.UI.Gtk.set window [ containerBorderWidth := 10,
               containerChild := canvas ]
  canvas `on` exposeEvent $ renderFigure
  onDestroy window mainQuit
  widgetShowAll window
  mainGUI


renderFigure :: EventM EExpose Bool
renderFigure = do
   win <- eventWindow
   liftIO $ renderToGtk win $ toGtkCoords figure
   return True


figure :: Diagram Cairo
figure =  unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50 # fc red
于 2016-05-31T00:21:52.547 に答える