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

如何使用带有erlang的wxWidget在窗口中绘制线?,erlang,wxwidgets,Erlang,Wxwidgets,我试图用Erlang中的wxWidget在窗口中画一条线。我试过: wx:new(), Frame = wxFrame:new(wx:null(), ?wxID_ANY, "Hello"), wxDC:drawLine(50,50), 我得到一个错误: undefined function wxDC:drawLine/2 我阅读了这里的文档,但不明白如何做到这一点: X Windows编程并没有那么简单,我也不太确定您希望如何使用[50,50]之类的参数绘制一条线,这最多是一个点,一条线需要

我试图用Erlang中的wxWidget在窗口中画一条线。我试过:

wx:new(),
Frame = wxFrame:new(wx:null(), ?wxID_ANY, "Hello"),
wxDC:drawLine(50,50),
我得到一个错误:

undefined function wxDC:drawLine/2
我阅读了这里的文档,但不明白如何做到这一点:


X Windows编程并没有那么简单,我也不太确定您希望如何使用[50,50]之类的参数绘制一条线,这最多是一个点,一条线需要2个点,而wxDC:drawLine也需要知道在哪里绘制线,因为您可能有许多帧

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

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

因此,这并不是最有效的,因为它通过绘制一条线来响应任何绘制事件来执行重绘,而不考虑事件,但显然这将完成工作:

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,以便您可以看到在与窗口交互时调用它,或者其他窗口与它交互,因为没有io:format调用,它的效果有点不可见,除了确保窗口中始终有一行之外

我还使用了绘图上下文。我在这里不赘述,恐怕这只是你需要学习X Windows编程的一大堆东西之一,但基本上,现在要知道,你需要为你的框架创建一个绘制上下文,并使用它来实际绘制

最后一件事,如果您想看到它,您需要实际显示帧,如下所示:

wxFrame:show(Frame).
现在您应该看到一个窗口,其中有一行。

告诉您如何执行您想要执行的操作,因此让我来解决有关错误的困惑 信息

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

您的代码正在使用两个参数调用
wxDC:drawLine
,但您会收到一个错误,说明
wxDC:drawLine/2
未定义。在文档中,您可以看到所需的函数是
wxDC:drawLine/3
,它接受三个参数(第一个是绘制上下文,第二个和第三个是要在其之间绘制直线的点)

wxFrame:show(Frame).