最初の例として、ウィンドウにタイトルをつけ、ウィンドウのサイズを指定し、ウィンドウの表示位置をスクリーンの中央にします。位置を指定していない場合のデフォルト位置は、スクリーンの左上になります。
module Main where
import Graphics.UI.WX
import Graphics.UI.WXCore -- for frameCenter
main :: IO ()
main = start gui
gui :: IO ()
gui = do
f <- frame [text := "簡単な",
clientSize := sz 250 150]
frameCenter f
Haskell では、インデントを2スペースにする慣習があると思っていたのですが、4スペースも一般的みたいですね。ここでは4スペースにしています。インデントをタブにした場合、ghciでは警告が出て、ghcでは警告が出ないみたいです。
最初の例なのですべての行を説明しようと思います。wxHaskellを使ってみて、コード数が少なくて済むのには驚きました。
module Main where
メインモジュールであることを宣言しています。この宣言は省略することができますが、ここでは記述しました。
import Graphics.UI.WX
Graphocs.UI.WXは、wxHaskellで最も標準的で不可欠なライブラリです。この中には、start関数やframe関数が含まれています。
import Graphics.UI.WXCore
Graphics.UI.WXCoreライブラリには、ウィンドウを中央に表示するためのframeCenter関数が含まれています。
main :: IO ()
main関数の型定義をしています。他のプログミング言語と同様にwxHaskellでも、プログラムはmain関数から始まる決まりになっています。main関数は、引数を取らず、 IO () 型を返します。
main = start gui
main関数の実際の動作を定義しています。
start 関数は、プログラムのメインループを始めます。start 関数は、IO () を返す関数を引数に取らなければなりません。
gui :: IO ()
gui関数の型定義をしています。main関数と同様に、gui関数も引数を取らず、IO ()型を返しています。
gui = do
gui関数の実際の動作の定義を始めています。doは、ご存知の通り、式が複数続くことを表します。
f <- frame [text := "簡単な",
frame関数はフレーム(ウィンドウ)を作成します。引数には、ウィンドウに関する色々な設置値のリストを取ることができます。この行ではtext属性(ウィンドウのタイトル)に「簡単な」を設定しています。そして、frameで作成したウィンドウを、変数 f に束縛しています。
clientSize := sz 250 150]
clientSize属性はウィジェットのサイズを設定します。sz関数は引数の値のサイズオブジェクトを返します。
frameCenter f
frameCenter関数は、引数で指定したフレームをスクリーンの縦横中央に表示します。そして、frameCenter関数は、IO () 型を返します。結果として、gui関数は、特に何もしなくても、IO () を返すことになります。
Linux Mintでは、位置を指定しない場合でも、ウィドウは中央に表示されます。これはwxHaskellだけでなく、Linux Mintのデフォルトです。
次の例では、ウィンドウにボタンを表示し、そのボタンをクリックするとアプリケーションが終了するようにします。
module Main where
import Graphics.UI.WX
main :: IO ()
main = start gui
gui :: IO ()
gui = do
f <- frame [text := "ボタン",
clientSize := sz 270 150]
p <- panel f [clientSize := sz 500 500]
b <- button p [text := "終了",
position := pt 20 20,
on command := close f]
return ()
p <- panel f [clientSize := sz 500 500]
panel ウィジェット [リスト]で、パネルを第1引数のウィジェットの中に、[リスト]の属性を持って作っています。パネルとは、レイアウトのために使うコンテナーで、目には見えません。
通常、フレームは、その中のウィジェットが一つだけの場合、そのウィジェットをフレーム全体に広げます。今回の場合、ボタンがフレーム一杯に広がってしまっては困るので、まず、パネルを配置しています。
パネルにサイズを与えているのは、少し変ですが、wxHaskellの場合、フレームに配置されたウィジェットがフレーム一杯に広がるはのは、なぜか、フレームが再描画された時からです。最初にサイズを与えておかなければ、パネルの初期値は縦横がそれぞれ0pxのままです。それでは、その中に配置しているボタンが、アプリケーションの起動時には見えなくなってしまいます。パネルに与える初期値は、この場合、フレームより大きくても構いません。フレームが再描画されてからは、パネルのサイズは、フレームのコンテントエリアと同じサイズになります。
b <- button p [text := "終了",
ボタンをパネルの中に作っています。そしてボタンに表示される文字列は「終了」です。
position := pt 20 20,
ボタンの位置を指定しています。この位置とは、ボタンが配置されたパネルの中のx座標とy座標です。
on command := close f]
ボタンがクリックされた時に close 関数が呼び出されるように設定しています。close 関数は引数のウィジェットを閉じます。ここではフレームが閉じることになりますが、wxHaskellではメインウィンドウが閉じた時には、アプリケーションも終了します。
ツールチップ (Tooltip) は、ウィジェットの上にマウスカーソルを重ねると、表示される文字列です。
ツールチップを設定するには、ツールチップを表示させたいウィジェットの tooltip 属性に、表示させたい文字列を設定します。
module Main where
import Graphics.UI.WX
import Graphics.UI.WXCore
main :: IO ()
main = start gui
gui :: IO ()
gui = do
f <- frame [text := "ツールチップ", clientSize := sz 270 150,
tooltip := "フレームです"]
p <- panel f [clientSize := sz 500 500]
b <- button p [text := "ボタン", position := pt 20 20,
tooltip := "ボタンです"]
return ()
tooltip := "フレームです"]
フレームウィジェットの tooltip 属性に、「フレームです」という文字列を設定しています。
tooltip := "ボタンです"]
ボタンウィジェットの tooltip 属性に、「ボタンです」という文字列を設定しています。
Windowsでは、ボタンのツールチップは表示されますが、フレームのツールチップは表示されません。macOSでは、ボタンとフレームの両方のツールチップが表示されます。