如何不借助WinForms、WPF等框架使用SkiaSharp打开窗口并绘制内容
实现方案
核心逻辑是先通过轻量级跨平台窗口库(或系统原生API)创建无UI框架依赖的裸窗口,再将窗口的绘制表面与SkiaSharp的渲染上下文绑定,即可直接调用SkiaSharp的全量绘制API实现需求。
依赖选择
不需要引入WinForms/WPF等重型UI框架,推荐使用以下轻量级组件:
- 窗口创建:用Silk.NET.GLFW,跨平台封装了GLFW窗口API,支持Windows/macOS/Linux,不需要自己写系统级P/Invoke代码
- 绘制核心:SkiaSharp,自带所需的圆角矩形、渐变、阴影等所有绘制能力
实现步骤
- 安装对应NuGet包
直接在项目中安装以下包即可,不需要额外配置:SkiaSharpSilk.NET.GLFW- 非Windows平台补充安装对应原生资产:
SkiaSharp.NativeAssets.macOS/SkiaSharp.NativeAssets.Linux
- 初始化窗口与渲染上下文
核心代码逻辑示例:using Silk.NET.GLFW; using SkiaSharp; // 初始化GLFW Glfw glfw = Glfw.GetApi(); glfw.Init(); // 配置窗口属性,不使用额外UI组件 glfw.WindowHint(WindowHintClientApi.ClientApi, ClientApi.OpenGlApi); glfw.WindowHint(WindowHintOpenGlProfile.OpenGlProfile, OpenGlProfile.Core); glfw.WindowHint(WindowHintInt.ContextVersionMajor, 3); glfw.WindowHint(WindowHintInt.ContextVersionMinor, 3); // 创建窗口 var window = glfw.CreateWindow(800, 600, "SkiaSharp 绘制窗口", null, null); glfw.MakeContextCurrent(window); // 创建Skia GPU渲染上下文 var grContext = GRContext.CreateGl(); var renderTarget = new GRBackendRenderTarget(800, 600, 0, 8, new GRGlFramebufferInfo(0, SKColorType.Rgba8888.ToGlSizedFormat())); var surface = SKSurface.Create(grContext, renderTarget, GRSurfaceOrigin.BottomLeft, SKColorType.Rgba8888); var canvas = surface.Canvas; - 主消息循环与绘制
在窗口的主循环中直接调用Skia的绘制API即可:while (!glfw.WindowShouldClose(window)) { // 清屏 canvas.Clear(SKColors.White); // 绘制带阴影的渐变圆角矩形示例 var paint = new SKPaint { IsAntialias = true, Shader = SKShader.CreateLinearGradient( new SKPoint(0, 0), new SKPoint(200, 200), new[] { SKColors.Blue, SKColors.Purple }, SKShaderTileMode.Clamp ), ImageFilter = SKImageFilter.CreateDropShadow(5, 5, 10, 10, SKColors.Black.WithAlpha(128)) }; canvas.DrawRoundRect(new SKRect(100, 100, 300, 300), 20, 20, paint); // 提交绘制到屏幕 surface.Flush(); glfw.SwapBuffers(window); // 处理窗口事件 glfw.PollEvents(); } // 资源释放 surface.Dispose(); grContext.Dispose(); glfw.DestroyWindow(window); glfw.Terminate();
可选方案:原生API直接调用
如果不想引入GLFW依赖,可以直接通过P/Invoke调用对应系统的窗口创建API:
- Windows平台:调用user32.dll的
CreateWindowEx创建窗口,获取窗口HDC后绑定到SKSurface的光栅渲染目标 - macOS平台:调用AppKit的
NSWindow接口创建窗口,获取CALayer作为绘制目标 - Linux平台:调用X11的
XCreateWindow创建窗口,获取绘制上下文后绑定Skia渲染目标
该方案不需要第三方依赖,但需要自行处理多平台兼容逻辑。
内容的提问来源于stack exchange,提问作者lostceiling
相关产品推荐
相关产品推荐

