【问题标题】:SDL_Surface into GTK WindowSDL_Surface 进入 GTK 窗口
【发布时间】:2017-11-30 18:10:00
【问题描述】:

我目前正在我的 IT 学校制作一个项目,我使用 SDL(该项目是图像处理和类似的东西),目前我只是用 SDL 显示图像,没有界面(按钮等......)。我对 GTK 有一点了解,所以我想知道是否可以在 GTK 窗口中显示图像(这里是 SDL_Surface) 我做了一些研究,但没有什么很清楚...... 谢谢!

【问题讨论】:

  • GTK 通常与cairo 一起使用,而不是与 SDL 一起使用,但使用 SDL 的鼠标运动事件制作自己的按钮很简单。
  • 是的,但是窗口不如 GTK 窗口:/
  • @Zenor27 可能最稳定的方法是使用离屏渲染表面并将像素复制到 GTK 画布。虽然不是很快。其他方式是特定于平台的,例如看看stackoverflow.com/questions/47284284/…

标签: c image-processing gtk sdl


【解决方案1】:

使用 SDL 绘制小部件

使用 SDL 绘图功能绘制小部件(菜单、按钮等),并通过在事件发生期间跟踪光标位置(执行事件时光标在哪个项目上)来处理动作。 这变得非常复杂,最好使用现有的 GUI 库和一些简单的 hack。您可以找到绘制按钮的代码示例here

将 SDL 表面复制到目标 GUI 小部件

这涉及到将 sdl 表面的像素逐个像素(预定义的函数可能可用于执行相同操作,gdk_draw_rgb_image 在 gtk 的情况下)到目标 gui 小部件(在 GTK 的情况下可以是绘图区域) )。

将 SDL 窗口合并到 GUI 小部件中

在 X11 和 win32 系统中,每个窗口都有一个窗口 id,默认情况下 sdl 和 gtk 会有单独的窗口 id 导致两个不同的窗口,我们可以利用 SDL_CreateWindowFrom 函数为 sdl 使用单个窗口和 gtk,我们将在其中强制两个库使用单个窗口 ID。 你可以找到类似的问题here

GTK 插头和插座

Plug and Socket 支持将小部件从一个进程嵌入到另一个进程。 GTK 将创建一个套接字并将套接字 ID 传递给 SDL,SDL 将从该套接字 ID 创建窗口。

事件循环处理: 将 SDL 与 GTK 合并后,您可能会发现 gtk 和 sdl 有自己的事件循环,因此处理事件可能不如预期。要解决该问题,您可以处理 GTK 中的事件并使用 SDL_PushEvent 函数将事件传播到 SDL,反之亦然,以防您使用用户定义的事件。

.
.
static SDL_Event SDLevent;
switch(event->keyval)
{
    case GDK_KEY_m:
       SDLevent.type = SDL_KEYUP;
       SDLevent.key.keysym.sym = SDLK_m;
       SDL_PushEvent(&SDLevent);
       break;
       .
       .
       .

link 对上述方法有很好的解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多