【问题标题】:How to get the newly selected page index upon a notebook changed page event with wxHaskell?如何使用 wxHaskell 在笔记本更改页面事件时获取新选择的页面索引?
【发布时间】:2015-01-25 08:59:19
【问题描述】:

下面是一个启动 wxHaskell 笔记本的 Haskell 程序。

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

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

【问题讨论】:

    标签: haskell wxhaskell wxnotebook


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多