【问题标题】:SDL_Surface into GTK WindowSDL_Surface 进入 GTK 窗口
【发布时间】:2017-11-30 18:10:00
【问题描述】:
我目前正在我的 IT 学校制作一个项目,我使用 SDL(该项目是图像处理和类似的东西),目前我只是用 SDL 显示图像,没有界面(按钮等......)。我对 GTK 有一点了解,所以我想知道是否可以在 GTK 窗口中显示图像(这里是 SDL_Surface)
我做了一些研究,但没有什么很清楚......
谢谢!
【问题讨论】:
标签:
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 对上述方法有很好的解释。