wxErlang question 2

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

wxErlang question 2

Joe Armstrong-2
Hello.

I want to make a very simple graphics example in wxErlang.

I want to make a "window" containing a rectangle

I think this can be made from

   - a window containing
   - a canvas containing
   - a rectangle

(or should the window contain a graphicsContext????)

Nothing else - this should *not* use the wx_object behaviour but the
raw wx interface.

I want to understand one thing at a time and not use abstractions layered on top
of the raw interfaces

Cheers

/Joe
_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: wxErlang question 2

Dan Gudmundsson-2
Q1: 
Where is connect and arguments descrbed in the event handler,
which most of the classes inherits from:   

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 <[hidden email]> 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
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions

_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: wxErlang question 2

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

/Joe

On Mon, Jul 3, 2017 at 10:29 AM, Dan Gudmundsson <[hidden email]> 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 <[hidden email]> 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
>> [hidden email]
>> http://erlang.org/mailman/listinfo/erlang-questions
_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions
Loading...