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
相关产品推荐
相关产品推荐

