{- 2012-05-16
ghc --make -optl-mwindows fileName.hs
option -mwindows is passed to the linker!
attempting to read from stdin with -mwindows may cause a runtime error
any output on stdout/stderr will be lost.
ghc links console app with stdout/stderr as default
-}
--import Graphics.Win32
import Graphics.Win32 hiding (messageBox, c_MessageBox) -- bugfix
import System.Win32.DLL
import Control.Exception (bracket)
import Foreign
import System.Exit
-- bugfix whole msg box
messageBox :: HWND -> String -> String -> MBStyle -> IO MBStatus
messageBox wnd text caption style =
withTString text $ \ c_text ->
withTString caption $ \ c_caption ->
failIfZero "MessageBox" $ c_MessageBox wnd c_text c_caption style
foreign import stdcall safe "windows.h MessageBoxW"
c_MessageBox :: HWND -> LPCTSTR -> LPCTSTR -> MBStyle -> IO MBStatus
main :: IO()
main = do
mainInstance <- getModuleHandle Nothing
hwnd <- createWindow_ 200 200 wndProc mainInstance
createButton_ hwnd mainInstance
messagePump hwnd
wndProc :: HWND -> WindowMessage -> WPARAM -> LPARAM -> IO LRESULT
wndProc hwnd wmsg wParam lParam
| wmsg == wM_DESTROY = do
sendMessage hwnd wM_QUIT 1 0
return 0
| wmsg == wM_COMMAND && wParam == 3 = do
messageBox nullPtr "You pressed me." "Haskell msg" 0
return 0
| otherwise = defWindowProc (Just hwnd) wmsg wParam lParam
createWindow_ :: Int -> Int -> WindowClosure -> HINSTANCE -> IO HWND
createWindow_ width height wndProc mainInstance = do
let winClass = mkClassName "Window Empty"
icon <- loadIcon Nothing iDI_APPLICATION
cursor <- loadCursor Nothing iDC_ARROW
bgBrush <- createSolidBrush (rgb 255 0 0)
registerClass (cS_VREDRAW + cS_HREDRAW, mainInstance, Just icon, Just cursor, Just bgBrush, Nothing, winClass)
w <- createWindow winClass "Window Empty" wS_OVERLAPPEDWINDOW Nothing Nothing (Just width) (Just height) Nothing Nothing mainInstance wndProc
showWindow w sW_SHOWNORMAL
updateWindow w
return w
createButton_ :: HWND -> HINSTANCE -> IO()
createButton_ hwnd mainInstance = do
hBtn <- createButton "Button test" wS_EX_CLIENTEDGE (bS_PUSHBUTTON + wS_VISIBLE + wS_CHILD) (Just 50) (Just 80) (Just 80) (Just 20) (Just hwnd) (Just (castUINTToPtr 3)) mainInstance
return()
messagePump :: HWND -> IO()
messagePump hwnd = allocaMessage $ \ msg ->
let pump = do
getMessage msg (Just hwnd) `catch` \ _ -> exitWith ExitSuccess
translateMessage msg
dispatchMessage msg
pump
in pump
原文鏈接here在Haskell中創建窗口的方法是什麼?零級
用法:複製/粘貼代碼,它保存在一個文件中,ghc --make -optl-mwindows fileName.hs
編譯,它會創造不錯的小窗口。它是基本的C/C++,如here。
這和下面兩個例子是僅有的原始 CreateWindow的代碼,我能找到的寫在Haskell :(
我rethoric問題:
據我所知,C++程序很好創建。來到功能,Winproc傳會調用它,如果一些win_msg是真的...
但是,它不是唯一的方式。很快足夠MS提出,在MFC類。而且我們有做的基本上是一回事事件偵聽器,而是直接測試win_msg的你創建/ addEven tListener,通過所需的功能,它的工作原理。
但是,代碼分組更好,更容易維護,它更像OO。什麼是Haskell的Haskellising winProc的方法?有可能有模仿addEventListener(evt,my_func)的方法。
該代碼的外觀如何?有多少種不同的解決方案?它可用嗎?而更重要的,是有一些像哈斯克爾(更好的)辦法,我一個不知道呢?
- 以何種方式,你可以使用這些代碼,改進了一下,創建類似wxWidgets的或GTK,但非常簡單,容易理解等
只是爲了解釋一些downvotes是大概是:「寫我的代碼爲我」是誰去別人的經典的紅色標誌問題這是一個忘恩負義的時間,你的問題甚至更進一步,「爲我寫代碼並記錄下來!」請:做你的功課,自己試試看,我更有可能嘗試幫助你糾正一個錯誤的嘗試,抓撓你的癢,而不是試圖抓撓你自己的癢。 –
是的,丹尼爾,你是對的:)看起來我真的很懶。我懶得知道它。互聯網顯然是用純粹的Haskell GUI示例和教程「填補」的。或者是? ;)我的問題似乎很簡單,任何人都可以回答:D如果這是真的,爲什麼Haskell沒有任何純粹的GUI教程? – CoR
圖形用戶界面庫和「快速啓動」教程:http://www.haskell.org/haskellwiki/WxHaskell/Quick_start – Tony