Я написал пример на C # из ссылка
sdl_renderer показывает цвет фона = Это нормально. Я действительно не понимаю, почему это не работает, если SDL2-CS встраивается в GtkSharp3 и не видит никаких фигур, текстов или изображений. Я не могу вспомнить, что MonoGame также имеет SDL2, но показывает только картинку. Я действительно хочу знать, как мне решить, если я использую SDL2-CS или мой собственный SDL2Sharp (это работает в процессе)
Я попробовал любые возможности делегата или дескриптора GLib.Idle.Add()
Если я использую GLib.Idle.Add(myIdle, 0);
, чем этоне будет показывать Gtk Window. Почему это не работает так, как будто это будет невидимо.
using System;
using System.Runtime.InteropServices;
using static SDL2.SDL;
namespace Gtk3_SDL2
{
class MainClass
{
private static IntPtr sdl_window;
private static IntPtr sdl_renderer;
private static Gtk.Window gtk_window;
private static Gtk.DrawingArea gtk_da;
private static IntPtr gdk_window;
private static IntPtr window_id;
// Pick 2 important public methods of libgtk-3.so and libgdk-3.so
[DllImport("libgtk-3.so.0")]
private extern static IntPtr gtk_widget_get_window(IntPtr widget);
[DllImport("libgdk-3.so.0")] // Window ( from X11/XLib or #XLibSHarp ) gdk_x11_window_get_xid(GDWindow window);
internal extern static IntPtr gdk_x11_window_get_xid(IntPtr window);
// #define GDK_WINDOW_XID() Make public in C#
private static IntPtr GDK_WINDOW_XID(IntPtr window)
{
return gdk_x11_window_get_xid(window);
}
static bool idle()
{
if (sdl_window.ToInt32() == 0)
{
sdl_window = SDL_CreateWindowFrom(window_id);
if(sdl_window == IntPtr.Zero)
{
Environment.Exit(0);
}
sdl_renderer = SDL_CreateRenderer(sdl_window, -1, SDL_RendererFlags.SDL_RENDERER_ACCELERATED);
if(sdl_renderer == IntPtr.Zero)
{
Environment.Exit(0);
}
}
else
{
SDL_SetRenderDrawColor(sdl_renderer, 255, 80, 0, 255);
SDL_RenderClear(sdl_renderer);
SDL_Rect rect = new SDL_Rect
{
x = 100, y = 100, w = 200, h = 200
};
IntPtr rectPtr = Marshal.AllocHGlobal(Marshal.SizeOf(rect));
Marshal.StructureToPtr(rect, rectPtr, false);
SDL_RenderDrawRect(sdl_renderer, rectPtr);
SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 255, 255);
SDL_RenderPresent(sdl_renderer);
}
return true;
}
static int Main(string[] args)
{
// Create Gtk+3
Gtk.Application.Init(string.Empty, ref args);
gtk_window = new Gtk.Window(Gtk.WindowType.Toplevel)
{
Title = "SDL2 in GtkSharp 3.x"
};
gtk_window.SetDefaultSize(400, 300);
gtk_da = new Gtk.DrawingArea
{
Margin = 10,
AppPaintable = true
};
gtk_da.Events = Gdk.EventMask.AllEventsMask;
gtk_window.Add(gtk_da);
gtk_window.DeleteEvent += delegate
{
Gtk.Application.Quit();
};
gtk_window.ShowAll();
// Embedding SDL2 in Gtk+3
gdk_window = gtk_widget_get_window(gtk_da.Handle);
window_id = GDK_WINDOW_XID(gdk_window);
/// Create SDL2
SDL_Init(SDL_INIT_EVERYTHING);
GLib.Idle.Add(idle);
Gtk.Application.Run();
SDL_Quit();
return 0;
}
}
}
Я ожидаю, что вывод sdl_renderer будет ничем, никаких фигур и текстов в sdl_renderer, пока Gtk Window показывает и внедряет окно sdl (SDL_CreateWindowFrom()
в Gtk.DrawingArea
или Gtk.GLArea
Обновление :
Я пытался вернуться вперед и назад, как Adobe Fireworks CS5 с уровнями, такими как фон, означает конец до настоящего средства отображения переднего плана, средства после очистки после рендеринга.
// Clean up renderer!
SDL_RenderClear(sdl_renderer);
// Draw Fillrect or shape Now It works . Yay. I am really stupid because
// I don't know before like back or front.
SDL_SetRenderDrawColor(sdl_renderer, 24, 24, 24, 255);
SDL_Rect rect = new SDL_Rect
{
x = 100, y = 100, w = 100, h = 100
};
IntPtr rectPtr = Marshal.AllocHGlobal(Marshal.SizeOf(rect));
Marshal.StructureToPtr(rect, rectPtr, false);
SDL_RenderFillRect(sdl_renderer, rectPtr);
// Background color
SDL_SetRenderDrawColor(sdl_renderer, 255, 80, 0, 255);
// Present renderer!
SDL_RenderPresent(sdl_renderer);
Показать результат
Он отлично работает как шарм. А как он работает с функциями GL или Vulkan? Вы уверены, что?
// Плохие новости: GtkSharp 2 и 3 аварийно завершают работу, когда вы добавляете кнопку в свое приложение. Это очень печально. Мне нужно переписать завершенный XLibSharp (это значит лучше, чем библиотека Steffen Bloetz X11, потому что нас не волнует TInt, TUintили TPixel и т. д.). И я покажу, что мой XLibSharp закончен, чем SDL2 Window, встраивается в окно XLib как SDL_CreateWindowFrom (draw_area), это draw_area позади Window -> window = windo X11w - -> draw_area является родителем дочернего элемента окна X11. Я попробую. Спасибо!