我目前正在我的 IT 学校做一个项目,我使用 SDL(该项目是图像处理和类似的东西),目前我只是用没有界面(按钮等...)的 SDL 显示图像。我对 GTK 了解一点所以我想知道我是否可以将图像(这里是 SDL_Surface)显示到 GTK 窗口中 我做了一些研究,但没有什么很清楚...... 谢谢!
最佳答案
使用 SDL 绘制小部件
使用 SDL 绘图功能绘制小部件(菜单、按钮等)并通过跟踪事件发生期间的光标位置来处理操作(事件执行时光标位于哪个项目上)。 这变得非常复杂,最好使用带有一些简单技巧的现有 GUI 库。您可以找到绘制按钮的代码示例 here .
将 SDL 表面复制到目标 GUI 小部件
这涉及将 sdl 表面的逐个像素复制(预定义函数可能可用于执行相同的操作,gdk_draw_rgb_image 在 gtk 的情况下)到目标 gui 小部件(在 GTK 的情况下可以是 drawingArea ).
将 SDL 窗口合并到 GUI 小部件中
在 X11 和 win32 系统中,每个窗口都有一个窗口 ID,默认情况下,sdl 和 gtk 会有单独的窗口 ID,从而产生两个不同的窗口,我们可以利用 SDL_CreateWindowFrom 函数为 sdl 使用单个窗口和 gtk,我们将在其中强制两个库使用单个窗口 ID。 你可以找到类似的问题here .
GTK 插头和 socket
Plug 和 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对上述方法有很好的解释。
关于c - SDL_Surface 进入 GTK 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47579967/