如何使用wxHaskell获取笔记本更改页面事件时新选择的页面索引?

时间:2015-01-25 08:59:19

标签: haskell wxhaskell wxnotebook

下面是一个Haskell程序,它启动了一个wxHaskell笔记本。

它有效,除了我无法处理页面更改事件以获取所选页面的索引。我得到了前一个(请参阅下面的代码中的注释"问题")。

C wxNotebook Class Reference documentation中有关于此行为的警告(请参阅有关getSelection的部分)以及"详细说明" wxBookCtrlEvent Class Reference documetnation部分,但我完全不了解如何使用它。

有人可以告诉我一些笔记本的工作代码,当用户选择新页面时(通过点击其标题)获取新页面索引吗?

第二个问题:我不明白参数0旁边是什么 - ???。

提前谢谢!

module Main where

import Graphics.UI.WX 
import Graphics.UI.WXCore 

main :: IO ()
main = 
   start $
    do 

    f <- frame []
    nbk <- notebook f []

    pages <- sequence [ do
                        p <- panel nbk []
                        return $ tab ("Page "++show i) (container p $ label ("Page " ++ show i))
                    | i <- [0..3]]

    set f [layout :=  fill $ tabs nbk pages,clientSize := sz 300 100]



    let h event = case event of 
                    wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED -> 
                        do
                        i <- notebookGetSelection nbk -- PROBLEM: gives the OLD index
                        infoDialog f "Event otification" $ "Notebook selected page: " ++ show i
                        propagateEvent

    windowOnEvent nbk 
                  [wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED]
                  0 -- ???
                  h

1 个答案:

答案 0 :(得分:1)

这个看起来很奇怪的代码对我有用。我在日本(?)博客上找到了它。不幸的是我不再有这个链接..

import Graphics.UI.WX
import Graphics.UI.WXCore

import Foreign.Marshal.Alloc
import Foreign.Storable
import Foreign.Ptr
import Foreign.C.Types

import System.IO.Unsafe

main :: IO ()
main = start gui

gui :: IO ()
gui = do
    f  <- frame []
    nb <- notebook f []
    p1 <- panel nb []
    b1 <- button p1 [text := "*"]
    p2 <- panel nb []
    b2 <- button p2 [text := "!"]

    set nb [on click := (\pt -> onMouse nb pt >>= print)]
    set f [ layout := tabs nb [ tab "p1" $ container p1 $ widget b1
                              , tab "p2" $ container p2 $ widget b2]]


onMouse :: Notebook() -> Point -> IO Int
onMouse nb p = propagateEvent >> notebookHitTest nb p flag


{-# NOINLINE flag #-}
flag :: Ptr CInt
flag  =  unsafePerformIO flag'
  where flag' = do
             work <- malloc::IO (Ptr CInt)
             poke work (fromIntegral wxBK_HITTEST_ONPAGE)
             return work