You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fl_Copy_Surface无法在FLTK窗口中绘制内容的问题排查

FLTK窗口无法绘制黑色矩形的问题排查

你的代码核心错误是误用了Fl_Copy_Surface的用途:Fl_Copy_Surface是用来将图形内容复制到系统剪贴板的,不是直接用来绘制到窗口的。你的操作完全和窗口显示无关,自然看不到黑色矩形。

代码中的具体问题

  • 你创建Fl_Copy_Surface后绘制的内容只会被存入剪贴板,不会输出到窗口
  • copy_surf->draw(window)是把当前窗口的内容复制到剪贴板,属于反向操作
  • 窗口没有设置任何绘制回调,也没有在正确的上下文里执行绘制操作

修复后的代码

要在窗口中绘制黑色矩形,应该直接在窗口的绘制回调里操作:

#include <FL/Enumerations.H>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/fl_draw.H>

// 窗口的绘制回调函数
void window_draw_cb(Fl_Widget* w, void*) {
    fl_rectf(0, 0, w->w(), w->h(), FL_BLACK); // 在窗口范围内绘制黑色填充矩形
}

int main()
{
    Fl_Window* window = new Fl_Window(500, 500, "FLTK Test");
    window->callback(window_draw_cb); // 设置绘制回调
    
    window->end();
    window->show();
    return Fl::run();
}

另一种简化写法(直接在窗口上下文绘制)

如果不需要回调,也可以在窗口end()之前,将窗口设为当前绘制上下文后直接绘制:

#include <FL/Enumerations.H>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/fl_draw.H>

int main()
{
    Fl_Window* window = new Fl_Window(500, 500, "FLTK Test");
    
    window->set_current(); // 将窗口设为当前绘制上下文
    fl_rectf(0, 0, window->w(), window->h(), FL_BLACK);
    
    window->end();
    window->show();
    return Fl::run();
}

关于Fl_Copy_Surface的正确用法

如果你确实需要把窗口内容复制到剪贴板,应该在窗口显示后,在合适的时机(比如按钮点击)执行:

// 示例:点击按钮复制窗口内容到剪贴板
void copy_to_clipboard(Fl_Widget*, void* win) {
    Fl_Window* window = (Fl_Window*)win;
    Fl_Copy_Surface copy_surf(window->w(), window->h());
    copy_surf.set_current();
    window->draw(); // 将窗口内容绘制到Copy Surface
    // 销毁copy_surf时,内容自动存入剪贴板
}

内容的提问来源于stack exchange,提问作者Bone Fort

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:42:38