しかし、wxWidgetsの勉強が必要とわかる。
そこで、Dev-C++でGUIで作って、自動的にできるソースを参考に勉強する。
そして、wxErlangで同じ物を作った。
つまり、以下のURIで作成しているものをwxErlangで作った。
Getting started with wxWidgets in Windows - Tutorial : http://www.speqmath.com/tutorials/wxwidgets_getting_started/index.html
大変だった。
なんせwxErlangは参考になるサイトが見つからない。
ドキュメントにメンチ切りながらやった。
できたものは以下。
ソースは以下(Google Docにあるので、リンクからダウンロードなり保存なりしてください。)
https://docs.google.com/leaf?id=0B8Fi1kuQJgFrZDEzN2M3ZmYtZTAzMS00Y2I5LThlNjYtZTI4NWUwZjM5OWNl&hl=ja&authkey=COzP39cO
ソース全文も載せる。モジュール名とダイアログのタイトルがおかしいが、それはこちらの都合でそうなっている。
{Dialog,TxtName,TxtAge} = wx:batch(fun() -> create_window(Wx) end),
の部分はもっといいやり方があるだろうが、わからないので、一旦そのままに。明日資格試験なので、時間かけてられない。
create_windowでオブジェクトのポインタを3つも返すとか、ちょっとないなと。
(wx.hrlはErlangのインストールディレクトリに対して検索をかけて、探す。
それを本モジュールと同一ディレクトリに置く。)
-module(irc).
-export([start/0]).
-compile(export_all).
-include_lib("wx.hrl").
-define(wxID_LOG_TEXT_CTRL, 3000).
-define(wxID_BTNNAME,1005).
-define(wxID_txtName,1004).
-define(wxID_txtAge,1003).
-define(wxID_lblName,1002).
-define(wxID_lblAge,1001).
-define(wxID_lblSize,{20,150}).
start() ->
Wx = wx:new(),
{Dialog,TxtName,TxtAge} = wx:batch(fun() -> create_window(Wx) end),
wxWindow:show(Dialog),
loop(Dialog,TxtName,TxtAge),
wx:destroy(),
ok.
create_window(Wx)->
Dialog = wxDialog:new(Wx,
-1,
"IRC On wxErlang",
[{size,{300,200}}]),
% create button
%BtnPanel = wxPanel:new(Dialog),
BtnClick = wxButton:new(Dialog,?wxID_BTNNAME,[{label,"Click Here!"}]),
wxWindow:setSize(BtnClick,{133,128,126,25}),
% create label
LblName = wxStaticText:new(Dialog,?wxID_lblName,"name",[{pos,{11,29}}]),
%wxWindow:setSize(LblName,?wxID_lblSize),
LblAge = wxStaticText:new(Dialog,?wxID_lblAge,"age",[{pos,{11,75}}]),
%wxWindow:setSize(LblAge,?wxID_lblSize),
% create edit
TxtName = wxTextCtrl:new(Dialog,?wxID_txtName,[{pos,{77,29}},{size,{192,18}}]),
wxTextCtrl:appendText(TxtName,"<enter your name here>"),
TxtAge = wxTextCtrl:new(Dialog,?wxID_txtAge,[{pos,{78,79}},{size,{192,18}}]),
wxTextCtrl:appendText(TxtAge,"<enter your age here>"),
% connect
wxDialog:connect(Dialog, close_window),
wxButton:connect(BtnClick,command_button_clicked),
wxTextCtrl:connect(TxtName,command_text_updated),
wxTextCtrl:connect(TxtAge,command_text_updated),
% return
{Dialog,TxtName,TxtAge}.
loop(Dialog,TxtName,TxtAge) ->
receive
% Window Close Event
#wx{event=#wxClose{}} ->
io:format("~p Closing window ~n",[self()]),
%ok = wxFrame:setStatusText(Frame, "Closing...",[]),
wxWindow:destroy(Dialog),
ok;
% Button Click Event
#wx{event=#wxCommand{type = command_button_clicked}} ->
%io:format("Clicked ~n"),
btnButtonClick(Dialog),
loop(Dialog,TxtName,TxtAge);
% Write Name Event
#wx{event=#wxCommand{type = command_text_updated},obj = TxtName} ->
%io:format("Name update ~n"),
GetName = wxTextCtrl:getValue(TxtName),
put(?wxID_txtName,GetName),
loop(Dialog,TxtName,TxtAge);
% Write Age Event
#wx{event=#wxCommand{type = command_text_updated},obj = TxtAge} ->
%io:format("Age update ~n"),
GetAge = wxTextCtrl:getValue(TxtAge),
put(?wxID_txtAge,GetAge),
loop(Dialog,TxtName,TxtAge);
Msg ->
io:format("Got ~p ~n",[Msg]),
loop(Dialog,TxtName,TxtAge)
end.
btnButtonClick(Dialog) ->
% Get Name and Age
PutName = get(?wxID_txtName),
PutAge = get(?wxID_txtAge),
% Get Now Year
{Year,_,_} = date(),
% Calculate Year of Your Birthday
BirthDay = Year - list_to_integer(PutAge),
% Create Message
Info = ["Hello ",PutName,", welcome! ","So you are born in ",integer_to_list(BirthDay),"..."],
% Create MessageDialog
MDialog = wxMessageDialog:new(Dialog,Info,[{style,?wxOK}]),
% Show Dialog
wxDialog:showModal(MDialog),
% destroy
wxMessageDialog:destroy(MDialog),
ok.