我尝试在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
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:format,这样你就可以看到它在与窗口交互时被调用,或者其他一些窗口与它交互,因为没有io:format调用它的效果有点不可见,除了制作确定你的窗口总是有一条线.
我还使用了绘制上下文.我不会在这里讨论它,我担心这只是你需要了解的一些关于X Windows编程的东西,但基本上,现在要注意,你需要为你的框架绘制一个绘图上下文,并使用它来实际绘制.
最后一件事,你需要实际显示框架,如果你想看到它,像这样:
wxFrame:show(Frame).
现在你应该看到一个带有线条的窗口.