如何使用带有erlang的wxWidget在窗口中绘制一条线?

时间:2015-12-15 23:31:50

标签: erlang wxwidgets

我尝试在Erlang中使用wxWidget在窗口中绘制一条线。我试过了:

wx:new(),
Frame = wxFrame:new(wx:null(), ?wxID_ANY, "Hello"),
wxDC:drawLine(50,50),

我收到错误:

undefined function wxDC:drawLine/2

我在这里阅读了文档,但我不明白该怎么做:

http://www.erlang.org/doc/man/wxDC.html#drawLine-3

2 个答案:

答案 0 :(得分:5)

X Windows编程并不是那么简单,我不太确定你是如何期望用[50,50]这样的参数绘制一条线,这最多只是一点,一条线需要2点,和wxDC:drawLine也需要知道在哪里画线,因为你可以有很多帧。

您可以创建一个这样的框架,是(使用-1而不是宏,因为我在这里使用shell):

Wx = wx:new().
Frame = wxFrame:new(wx:null(), -1, "Hello").

现在重要的一点,你不能只是画框,你必须注册一个回调来处理REdrawing。这是因为框架可以被任何其他窗口覆盖,或者因为你最小化它,调整它等等。实际上你不一定需要处理所有这些情况的REdraw,但你明白了。

所以,这不是最有效的,因为它通过绘制一条线来响应任何绘制事件,无论事件如何都执行重绘,但显然会完成这项工作:

wxFrame:connect(Frame, paint, [{callback,
    fun(_Evt, _Obj) ->
        io:format("paint~n"),
        DrawContext = wxPaintDC:new(Frame),
        wxDC:drawLine(DrawContext, {50, 50}, {150,100}),
        wxPaintDC:destroy(DrawContext)
        end
    }]).

我在那里添加了io:格式,这样你就可以看到它在与窗口交互时被调用,或者其他一些窗口与它交互,因为没有io:format调用它的效果有点不可见,除了确保窗口中始终有一条线。

我还使用了绘图上下文。我不会在这里讨论它,我担心这只是你需要了解的一些关于X Windows编程的东西,但基本上,现在要注意,你需要为你的框架绘制一个绘图上下文,并使用它来实际绘制。

最后一件事,你需要实际显示框架,如果你想看到它,就像这样:

wxFrame:show(Frame).

现在你应该看到一个带有一条线的窗口。

答案 1 :(得分:2)

Michael's answer告诉您如何做您想做的事情,让我解决有关错误的困惑 消息。

在Erlang中,具有相同名称但参数数量不同的函数被视为单独的函数。参数的数量称为“arity”,有时表示为例如函数名后的/2

您的代码使用两个参数调用wxDC:drawLine,但是您收到错误消息,指出wxDC:drawLine/2未定义。在文档中,您可以看到所需的函数是wxDC:drawLine/3,它有三个参数(第一个是绘制上下文,第二个和第三个是您想要绘制直线的点)。 / p>