2015-01-25 7 views
1

다음은 wxHaskell 노트북을 시작하는 하스켈 프로그램입니다.wxHaskell을 사용하여 노트북 변경 페이지 이벤트에서 새로 선택된 페이지 인덱스를 얻는 방법?

선택된 페이지의 색인을 가져올 수 있도록 페이지 변경 이벤트를 처리 할 수 ​​없다는 점을 제외하면 작동합니다. 나는 대신 이전 코드를 얻습니다 (아래 코드의 "문제"참조).

는 이것을 C wxNotebook Class Reference documentation의 행동 (대해 getSelection 섹션 참조)뿐만 아니라 wxBookCtrlEvent Class Reference documetnation의 "자세한 설명"섹션에 대한 경고가있다 그러나 나는 그것을 전혀 활용하는 방법을 이해하지 않습니다.

누구든지 새 페이지 색인이 사용자가 선택한 경우 (제목을 클릭하여) 새 페이지 색인을 가져 오는 노트북의 작동 코드를 보여줄 수 있습니까?

2 차 질문 : 인수 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

이 이상한 찾고 코드는 나를 위해 작동합니다. 나는 그것을 일본어 (?) 블로그에서 발견했다. 불행히도 더 이상 링크가 없습니다 ..

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