如何用 wxWidget 和 erlang 在 window 中画一条线?

How draw a line in a window with wxWidget with erlang?

我尝试用 Erlang 中的 wxWidget 在 window 中画一条线。我试过了:

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

X Windows 编程并不是那么简单,我不太确定您希望如何使用 [50, 50] 之类的参数画一条线,这充其量只是一个点,并且一条线需要 2 个点,wxDC:drawLine 也需要知道在哪里画线,因为你可以有很多帧。

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

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

现在最重要的一点是,你不能只在框架上绘制,你必须注册一个回调来处理重新绘制。这是因为框架可以在任何时候被其他 windows 覆盖,或者因为您将其最小化、调整大小等。事实上,您不一定需要为所有这些情况处理 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:format 这样您就可以看到当您与 window 交互时它被调用,或者其他一些 window 与它交互,因为没有io:format 称它的效果有点不可见,除了确保 window.

中始终有一行

我还使用了绘图上下文。我不会在这里深入探讨,恐怕这只是您需要学习的有关 X Windows 编程的大量内容之一,但基本上,现在请注意,您需要有一个绘图上下文为你的框架,并用它来实际绘制。

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

wxFrame:show(Frame).

现在您应该会看到一个 window,其中有一条线。

告诉你如何做你想做的事,所以让我来解决关于错误的困惑 留言。

在 Erlang 中,名称相同但参数个数不同的函数被认为是独立的函数。参数的数量称为 "arity",有时表示为例如/2 在函数名称之后。

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