erlang - 如何在带有erlang的wxWidget的窗口中画一条线?

标签 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

最佳答案

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

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

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

现在很重要的一点,你不能只在框架上绘图,你必须注册一个回调来处理重绘。这是因为框架可以在任何时候被其他窗口覆盖,或者因为您将其最小化、调整大小等。事实上,您不一定需要在所有这些情况下处理 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).

现在您应该会看到一个窗口,上面有一条线。

关于erlang - 如何在带有erlang的wxWidget的窗口中画一条线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34301451/

相关文章:

web-applications - Haskell 或 Erlang 用于约束解决类(class)调度程序

Erlang 脚本参数

c++ - 函数调用中创建的对象和传入的对象有什么区别

c++ - WxWidgets 问题 - 无法从 'const char [1]' 转换为 'wxString&w

websocket - Cowboy 中的 http 处理程序和 websocket 处理程序之间的通信

erlang - 为什么 Erlang 字符串不能用作 ets 表名?

erlang - 无法查询kubernetes(未经授权): endpoints is forbidden: User cannot list endpoints in the namespace

sqlite - 使用表中的更改更新 ListView

c++ - 如何使用所有库在 wxSmith ( Codeblocks ) 中编译程序?

python - 接下来我应该阅读什么代码来确定 wx._core.PyAssertionError 的原因