我将黑色方块放在窗户上,但窗户没有变黑:
#include <FL/Enumerations.H>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Copy_Surface.H>
#include <FL/fl_draw.H>
int main()
{
Fl_Window* window = new Fl_Window(500, 500, "FLTK Test");
Fl_Copy_Surface *copy_surf = new Fl_Copy_Surface(window->w(), window->h()); // create an Fl_Copy_Surface object
copy_surf->set_current(); // direct windowraphics requests to the clipboard
fl_rectf(0, 0, window->w(), window->h(), FL_BLACK); // draw a white backwindowround
copy_surf->draw(window); // draw the window widwindowet in the clipboard
delete copy_surf; // after this, the clipboard is loaded
Fl_Display_Device::display_device()->set_current(); // direct windowraphics requests back to the display
window->end();
window->show();
return Fl::run();
}
我做错了什么?
这个问题已经有 4 个月了,但无论如何,以防万一其他人寻找解决方案:
Fl_Copy_Surface
是绘制离屏图像以供其他小部件使用的错误类型。copy_surf->draw(window);
会将 window
的内容绘制到 copy_surf
上,但窗口是空的。执行 OP 想要的操作 (AFAICT) 的正确方法是使用
Fl_Image_Surface
进行离屏绘图,并从该表面获取生成的图像以供以后使用。
以下代码执行此操作,并且适用于 FLTK 1.3(使用 1.3.9/git 测试)和 1.4.0(截至今天的 git 'master' 分支)。
建议使用“FLTK 1.4 方式”,但在 1.3.x 中不可用,因此下面的代码中存在区别。
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Image_Surface.H>
#include <FL/Fl_Box.H>
#include <FL/fl_draw.H>
#include <stdio.h> // printf()
#define FLTK_14 10400 // FLTK 1.4.0 API version
int main() {
int WW = 500, WH = 500;
// create an Fl_Image_Surface object
Fl_Image_Surface *surface = new Fl_Image_Surface(WW-80, WH-80);
// draw something into the image surface
#if (FL_API_VERSION >= FLTK_14) // FLTK 1.4
printf("Using FLTK 1.4.0 or higher (FL_API_VERSION = %d)\n",
FL_API_VERSION);
Fl_Surface_Device::push_current(surface);
fl_rectf(0, 0, WW-80, WH-80, FL_BLACK); // draw a black rectangle
Fl_Surface_Device::pop_current();
const char *group_label = "Fl_Group with black image below:";
#else
printf("Using the FLTK 1.3.x way (FL_API_VERSION = %d)\n",
FL_API_VERSION);
surface->set_current(); // FLTK 1.3
fl_rectf(0, 0, WW-80, WH-80, FL_BLUE); // draw a blue rectangle
Fl_Display_Device::display_device()->set_current(); // FLTK 1.3
const char *group_label = "Fl_Group with blue image below:";
#endif
// get the image from the surface
Fl_Image *img = surface->image();
delete surface; // no longer needed
if (!img) {
printf("Image could not be created.\n");
return 1;
}
printf("Image (w, h, d, ld) = %d, %d, %d, %d\n",
img->w(), img->h(), img->d(), img->ld());
// Create the GUI as usual, using the image as background of an Fl_Group
Fl_Window* window = new Fl_Window(WW, WH, "FLTK Fl_Image_Surface Test");
window->color(0xcce0ff); // light blue
Fl_Group* g = new Fl_Group(10, 10, WW-20, WH-20, group_label);
g->box(FL_FLAT_BOX);
g->color(FL_GREEN);
g->image(img);
g->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE | FL_ALIGN_IMAGE_BACKDROP);
Fl_Box* box = new Fl_Box(150, 150, 200, 100, "Box inside Fl_Group");
box->box(FL_UP_BOX);
box->color(FL_YELLOW);
g->end();
window->end();
window->show();
return Fl::run();
}
注意:图像
img
可以有多种使用方式。我选择将其设置为 Fl_Group
小部件的背景图像。所选颜色旨在查看不同的小部件、图像及其各自的尺寸。示例代码变得比必要的要长一些。第一部分创建图像,第二部分将其设置为组 g 的背景图像。