下面是一个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
答案 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