[erlang-questions] wxErlang question 2

Joe Armstrong <>
Mon Jul 3 10:48:35 CEST 2017


Brilliant thanks a lot - just what I needed to get me started

/Joe

On Mon, Jul 3, 2017 at 10:29 AM, Dan Gudmundsson <> wrote:
> Q1:
> Where is connect and arguments descrbed in the event handler,
> which most of the classes inherits from:
> See wx.hrl  and in http://erlang.org/doc/man/wxEvtHandler.html
>
> Then you will have to read which class sends which events..
>
> Q2: The erlang documentation (or lack there of) does not have the intention
> of learning
> you how to write gui's with wxWidgets only the differences in the erlang
> wrapper.
> So you will have to look for that information elsewhere, I have tried to
> write examples
> and you can also look at the observer code for inspiration.
>
> I have not read the book it is old but may still be good, I'm not a
> wxWidgets expert
> I just wrote the erlang wrapper.
>
> On Sat, Jul 1, 2017 at 5:19 PM Joe Armstrong <> wrote:
>>
>> Hello.
>>
>> I want to make a very simple graphics example in wxErlang
>> I want to make a "window" containing a rectangle
>>
>> Nothing else - this should *not* use the wx_object behaviour but the
>> raw wx interface.
>>
> See below
>
>>
>> I want to understand one thing at a time and not use abstractions layered
>> on top
>> of the raw interfaces
>
>
> The abstraction cheats, wx have special code for helping with the
> abstraction, so it's
> useful but here is what you want in 40 lines:
>
> -module(joe).
>
> -export([run/0]).
>
> -include_lib("wx/include/wx.hrl").
>
> run() ->
>     %% Start wx application
>     _ = wx:new(),
>     %% Create the OS window (called frame)
>     NoParent = wx:null(),         % This is the top level window, we have no
> parent
>     NoId = ?wxID_ANY,             % We can set an id for every widget,
>                                   % we don't need a specific id here
>     Frame = wxFrame:new(NoParent, NoId, "Hello Joe"),
>
>     %% Create a widget as background and drawing area belonging to the
> frame.
>     Panel = wxPanel:new(Frame),
>     White = {255,255,255},
>     wxWindow:setBackgroundColour(Panel, White),
>
>     %% Create a sizer, the sizer handles widgets placement and size
>     Sizer = wxBoxSizer:new(?wxVERTICAL),
>     wxSizer:add(Sizer, Panel, [{proportion, 1}, {flag, ?wxEXPAND}]),
>     wxFrame:setSizer(Frame, Sizer),
>
>     %% Listen to events
>     wxPanel:connect(Panel, paint, [{callback, fun redraw/2}]),
>     wxFrame:connect(Frame, close_window, [{skip, true}]),
>     %%      {skip, true} will let the event be handled by the default
> handler
>     %%      which will close the window
>
>     %% Show the frame
>     wxFrame:show(Frame),
>     loop(),
>     ok.
>
> loop() ->
>     receive
>         #wx{event=#wxClose{}} ->
>             ok;
>         Msg ->
>             io:format("~p:~p: Got ~p~n",[?MODULE, ?FUNCTION_NAME, Msg]),
>             loop()
>     end.
>
> %% This is called in a spawned process, so don't deadlock by
> %% calling the process above while that waits in calls to wx.
> redraw(#wx{obj=Panel}, _wxPaintEvent) ->
>     %% Create a drawing context on the Panel
>     DC = wxPaintDC:new(Panel),
>     %% You can draw on the DC (old way) with the functions in wxDC module
>
>     %% Or use a Graphics Contexts to have antialising and nicer graphics
>     GC = wxGraphicsContext:create(DC),
>     wxGraphicsContext:setBrush(GC, ?wxRED_BRUSH),
>     wxGraphicsContext:setFont(GC, ?wxITALIC_FONT, {255,255,255}),
>     {W,H} = wxPanel:getSize(Panel),
>     wxGraphicsContext:drawRoundedRectangle(GC, 35.0,35.0, W-70.0, H-70.0,
> 10.0),
>     wxGraphicsContext:drawText(GC, "Hello Joe", 60.0, 55.0),
>
>     %% Nothing is drawn until you destroy your drawing contexts
>     wxGraphicsObject:destroy(GC),
>     wxPaintDC:destroy(DC),
>     ok.
>
>
>
>>
>> _______________________________________________
>> erlang-questions mailing list
>> 
>> http://erlang.org/mailman/listinfo/erlang-questions


More information about the erlang-questions mailing list