2011年5月8日日曜日

wxErlang wxMenuBar を表示させる

ErlangのGUIばかりやっている。
なんていったって、wxWidgetsがわからないのでwxErlangもわからない。

ソース:

-module(irc).
-export([start/0]).
-compile(export_all).
-include_lib("wx.hrl").

start() ->
    Wx = wx:new(),
    Frame = wx:batch(fun() -> create_window(Wx) end),
    wxWindow:show(Frame),
    loop(Frame),
    wx:destroy(),
    ok.

create_window(Wx)->
    Frame = wxFrame:new(Wx,
-1,
"IRC On wxErlang",
[{size,{300,200}}]),
    % Create Sizer
%    Panel = wxPanel:new(Frame),
%    Sz = wxStaticBoxSizer:new(?wxVERTICAL, Panel, [{label, "BoxLabel"}]),
%    wxPanel:setSizer(Panel,Sz),

    % Create MenuBar
    MB = wxMenuBar:new(),


    % Create Menu
    File    = wxMenu:new([]),
    wxMenu:append(File, ?wxID_PRINT, "&Print code"),
    wxMenu:appendSeparator(File),
    wxMenu:append(File, ?wxID_EXIT, "&Quit"),


    % Create Menu
    Help    = wxMenu:new([]),
    wxMenu:append(Help, ?wxID_HELP, "Help"),
    wxMenu:append(Help, ?wxID_ABOUT, "About"),


    % Append Menu on MenuBar
    wxMenuBar:append(MB, File, "&File"),
    wxMenuBar:append(MB, Help, "&Help"),


    % Set MenuBar on Frame
    wxFrame:setMenuBar(Frame,MB),

    % Create StatusBar
    wxFrame:createStatusBar(Frame,[]),
    wxFrame:setStatusText(Frame,"Hello World"),
 
    % connect
    wxFrame:connect(Frame, close_window),
    wxFrame:connect(Frame, command_menu_selected),

    Frame.

loop(Frame) ->
    receive
#wx{event=#wxClose{}} ->
   io:format("~p Closing window ~n",[self()]),
   ok = wxFrame:setStatusText(Frame, "Closing...",[]),
   wxWindow:destroy(Frame),
   ok;
Msg ->
   io:format("Got ~p ~n",[Msg]),
   loop(Frame)
    end.

wx.hrlはErlangのインストールディレクトリから検索をかけると見つかると思う。
それを実行モジュールと同一ディレクトリに配置する。


ステータスバーに「Hello World」が表示されるが、メニューを触ると消える。
なんだそれは!